Как я могу использовать переменные среды на AWS Lambda?
Я пишу приложение, которое я хочу запустить как функцию AWS Lambda, но также придерживаюсь инструкций для приложений Twelve-Factor. В частности, Часть III. Config, который требует использования переменных окружения для конфигурации.
Однако, я не могу найти способ установить переменные окружения для экземпляров AWS Lambda. Может кто-то указать мне верное направление?
Если невозможно использовать переменные среды, вы можете рекомендовать способ использования переменных окружения для локальной разработки и преобразовать их в действительную систему конфигурации, к которой можно получить доступ, используя код приложения в AWS.
Спасибо.
Ответы
Ответ 1
По состоянию на 18 ноября 2016 года AWS Lambda поддерживает переменные среды.
Переменные окружения могут быть указаны как с помощью консоли AWS, так и с AWS CLI. Вот как вы бы создали Лямбду с переменной среды LD_LIBRARY_PATH
с помощью AWS CLI:
aws lambda create-function \
--region us-east-1
--function-name myTestFunction
--zip-file fileb://path/package.zip
--role role-arn
--environment Variables={LD_LIBRARY_PATH=/usr/bin/test/lib64}
--handler index.handler
--runtime nodejs4.3
--profile default
Ответ 2
Возможно, функция "пользовательских переменных окружения" node -lambda будет решать ваши проблемы:
https://www.npmjs.com/package/node-lambda
https://github.com/motdotla/node-lambda
"AWS Lambda не позволяет вам устанавливать переменные среды для вашей функции, но во многих случаях вам нужно настроить свою функцию с помощью безопасных значений, которые вы не хотите проверять в управлении версиями, например, строку подключения к DB или ключ шифрования. Используйте образец файла deploy.env в сочетании с флагом -configFile, чтобы установить значения, которые будут добавлены к вашей скомпилированной функции Lambda в качестве переменных среды process.env, прежде чем они будут загружены на S3."
Ответ 3
Невозможно настроить переменные env для выполнения лямбда, так как каждый вызов не пересекается и информация о состоянии не сохраняется. Однако есть способы добиться того, чего вы хотите.
AWS credentials
- вы можете избежать сохранения этого в переменных env. Вместо этого предоставите привилегии вашей роли LambdaExec
. Фактически AWS рекомендует использовать роли вместо учетных данных AWS.
Database details
: Одно предложение - сохранить его в хорошо известном файле в приватном ведре. Lambda может загрузить этот файл при его вызове, прочитать содержимое, которое может содержать сведения о базе данных и другую информацию. Поскольку ведро является закрытым, другие не могут получить доступ к файлу. Роль LambdaExec
требует привилегий IAM для доступа к частному ведру.
Ответ 4
У нас также было это требование для нашей лямбда-функции, и мы "решили" это, создав файл env на нашей платформе CI (в нашем случае это CircleCI). Этот файл входит в архив, который развертывается в Lambda.
Теперь в вашем коде вы можете включить этот файл и использовать переменные.
script, который я использую для создания JSON файла из переменных окружения CircleCI:
cat >dist/env.json <<EOL
{
"CLIENT_ID": "$CLIENT_ID",
"CLIENT_SECRET": "$CLIENT_SECRET",
"SLACK_VERIFICATION_TOKEN": "$SLACK_VERIFICATION_TOKEN",
"BRANCH": "$CIRCLE_BRANCH"
}
EOL
Мне нравится этот подход, потому что таким образом вам не нужно включать переменные среды в ваш репозиторий.
Ответ 5
AWS просто добавила поддержку настройки функций Lambda через параметры среды.
Посмотрите здесь