Come si trasmette la variabile di ambiente personalizzata su Amazon Elastic Beanstalk (AWS EBS)?

Il blurb Amazon Elastic Beanstalk dice:

Elastic Beanstalk ti permette di “aprire il cofano” e mantenere il pieno controllo … anche passare le variabili d’ambiente attraverso la console Elastic Beanstalk.

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

Come passare altre variabili di ambiente oltre a quella nella configurazione Elastic Beanstalk?

    Come testa a chiunque usi il modo .ebextensions/*.config : al giorno d’oggi è ansible aggiungere, modificare e rimuovere le variabili di ambiente nell’interfaccia web Elastic Beanstalk.

    Le variabili sono in Configurazione → Configurazione software:

    Proprietà ambientali

    Creare i vars in .ebextensions come nella risposta di Onema funziona ancora.

    Può anche essere preferibile, ad esempio se in seguito si distribuirà in un altro ambiente e si avrà paura di dimenticare di impostarli manualmente o se si sta accettando il commit dei valori sul controllo del codice sorgente. Io uso un mix di entrambi.

    Solo 5 valori sono limitanti oppure potresti voler avere un nome di variabile di ambiente personalizzato. Puoi farlo usando i file di configurazione. Crea una directory alla radice del tuo progetto chiamata

    .ebextensions /

    Quindi creare un file chiamato environment.config (questo file può essere chiamato qualsiasi cosa ma deve avere l’estensione .config) e aggiungere i seguenti valori

     option_settings: - option_name: CUSTOM_ENV value: staging 

    Dopo aver distribuito l’applicazione, vedrai questo nuovo valore in Dettagli ambiente -> Modifica configurazione -> Contenitore

    per maggiori informazioni consulta la documentazione qui: http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers-ec2.html#customize-containers-format-options

    Aggiornare

    Per evitare di commettere valori di repository come chiavi API, segreti e così via, puoi inserire un valore di segnaposto.

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

    Successivamente puoi andare al pannello di amministrazione di AWS (Dettagli ambiente -> Modifica configurazione -> Contenitore) e aggiornare i valori lì. Nella mia esperienza questi valori non cambiano dopo le distribuzioni successive.

    Aggiornamento 2 Come ha affermato @Benjamin nel suo commento, dal momento che il nuovo aspetto è stato implementato il 18 luglio 2013 è ansible definire qualsiasi numero di variabili d’ambiente direttamente dalla console:

    Configuration > Software Configuration > Environment Properties

    Nell’AMI Java8 Tomcat8 2016, ElasticBeanstalk non riesce a impostare le variabili di ambiente dalla configurazione web. Stanno davvero impostando le proprietà di jvm -D invece.

    – “Le seguenti proprietà vengono passate all’applicazione come variabili di ambiente. Ulteriori informazioni.”

    Questa istruzione non è corretta per Java Tomcat ami. Amazon non li imposta come variabili di ambiente. Sono impostate come proprietà di sistema passate sulla riga di comando a Tomcat come proprietà -D per jvm. Il metodo in Java per ottenere variabili d’ambiente non è lo stesso per ottenere una proprietà. System.getenv vs System.getProperty

    I ssh’d nella casella e verificato che la variabile di ambiente non è mai stata impostata. Tuttavia, nei log di tomcat posso vedere che la proprietà -D è impostata.

    Ho cambiato il mio codice per verificare ora entrambe le posizioni come soluzione alternativa.

    AWS interpreterà le stringhe del modello CloudFormation nelle variabili di ambiente. È ansible utilizzare questo per accedere alle informazioni sul proprio ambiente EB all’interno dell’applicazione:

    Nell’interfaccia web di AWS, il seguente sarà valutato come il nome del tuo ambiente (notare i tick posteriori):

     `{ "Ref" : "AWSEBEnvironmentName" }` 

    Oppure puoi usare un file .ebextensions/*.config e avvolgere il template CloudFormation in back ticks (`):

     { "option_settings": [ { "namespace": "aws:elasticbeanstalk:application:environment", "option_name": "ENVIRONMENT_NAME", "value": "`{ \"Ref\" : \"AWSEBEnvironmentName\" }`" } ] } 

    Dettagli ambiente -> Modifica configurazione -> Contenitore

    inserisci la descrizione dell'immagine qui

    In alternativa, è ansible utilizzare la CLI Elastic Beanstalk per impostare le variabili di ambiente.

    Per impostare una variabile di ambiente: eb setenv FOO=bar

    Per visualizzare le variabili di ambiente: eb printenv

    Questo sembra essere l’unico modo per impostare ENV con valori dinamici in beanstalk. Ho trovato una soluzione alternativa che funzioni per la mia configurazione multi-docker:

    1) Aggiungi questo al tuo Dockerfile prima di build + caricare nel tuo repository ECS:

     CMD eval `cat /tmp/envs/env_file$`; ; 

    2) Nel tuo file Dockerrun.aws.json crea un volume:

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

    3) Montare il volume sul tuo contenitore

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

    4) Nel tuo file .ebextensions / options.config aggiungi un blocco container_commands in questo modo:

     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 distribuire e il tuo ENV dovrebbe essere disponibile nel tuo contenitore docker

    Puoi aggiungere più ENV aggiungendo ulteriori comandi_compressi come:

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

    Spero che questo ti aiuti!