问题描述
概述:我正在尝试使用以下方法将快速应用程序移植到lambda AWS Serverless Express,我需要访问Secrets Manager 存储MongoDB Atlas的凭据。
问题:我已经成功检索了我的秘密,但是我不能 “导出”其余AWS Serverless Express的秘密 应用程序。
我尝试过的:解析和更新环境变量 modules.export.variableName(尝试仅使用 秘密)modules.export.functionName(尝试导出整个 函数)返回一个数组(将函数的结果返回到 数组并从数组调用)
应用程序结构:lambda.js server.js /db/db.js控制器: 塔塔共有6个控制器
lambda.js
'use strict'
const awsServerlessExpress = require('aws-serverless-express');
const app = require('./server');
const AWS = require('aws-sdk');
require('dotenv').config();
const secretsManager = new AWS.SecretsManager({
region: 'us-east-1' });
const AWS_SECRET = process.env.AWS_SECRET;
let server;
let uri
var password
module.exports.uri3;
let uri2;
const createServer = async (callback) => {
const secret = await secretsManager.getSecretValue({SecretId: AWS_SECRET}).promise();
const secretBackup = JSON.parse(secret.SecretString)
Object.assign(process.env,JSON.parse(secret.SecretString));
module.exports.exporteduserName = secretBackup.username;
console.log('undernasdnfkasdf ' + this.exporteduserName) //This returns the correct value
password = secretBackup.password;
//console.log('this is what is stored in userName ' + userName)
console.log('this is what is stored in password ' + password) //This returns the correct value
uri2 = `mongodb+srv://${process.env.username}:${process.env.password}@cluster0.3jrug.mongodb.net/lamb?retryWrites=true&w=majority`; //This returns the correct value
module.exports.uri3 = uri2
console.log(uri2)
server = awsServerlessExpress.createServer(app,null,binaryMimeTypes)
return server
}
console.log('this is uri3 ' + this.uri3) //undefined
console.log('outside function ' + this.exporteduserName) //undefined
const binaryMimeTypes = [
'application/javascript','application/json','application/octet-stream','application/xml','font/eot','font/opentype','font/otf','image/jpeg','image/png','image/svg+xml','text/comma-separated-values','text/css','text/html','text/javascript','text/plain','text/text','text/xml'
]
我怀疑我的问题在这里(下)-但是我不完全知道这是什么 代码呢。似乎解决了promise函数,然后设置 服务器到带有SecretId的createServer函数。为什么 我不确定使用此变量。
exports.handler = (event,context) => {
Promise.resolve(server || createServer({SecretId: AWS_SECRET},)).then((server) => {
awsServerlessExpress.proxy(server,event,context);
//console.log('this is what i have stored ' + process.env.AWS_SECRET);
});
};
解决方法
好,所以我设法解决了这个问题,并想在其他人可能有此问题的情况下进行更新。
以下文档记录了Lambda的“最佳实践”。在链接中-它们主要提供了与exports.handler一起使用的格式。 https://docs.aws.amazon.com/lambda/latest/dg/best-practices.html
但是有一个警告-因为Im使用AWS Serverless Express-它需要创建Promise.resolve create server事件。因此,您无法在AWS Serverless Expressexports.handler函数内部使用promise函数。这是因为它已经包含一个Promise.resolve-因此,如果有两个诺言,只会引起混乱。
exports.handler = (event,context,callback) => {
Promise.resolve(server || createServer({SecretId: AWS_SECRET})).then((server) => {
awsServerlessExpress.proxy(server,event,context);
context.callbackWaitsForEmptyEventLoop = false;
var uri2 = `mongodb+srv://${process.env.username}:${process.env.password}@clusterX.XYYYYY.mongodb.net/lamb?retryWrites=true&w=majority`;
var serverjstest = app.abetatestfunc (uri2);
var dbfiletest = dbfile.dbfiletest (uri2);
});
};
就我而言-自从我使用Express以来,我有许多不同的* .js文件。为了执行功能-如上所示,我必须module.export JS文件(dbfile.debfiletest(uri2))。之后-我需要将新的伪函数放在uri2输入/变量的现有代码之上。即:
function abetatestfunc(uri2) {
console.log('this is a test call from within server.js to see if we can get uri2 here ' + uri2)
uri = uri2
console.log('server.js value of uri ' + uri)
//your code goes here
}
以这种方式-该函数将与exports一起调用。handler被api网关调用。
希望有帮助。我确定有100种不同的方法可以使它更好/更好/更好地运行-但我还没有。我只是处于“让它发挥作用”的阶段。