Экспресс / Безсерверный экспресс /lambda /Secrets Manager — Экспорт переменной из функции —

#amazon-web-services #express #aws-lambda #aws-secrets-manager

#amazon-веб-службы #экспресс #aws-lambda #aws-secrets-manager

Вопрос:

Схема: Я пытаюсь перенести приложение Express на lambda с помощью AWS Serverless Express, и мне нужно получить доступ к Secrets Manager, в котором хранятся учетные данные для MongoDB Atlas.

Проблема: Я успешно восстановил свой секрет, однако я не могу «экспортировать» секрет для оставшейся части бессерверного приложения AWS 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=trueamp;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, а затем устанавливает
сервер в функцию createServer с идентификатором SecretId. почему это
используя эту переменную, я не уверен.

 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);
    });
};
  

Ответ №1:

Хорошо, итак, мне удалось решить эту проблему, и я хотел обновить ее на случай, если у кого-то еще может возникнуть этот вопрос.

Следующие документы содержат «лучшие практики» Lambda. По ссылке — они в основном предоставляют формат, который следует использовать при использовании exports.handlerhttps://docs.aws.amazon.com/lambda/latest/dg/best-practices.html

Однако есть предостережение — поскольку я использую AWS Serverless Express — для этого требуется создание события Promise.resolve create server. Из-за этого — вы НЕ можете использовать функцию promise из функции AWS Serverless Express exports.handler. Это потому, что она уже содержит обещание.разрешить — так что это просто вызывает путаницу, если есть два обещания.

 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=trueamp;w=majority`;
        var serverjstest = app.abetatestfunc (uri2);
        var dbfiletest = dbfile.dbfiletest (uri2);
      
    });


};
  

В моем случае, поскольку я использую Express, у меня есть много разных файлов *.js. Чтобы выполнить функции, я должен module.экспортирует файлы JS, как вы можете видеть выше (dbfile.debfiletest(uri2)). После этого мне нужно поместить мою новую псевдофункцию поверх существующего кода, также с помощью ввода / переменной uri2. ie:

 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.обработчик вызывается шлюзом api.

Надеюсь, это поможет. Я уверен, что есть 100 различных способов сделать это приятнее / лучше / лучше работать — но я еще не там. Я как раз на стадии «давайте сделаем это функциональным».