web-dev-qa-db-fra.com

Comment utiliser des variables d'environnement sur AWS Lambda?

J'écris une application que je veux exécuter en tant que fonction AWS Lambda mais que je respecte également les instructions de l'application Twelve-Factor. En particulier Partie III. Config qui nécessite l'utilisation de variables d'environnement pour la configuration.

Cependant, je ne trouve pas de moyen de définir des variables d'environnement pour les instances AWS Lambda. Est-ce que quelqu'un peut-il me montrer la bonne direction? 

S'il n'est pas possible d'utiliser des variables d'environnement, pouvez-vous recommander un moyen de les utiliser pour le développement local et de les transformer en un système de configuration valide accessible à l'aide du code d'application dans AWS.

Merci.

20
dannybrown

À compter du 18 novembre 2016, AWS Lambda prend en charge les variables d'environnement .

Les variables d'environnement peuvent être spécifiées à la fois à l'aide de la console AWS et de l'AWS CLI. Voici comment créer un Lambda avec une variable d'environnement LD_LIBRARY_PATH à l'aide de l'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
15
sergio

Peut-être que la fonctionnalité 'variables d'environnement personnalisées' de node-lambda répondrait à vos préoccupations: 

https://www.npmjs.com/package/node-lambda
https://github.com/motdotla/node-lambda

"AWS Lambda ne vous permet pas de définir des variables d'environnement pour votre fonction, mais vous devrez souvent configurer votre fonction avec des valeurs sécurisées que vous ne souhaitez pas archiver dans le contrôle de version, par exemple une chaîne de connexion à la base de données ou une clé de cryptage. Utilisez le fichier exemple deploy.env en combinaison avec l’indicateur --configFile pour définir les valeurs qui seront ajoutées au préfixe à votre fonction Lambda compilée en tant que variables d’environnement process.env avant le téléchargement vers S3. "

5
Tom

Il n'y a aucun moyen de configurer des variables env pour l'exécution lambda car chaque appel est disjoint et aucune information d'état n'est stockée. Cependant, il existe des moyens d'atteindre ce que vous voulez.

AWS credentials - vous pouvez éviter de stocker cela dans des variables env. Accordez plutôt les privilèges à votre rôle LambdaExec. En fait, AWS recommande d'utiliser des rôles plutôt que des informations d'identification AWS.

Database details: Une suggestion est de le stocker dans un fichier bien connu dans un compartiment privé. Lambda peut télécharger ce fichier lorsqu'il est appelé, lire le contenu pouvant contenir les détails de la base de données et d'autres informations. Le compartiment étant privé, les autres utilisateurs ne peuvent pas accéder au fichier. Le rôle LambdaExec a besoin de privilèges IAM pour accéder au compartiment privé.

4
helloV

AWS vient d'ajouter la prise en charge de la configuration des fonctions Lambda via les paramètres d'environnement . Regardez ici

2
Froyke

Nous avions également cette exigence pour notre fonction Lambda et nous l'avons "résolue" en générant un fichier env sur notre plateforme CI (dans notre cas, il s'agit de CircleCI). Ce fichier est inclus dans l'archive déployée sur Lambda . Désormais, dans votre code, vous pouvez inclure ce fichier et utiliser les variables.

Le script que j'utilise pour générer un fichier JSON à partir de variables d'environnement CircleCI est:

cat >dist/env.json <<EOL
{
"CLIENT_ID": "$CLIENT_ID",
"CLIENT_SECRET": "$CLIENT_SECRET",
"SLACK_VERIFICATION_TOKEN": "$SLACK_VERIFICATION_TOKEN",
"BRANCH": "$CIRCLE_BRANCH"
}
EOL

J'aime cette approche car de cette manière, vous n'avez pas à inclure de variables spécifiques à l'environnement dans votre référentiel.

1
Wim Mostmans