¿Cómo se transfieren las variables de entorno personalizadas en Amazon Elastic Beanstalk (AWS EBS)?

121

La propaganda de Amazon Elastic Beanstalk dice:

Elastic Beanstalk le permite "abrir el capó" y mantener el control total ... incluso pasar variables de entorno a través de la consola de Elastic Beanstalk.

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

¿Cómo pasar otras variables de entorno además de la de la configuración de Elastic Beanstalk?

Ben
fuente
4
es posible que desee considerar cambiar la respuesta aceptada en esto
philipp

Respuestas:

136

Como aviso para cualquiera que use el .ebextensions/*.configcamino: hoy en día puede agregar, editar y eliminar variables de entorno en la interfaz web de Elastic Beanstalk.

Las variables están en Configuración → Configuración de software:

Propiedades ambientales

Crear las vars .ebextensionscomo en la respuesta de Onema todavía funciona.

Incluso puede ser preferible, por ejemplo, si va a implementar en otro entorno más tarde y tiene miedo de olvidarse de configurarlos manualmente, o si está de acuerdo con enviar los valores al control de código fuente. Utilizo una mezcla de ambos.

Lima
fuente
2
Alternativamente, también puede guardar la configuración e iniciar el nuevo entorno usando la configuración.
Michael Gallego
1
Sí, diría que es la mejor opción. Lo sigo olvidando y lanzo nuevos entornos, quiera o no. :)
lima
1
@dingdong: sí, y en particular puedes acceder a ellos en tu aplicación. Por ejemplo, en Rails ENV["CUSTOM_ENV"]volvería "something-something".
Lima
3
Si agrego nuevas propiedades o cambio el valor de una propiedad, ¿están disponibles de inmediato, requieren que se reinicie algo, etc.? Recientemente cambié el tamaño de un grupo de autoescalado y AWS terminó casi todas nuestras 40 instancias y creó 45 nuevas. No quiero que eso suceda si agrego una nueva propiedad a un entorno existente. ¿Algunas ideas?
Engineer81
4
Cuidado con los cambios recientes. Según esta respuesta , no se pasan como variables de entorno. Solo se pasan como propiedades del sistema
James
107

Solo 5 valores son limitantes, o es posible que desee tener un nombre de variable de entorno personalizado. Puede hacer esto utilizando los archivos de configuración. Cree un directorio en la raíz de su proyecto llamado

.ebextensions /

Luego cree un archivo llamado environment.config (este archivo se puede llamar de cualquier manera, pero debe tener la extensión .config) y agregue los siguientes valores

option_settings:
  - option_name: CUSTOM_ENV
    value: staging

Después de implementar su aplicación, verá este nuevo valor en Detalles del entorno -> Editar configuración -> Contenedor

para obtener más información, consulte la documentación aquí: http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers-ec2.html#customize-containers-format-options

Actualizar

Para evitar comprometerse con los valores de su repositorio, como claves de API, secretos, etc., puede poner un valor de marcador de posición.

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

Más tarde, puede ir al panel de administración de AWS (Detalles del entorno -> Editar configuración -> Contenedor) y actualizar los valores allí. En mi experiencia, estos valores no cambian después de implementaciones posteriores.

Actualización 2 Como @Benjamin declaró en su comentario, dado que la nueva apariencia se implementó el 18 de julio de 2013, es posible definir cualquier cantidad de variables de entorno directamente desde la consola:

Configuration > Software Configuration > Environment Properties

Onema
fuente
2
@Onema - ¿Cómo maneja agregar nuevas claves al archivo de configuración? ¿Al presionar el archivo actualizado, se actualizarán todas las claves establecidas previamente con valores de marcador de posición?
Tabrez
1
@Tabrez, cualquier clave configurada previamente conservará sus valores.
Anarchtica
2
Lo siento @Tabrez, no tuve la oportunidad de investigar esto antes. Para agregar a la respuesta de Anarchtica, realicé una prueba y descubrí que si usa un marcador de posición y luego actualiza los valores en la Consola de AWS usando claves reales y luego actualiza sus valores de marcador de posición en el archivo de configuración y empuja, las claves no serán reemplazado con el nuevo marcador de posición. Me parece un poco extraño, pero creo que es un comportamiento bienvenido, ya que se verá obligado a administrar todos los valores de env en la consola.
Onema
7
@Anarchtica, le pregunté sobre este comportamiento al soporte de AWS. Dijeron que una vez que actualice los valores en la consola, tendrán prioridad y no podrá modificarlos usando archivos de configuración en absoluto. Si nunca modifica los valores en la consola, se actualizarán los cambios realizados en el archivo de configuración.
Onema
1
¿Alguien sabe cómo usar las variables de entorno dentro de su archivo de configuración para container_commands? Lo intentécommand: "nrsysmond-config --set license_key={$NR_INSTALL_KEY}"
colllin
29

En la AMI de 2016 Java8 Tomcat8, ElasticBeanstalk no puede establecer variables de entorno desde la configuración web. En su lugar, están configurando propiedades jvm -D.

- "Las siguientes propiedades se pasan a la aplicación como variables de entorno. Más información".

Esta declaración es incorrecta para Java Tomcat ami. Amazon no establece estos como variables de entorno. Se establecen como propiedades del sistema pasadas en la línea de comandos a Tomcat como una propiedad -D para jvm. El método en Java para obtener variables de entorno no es el mismo para obtener una propiedad. System.getenv frente a System.getProperty

Entré en el cuadro y verifiqué que la variable de entorno nunca se estableció. Sin embargo, en los registros de tomcat puedo ver que la propiedad -D está configurada.

He cambiado mi código para comprobar ambas ubicaciones ahora como solución.

Ed J
fuente
Y para .Net, se insertan en su archivo web.config en lugar de colocarse en variables de entorno, según stackoverflow.com/a/33465765/1991614 . El problema es aún más confuso es que no se insertan si esa clave ya existe en web.confg :(
bitcoder
¡Eres mi héroe! Gracias por notar el mapeo de propiedades -D en Tomcat 8.
shadowhorst
1
Para aquellos como yo que realmente necesitan establecer variables de entorno del sistema, pueden recuperar esas propiedades del entorno utilizando un script de beanstalk incorporado. Consulte esta respuesta para obtener más información: serverfault.com/a/770736/292741
BoomShadow
1
Amazon Linux 2017.03 v2.5.4 with Java8tampoco establece env.
Sanoob
2
No puede SSH en el cuadro y ver las variables. Se establecen solo en el shell que ejecutó su aplicación. 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. Sus variables no están configuradas en un script de inicio de sesión como .bashrc. Sin embargo, tiene razón, las variables de Tomcat se pasan como propiedades. (Ver la parte superior de la página vinculada.)
Chloe
18

AWS interpretará las cadenas de plantillas de CloudFormation en sus variables de entorno. Puede usar esto para acceder a información sobre su entorno EB dentro de su aplicación:

En la interfaz web de AWS, se evaluará lo siguiente como el nombre de su entorno (tenga en cuenta las marcas inversas):

`{ "Ref" : "AWSEBEnvironmentName" }`

O bien, puede usar .ebextensions/*.configy envolver la plantilla de CloudFormation en tics posteriores (`):

{
  "option_settings": [
    {
      "namespace": "aws:elasticbeanstalk:application:environment",
      "option_name": "ENVIRONMENT_NAME",
      "value": "`{ \"Ref\" : \"AWSEBEnvironmentName\" }`"
    }
  ]
}
George Brassey
fuente
3
Oscuro, pero justo lo que estaba buscando.
Eric Walker
1
¿Existe documentación para esto? Parece que no puedo encontrarlo.
yangmillstheory
@yangmillstheory docs.aws.amazon.com/elasticbeanstalk/latest/dg/…
mike mckechnie
12

Alternativamente, puede usar la CLI de Elastic Beanstalk para establecer variables de entorno.

Para establecer una variable de entorno: eb setenv FOO=bar

Para ver las variables de entorno: eb printenv

tirano saurio Rex
fuente
9

Detalles del entorno -> Editar configuración -> Contenedor

ingrese la descripción de la imagen aquí

Ben
fuente
5

Esta parece ser la única forma de configurar ENV con valores dinámicos en beanstalk. Se me ocurrió una solución alternativa que funciona para mi configuración de multi-docker:

1) Agregue esto a su Dockerfile antes de compilar + subir a su repositorio ECS:

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

2) En su archivo Dockerrun.aws.json, cree un volumen:

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

3) Monte el volumen en su contenedor

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

4) En su archivo .ebextensions / options.config agregue un bloque container_commands así:

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 y su ENVS deberían estar disponibles en su contenedor docker

Puede agregar más ENV agregando más container_commands como:

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

¡Espero que esto ayude!

Dsorensen
fuente
Salvador de la vida. Si tiene variables de entorno dinámicas, por ejemplo, X: '{"Ref": "MyCache"}, el 'valor no se analiza (el valor es solo ' {"Ref": "MyCache"}') de forma predeterminada cuando el contenedor intenta acceder a él. Con esto puedes tener variables dinámicas como esa.
Petter Kjelkenes