Comment transmettre une variable d'environnement personnalisée sur Amazon Elastic Beanstalk (AWS EBS)?

121

Le texte de présentation d'Amazon Elastic Beanstalk dit:

Elastic Beanstalk vous permet «d'ouvrir le capot» et de conserver un contrôle total ... même de transmettre des variables d'environnement via la console Elastic Beanstalk.

http://aws.amazon.com/elasticbeanstalk/

Comment passer d'autres variables d'environnement en plus de celle de la configuration Elastic Beanstalk?

Ben
la source
4
vous voudrez peut-être envisager de modifier la réponse acceptée à ce sujet
philipp

Réponses:

137

En guise d'avertissement à tous ceux qui utilisent le .ebextensions/*.configchemin: de nos jours, vous pouvez ajouter, modifier et supprimer des variables d'environnement dans l'interface Web d'Elastic Beanstalk.

Les variables se trouvent sous Configuration → Configuration logicielle:

Propriétés de l'environnement

Créer les vars .ebextensionscomme dans la réponse d'Onema fonctionne toujours.

Cela peut même être préférable, par exemple si vous déployez plus tard dans un autre environnement et avez peur d'oublier de les définir manuellement, ou si vous êtes d'accord pour valider les valeurs dans le contrôle de code source. J'utilise un mélange des deux.

citron vert
la source
2
Vous pouvez également enregistrer la configuration et lancer le nouvel environnement à l'aide de la configuration.
Michael Gallego
1
Oui, je dirais que c'est la meilleure option. Je ne cesse de l'oublier et lance de nouveaux environnements bon gré mal gré. :)
lime le
1
@dingdong: oui, et en particulier vous pouvez y accéder dans votre application. Par exemple, dans Rails ENV["CUSTOM_ENV"]reviendrait "something-something".
lime
3
Si j'ajoute de nouvelles propriétés ou modifie la valeur d'une propriété, sont-elles immédiatement disponibles, ont-elles besoin de redémarrer quelque chose, etc.? J'ai récemment modifié la taille d'un groupe d'autoscaling et AWS a mis fin à presque toutes les 40 de nos instances et en a créé 45 nouvelles. Je ne veux pas que cela se produise si j'ajoute une nouvelle propriété à un environnement existant. Des idées?
Engineer81
4
Méfiez-vous des changements récents. Selon cette réponse , ils ne sont pas passés en tant que variables d'environnement. Ils ne sont transmis que comme propriétés système
James
107

Seules 5 valeurs sont limitées ou vous souhaiterez peut-être avoir un nom de variable d'environnement personnalisé. Vous pouvez le faire en utilisant les fichiers de configuration. Créez un répertoire à la racine de votre projet appelé

.ebextensions /

Ensuite, créez un fichier appelé environment.config (ce fichier peut être appelé n'importe quoi mais il doit avoir l'extension .config) et ajoutez les valeurs suivantes

option_settings:
  - option_name: CUSTOM_ENV
    value: staging

Après avoir déployé votre application, vous verrez cette nouvelle valeur sous Détails de l'environnement -> Modifier la configuration -> Conteneur

pour plus d'informations, consultez la documentation ici: http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers-ec2.html#customize-containers-format-options

Mettre à jour

Pour éviter de valider les valeurs de votre référentiel telles que les clés d'API, les secrets, etc., vous pouvez définir une valeur d'espace réservé.

option_settings:
  - option_name: SOME_API_KEY
    value: placeholder-value-change-me

Plus tard, vous pouvez accéder au panneau d'administration AWS (Détails de l'environnement -> Modifier la configuration -> Conteneur) et y mettre à jour les valeurs. D'après mon expérience, ces valeurs ne changent pas après les déploiements ultérieurs.

Mise à jour 2 Comme @Benjamin l'a déclaré dans son commentaire, depuis le déploiement du nouveau look and feel le 18 juillet 2013, il est possible de définir n'importe quel nombre de variables d'environnement directement depuis la console:

Configuration > Software Configuration > Environment Properties

Onema
la source
2
@Onema - Comment gérez-vous l'ajout de nouvelles clés dans le fichier de configuration? Le fait de pousser le fichier mis à jour mettra-t-il à jour toutes les clés précédemment définies avec des valeurs d'espace réservé?
Tabrez
1
@Tabrez, toutes les clés précédemment définies conserveront leurs valeurs.
Anarchtica
2
Désolé @Tabrez, je n'ai pas eu l'occasion de me renseigner avant. Pour ajouter à la réponse Anarchtica, j'ai effectué un test et j'ai découvert que si vous utilisez un espace réservé, puis mettez à jour les valeurs dans AWS Console en utilisant des clés réelles, puis vous mettez à jour vos valeurs d'espace réservé dans le fichier de configuration et poussez, les clés ne seront pas remplacé par le nouvel espace réservé. Je trouve cela un peu étrange, mais je pense que c'est un comportement bienvenu car vous serez obligé de gérer toutes les valeurs d'env dans la console.
Onema
7
@Anarchtica, j'ai posé des questions sur ce comportement au support AWS. Ils ont dit qu'une fois que vous mettez à jour les valeurs dans la console, elles prendront la priorité et vous ne pourrez plus du tout les modifier à l'aide de fichiers de configuration. Si vous ne modifiez jamais les valeurs dans la console, toutes les modifications apportées au fichier de configuration seront mises à jour.
Onema le
1
Est-ce que quelqu'un sait comment utiliser les variables d'environnement dans votre fichier de configuration pour container_commands? J'ai essayécommand: "nrsysmond-config --set license_key={$NR_INSTALL_KEY}"
colllin
29

Dans l'AMI Tomcat8 Java8 2016, ElasticBeanstalk ne parvient pas à définir les variables d'environnement à partir de la configuration Web. Ils définissent vraiment les propriétés jvm -D à la place.

- "Les propriétés suivantes sont transmises à l'application en tant que variables d'environnement. En savoir plus."

Cette déclaration est incorrecte pour l'ami Java Tomcat. Amazon ne les définit pas comme variables d'environnement. Ils sont définis comme des propriétés système transmises sur la ligne de commande à Tomcat en tant que propriété -D pour jvm. La méthode en Java pour obtenir des variables d'environnement n'est pas la même pour obtenir une propriété. System.getenv contre System.getProperty

J'ai ssh'd dans la boîte et vérifié que la variable d'environnement n'a jamais été définie. Cependant, dans les journaux tomcat, je peux voir que la propriété -D est définie.

J'ai changé mon code pour vérifier les deux emplacements maintenant comme solution de contournement.

Ed J
la source
Et pour .Net, ils sont insérés dans votre fichier web.config plutôt que placés dans des variables d'environnement, selon stackoverflow.com/a/33465765/1991614 . Le problème est encore plus confus, car ils ne sont pas insérés si cette clé existe déjà dans web.confg :(
bitcoder
Tu es mon héros! Merci d'avoir remarqué le mappage de propriété -D dans Tomcat 8.
shadowhorst
1
Pour ceux comme moi qui ont vraiment besoin de définir des variables d'environnement système, vous pouvez récupérer ces propriétés d'environnement à l'aide d'un script beanstalk intégré. Voir cette réponse pour plus d'informations: serverfault.com/a/770736/292741
BoomShadow
1
Amazon Linux 2017.03 v2.5.4 with Java8ne définit pas non plus env.
Sanoob du
2
Vous ne pouvez pas SSH dans la boîte et voir les variables. Ils sont définis uniquement dans le shell qui a exécuté votre application. docs.aws.amazon.com/elasticbeanstalk/latest/dg/… In general, however, environment properties are passed only to the application and can't be viewed by connecting an instance in your environment and running env. Vos variables ne sont pas définies dans un script de connexion comme .bashrc. Cependant, vous avez raison Les variables Tomcat sont transmises en tant que propriétés. (Voir le haut de la page liée.)
Chloe
18

AWS interprétera les chaînes de modèle CloudFormation dans vos variables d'environnement. Vous pouvez l'utiliser pour accéder aux informations sur votre environnement EB dans votre application:

Dans l'interface Web AWS, les éléments suivants seront évalués comme le nom de votre environnement (notez les coches inverses):

`{ "Ref" : "AWSEBEnvironmentName" }`

Ou, vous pouvez utiliser .ebextensions/*.configet encapsuler le modèle CloudFormation dans des graduations inverses (`):

{
  "option_settings": [
    {
      "namespace": "aws:elasticbeanstalk:application:environment",
      "option_name": "ENVIRONMENT_NAME",
      "value": "`{ \"Ref\" : \"AWSEBEnvironmentName\" }`"
    }
  ]
}
George Brassey
la source
3
Obscur, mais exactement ce que je cherchais.
Eric Walker
1
Existe-t-il une documentation à ce sujet? Je n'arrive pas à le trouver.
yangmillstheory
@yangmillstheory docs.aws.amazon.com/elasticbeanstalk/latest/dg/…
mike mckechnie
12

Vous pouvez également utiliser l'interface de ligne de commande Elastic Beanstalk pour définir des variables d'environnement.

Pour définir une variable d'environnement: eb setenv FOO=bar

Pour afficher les variables d'environnement: eb printenv

trex
la source
9

Détails de l'environnement -> Modifier la configuration -> Conteneur

entrez la description de l'image ici

Ben
la source
5

Cela semble être le seul moyen de définir des ENV avec des valeurs dynamiques dans beanstalk. J'ai trouvé une solution de contournement qui fonctionne pour ma configuration multi-docker:

1) Ajoutez ceci à votre Dockerfile avant de créer + télécharger dans votre référentiel ECS:

CMD eval `cat /tmp/envs/env_file$`; <base image CMD goes here>;

2) Dans votre fichier Dockerrun.aws.json, créez un volume:

{
    "name": "env-file",
    "host": {
        "sourcePath": "/var/app/current/envs"
    }
}

3) Montez le volume sur votre conteneur

{
  "sourceVolume": "env-file",
  "containerPath": "/tmp/envs",
  "readOnly": true
}

4) Dans votre fichier .ebextensions / options.config, ajoutez un bloc container_commands comme ceci:

container_commands:
  01_create_mount:
    command: "mkdir -p envs/"
  02_create_env_file:
    command: { "Fn::Join" : [ "", [ 'echo "', "export ENVIRONMENT_NAME=" , { "Ref", "RESOURCE" }, ';" > envs/env_file;' ] ] }

5) eb deploy et votre ENVS devrait être disponible dans votre conteneur docker

Vous pouvez ajouter plus d'ENV en ajoutant plus de container_commands comme:

  02_create_env_file_2:
    command: { "Fn::Join" : [ "", [ 'echo "', "export ENVIRONMENT_NAME_2=" , { "Ref", "RESOURCE2" }, ';" >> envs/env_file;' \] \] }

J'espère que cela t'aides!

dsorensen
la source
Gareautrain. Si vous avez des variables d'environnement dynamiques, par exemple X: '{"Ref": "MyCache"}, la 'valeur n'est pas analysée (la valeur n'est que ' {"Ref": "MyCache"}') par défaut lorsque le conteneur tente d'y accéder. Avec cela, vous pouvez avoir des variables dynamiques comme ça.
Petter Kjelkenes