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


121

Il blurb Amazon Elastic Beanstalk dice:

Elastic Beanstalk ti consente di "aprire il cofano" e mantenere il pieno controllo ... persino passare le variabili di ambiente attraverso la console Elastic Beanstalk.

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

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


4
potresti prendere in considerazione la possibilità di modificare la risposta accettata su questo
philipp

Risposte:


136

Avvisa chiunque utilizzi il .ebextensions/*.configmetodo: al giorno d'oggi puoi aggiungere, modificare e rimuovere variabili d'ambiente nell'interfaccia web di Elastic Beanstalk.

Le variabili si trovano in Configurazione → Configurazione software:

Proprietà dell'ambiente

La creazione dei vars .ebextensionscome nella risposta di Onema funziona ancora.

Può anche essere preferibile, ad esempio se si distribuirà in un altro ambiente in un secondo momento e si ha paura di dimenticare di impostarli manualmente o se si è d'accordo con il commit dei valori nel controllo del codice sorgente. Uso un mix di entrambi.


2
In alternativa, puoi anche salvare la configurazione e avviare il nuovo ambiente utilizzando la configurazione.
Michael Gallego

1
Sì, direi che è l'opzione migliore. Continuo a dimenticarlo e lancio nuovi ambienti, volenti o nolenti. :)
lime

1
@dingdong: sì, e in particolare puoi accedervi nella tua applicazione. Ad esempio in Rails ENV["CUSTOM_ENV"]tornerebbe "something-something".
lime

3
Se aggiungo nuove proprietà o modifico il valore di una proprietà, sono immediatamente disponibili, richiedono il riavvio di qualcosa, ecc.? Di recente ho cambiato le dimensioni di un gruppo di scalabilità automatica e AWS ha terminato quasi tutte le 40 istanze e ne ha create 45 nuove. Non voglio che ciò accada se aggiungo una nuova proprietà a un ambiente esistente. Qualche idea?
Ingegnere

4
Attenzione ai recenti cambiamenti. Secondo questa risposta , non vengono passati come variabili di ambiente. Sono passati solo come proprietà di sistema
James,

107

Solo 5 valori sono limitanti o potresti voler avere un nome di variabile di ambiente personalizzato. Puoi farlo utilizzando i file di configurazione. Crea una directory nella 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 ulteriori informazioni, consultare la documentazione qui: http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers-ec2.html#customize-containers-format-options

Aggiornare

Per impedire il commit dei valori del tuo repository come chiavi API, segreti e così via, puoi inserire un valore 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 successive distribuzioni.

Aggiornamento 2 Come affermato da @Benjamin nel suo commento, poiché il nuovo aspetto è stato implementato il 18 luglio 2013, è possibile definire un numero qualsiasi di variabili di ambiente direttamente dalla console:

Configuration > Software Configuration > Environment Properties


2
@Onema - Come gestisci l'aggiunta di nuove chiavi al file di configurazione? Il push del file aggiornato aggiornerà tutte le chiavi precedentemente impostate con valori segnaposto?
Tabrez

1
@Tabrez, tutte le chiavi precedentemente impostate manterranno i loro valori.
Anarchtica

2
Mi dispiace @Tabrez, non ho avuto la possibilità di esaminarlo prima. Per aggiungere alla risposta Anarchtica ho eseguito alcuni test e ho scoperto che se usi un segnaposto, quindi aggiorni i valori nella Console AWS usando chiavi reali e poi aggiorni i valori segnaposto nel file di configurazione e premi, le chiavi non saranno sostituito con il nuovo segnaposto. Lo trovo un po 'strano, ma penso che sia un comportamento gradito poiché sarai costretto a gestire tutti i valori env nella console.
Onema

7
@Anarchtica, ho chiesto informazioni su questo comportamento all'assistenza AWS. Hanno detto che una volta aggiornati i valori nella console, avranno la precedenza e non sarai in grado di modificarli utilizzando i file di configurazione. Se non modifichi mai i valori nella console, tutte le modifiche apportate al file di configurazione verranno aggiornate.
Onema

1
Qualcuno sa come utilizzare le variabili di ambiente all'interno del file di configurazione per container_commands? Ho provatocommand: "nrsysmond-config --set license_key={$NR_INSTALL_KEY}"
colllin

29

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

- "Le seguenti proprietà vengono passate all'applicazione come variabili di ambiente. Ulteriori informazioni."

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

Sono entrato nella casella e ho verificato che la variabile d'ambiente non fosse mai stata impostata. Tuttavia, nei log di Tomcat posso vedere che la proprietà -D è impostata.

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


E per .Net, vengono inseriti nel tuo file web.config piuttosto che messi nelle variabili d'ambiente, come da stackoverflow.com/a/33465765/1991614 . Ulteriore confusione il problema è che non vengono inseriti se quella chiave esiste già in web.confg :(
bitcoder

Tu sei il mio eroe! Grazie per aver notato la mappatura della proprietà -D in Tomcat 8.
shadowhorst

1
Per quelli come me che hanno davvero bisogno di impostare le variabili d'ambiente di sistema, puoi recuperare quelle proprietà d'ambiente usando uno script beanstalk incorporato. Vedi questa risposta per maggiori informazioni: serverfault.com/a/770736/292741
BoomShadow

1
Amazon Linux 2017.03 v2.5.4 with Java8inoltre non imposta env.
Sanoob

2
Non puoi entrare in SSH nella casella e vedere le variabili. Sono impostati solo nella shell che ha eseguito l'app. docs.aws.amazon.com/elasticbeanstalk/latest/dg/… Le 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. tue variabili non sono impostate in uno script di accesso come .bashrc. Comunque tu sia corretto, le variabili Tomcat vengono passate come proprietà. (Vedere la parte superiore della pagina collegata.)
Chloe

18

AWS interpreterà le stringhe del modello CloudFormation nelle variabili di ambiente. Puoi usarlo per accedere alle informazioni sul tuo ambiente EB all'interno della tua applicazione:

Nell'interfaccia Web di AWS verrà valutato quanto segue come nome del tuo ambiente (nota i segni di spunta):

`{ "Ref" : "AWSEBEnvironmentName" }`

In alternativa, puoi utilizzare un .ebextensions/*.confige racchiudere il modello CloudFormation in segni di spunta (`):

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

3
Oscuro, ma proprio quello che stavo cercando.
Eric Walker

1
C'è documentazione per questo? Non riesco a trovarlo.
yangmillstheory


12

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

Per impostare una variabile d'ambiente: eb setenv FOO=bar

Per visualizzare le variabili d'ambiente: eb printenv


9

Dettagli ambiente -> Modifica configurazione -> Contenitore

inserisci qui la descrizione dell'immagine


5

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

1) Aggiungilo al tuo Dockerfile prima di creare e caricare nel tuo repository ECS:

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

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

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

3) Montare il volume sul 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 deploy e il tuo ENVS dovrebbe essere disponibile nel tuo container docker

Puoi aggiungere più ENV aggiungendo più container_commands come:

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

Spero che questo ti aiuti!


Salvavita. Se hai variabili di ambiente dinamiche, ad esempio X: '{"Ref": "MyCache"}, il 'valore non viene analizzato (il valore è solo " {"Ref": "MyCache"}") per impostazione predefinita quando il contenitore tenta di accedervi. Con questo puoi avere variabili dinamiche come quella.
Petter Kjelkenes
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.