#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 различных способов сделать это приятнее / лучше / лучше работать — но я еще не там. Я как раз на стадии «давайте сделаем это функциональным».