Express / AwsServerlessExpress / lambda / Secrets Manager-从函数导出变量-

问题描述

概述:我正在尝试使用以下方法将快速应用程序移植到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种不同的方法可以使它更好/更好/更好地运行-但我还没有。我只是处于“让它发挥作用”的阶段。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...