Wie übergeben Sie eine benutzerdefinierte Umgebungsvariable an Amazon Elastic Beanstalk (AWS EBS)?

121

Der Amazon Elastic Beanstalk Klappentext sagt:

Mit Elastic Beanstalk können Sie "die Haube öffnen" und die volle Kontrolle behalten ... sogar Umgebungsvariablen über die Elastic Beanstalk-Konsole übergeben.

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

Wie werden andere Umgebungsvariablen als die in der Elastic Beanstalk-Konfiguration übergeben?

Ben
quelle
4
Vielleicht möchten Sie die akzeptierte Antwort auf diese Frage ändern
Philipp

Antworten:

136

Als Heads-up für alle, die diesen .ebextensions/*.configWeg nutzen: Heutzutage können Sie Umgebungsvariablen in der Elastic Beanstalk-Weboberfläche hinzufügen, bearbeiten und entfernen .

Die Variablen befinden sich unter Konfiguration → Softwarekonfiguration:

Umgebungseigenschaften

Das Erstellen der Vars .ebextensionswie in Onemas Antwort funktioniert immer noch.

Es kann sogar vorzuziehen sein, z. B. wenn Sie später in einer anderen Umgebung bereitstellen und Angst haben, das manuelle Festlegen zu vergessen, oder wenn Sie die Werte für die Quellcodeverwaltung übernehmen können. Ich benutze eine Mischung aus beiden.

Limette
quelle
2
Alternativ können Sie die Konfiguration auch speichern und die neue Umgebung mithilfe der Konfiguration starten.
Michael Gallego
1
Ja, ich würde sagen, das ist die beste Option. Ich vergesse es einfach immer wieder und starte wohl oder übel neue Umgebungen. :)
Kalk
1
@dingdong: yep, und insbesondere können Sie in Ihrer Anwendung darauf zugreifen. ZB in Rails ENV["CUSTOM_ENV"]würde zurückkehren "something-something".
Kalk
3
Wenn ich neue Eigenschaften hinzufüge oder einen Eigenschaftswert ändere, sind sie sofort verfügbar. Müssen sie neu gestartet werden? Ich habe kürzlich die Größe einer Autoscaling-Gruppe geändert und AWS hat fast alle 40 unserer Instanzen beendet und 45 neue Instanzen gestartet. Ich möchte nicht, dass dies passiert, wenn ich einer vorhandenen Umgebung eine neue Eigenschaft hinzufüge. Irgendwelche Ideen?
Engineer81
4
Beachten Sie die jüngsten Änderungen. Gemäß dieser Antwort werden sie nicht als Umgebungsvariablen übergeben. Sie werden nur als Systemeigenschaften übergeben
James
107

Nur 5 Werte sind einschränkend, oder Sie möchten möglicherweise einen benutzerdefinierten Umgebungsvariablennamen. Sie können dies mithilfe der Konfigurationsdateien tun. Erstellen Sie ein Verzeichnis im Stammverzeichnis Ihres Projekts mit dem Namen

.ebextensions /

Erstellen Sie dann eine Datei mit dem Namen environment.config (diese Datei kann beliebig aufgerufen werden, muss jedoch die Erweiterung .config haben) und fügen Sie die folgenden Werte hinzu

option_settings:
  - option_name: CUSTOM_ENV
    value: staging

Nachdem Sie Ihre Anwendung bereitgestellt haben, wird dieser neue Wert unter Umgebungsdetails -> Konfiguration bearbeiten -> Container angezeigt

Weitere Informationen finden Sie in der Dokumentation hier: http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers-ec2.html#customize-containers-format-options

Aktualisieren

Um zu verhindern, dass Ihre Repository-Werte wie API-Schlüssel, Geheimnisse usw. festgeschrieben werden, können Sie einen Platzhalterwert eingeben.

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

Später können Sie im AWS-Administrationsbereich (Umgebungsdetails -> Konfiguration bearbeiten -> Container) die Werte dort aktualisieren. Nach meiner Erfahrung ändern sich diese Werte nach nachfolgenden Bereitstellungen nicht.

Update 2 Wie @Benjamin in seinem Kommentar erwähnt, da der neue Look and Feel aus 18. Juli gerollt wurde, 2013 ist es möglich , eine beliebige Anzahl von Umgebungsvariablen aus der Konsole direkt zu definieren:

Configuration > Software Configuration > Environment Properties

Onema
quelle
2
@Onema - Wie gehen Sie mit dem Hinzufügen neuer Schlüssel zur Konfigurationsdatei um? Wird durch Drücken der aktualisierten Datei alle zuvor festgelegten Schlüssel mit Platzhalterwerten aktualisiert?
Tabrez
1
@Tabrez, alle zuvor gesetzten Schlüssel behalten ihre Werte bei.
Anarchtica
2
Sorry @Tabrez, ich hatte vorher keine Gelegenheit, das zu untersuchen. Um die Antwort von Anarchtica zu ergänzen, habe ich einen Test durchgeführt und festgestellt, dass die Schlüssel nicht verwendet werden, wenn Sie einen Platzhalter verwenden und dann die Werte in der AWS-Konsole mit echten Schlüsseln aktualisieren und dann Ihre Platzhalterwerte in der Konfigurationsdatei aktualisieren und drücken durch den neuen Platzhalter ersetzt. Ich finde das etwas seltsam, aber ich denke, es ist ein willkommenes Verhalten, da Sie gezwungen sein werden, alle env-Werte in der Konsole zu verwalten.
Onema
7
@Anarchtica, ich habe den AWS-Support nach diesem Verhalten gefragt. Sie sagten, sobald Sie die Werte in der Konsole aktualisiert haben, haben sie Vorrang und Sie können sie überhaupt nicht mehr mit Konfigurationsdateien ändern. Wenn Sie die Werte in der Konsole nie ändern, werden alle in der Konfigurationsdatei vorgenommenen Änderungen aktualisiert.
Onema
1
Weiß jemand, wie man die Umgebungsvariablen in Ihrer Konfigurationsdatei für container_commands verwendet? Ich habe versuchtcommand: "nrsysmond-config --set license_key={$NR_INSTALL_KEY}"
Colllin
29

In Java8 Tomcat8 AMI 2016 kann ElasticBeanstalk keine Umgebungsvariablen aus der Webkonfiguration festlegen. Sie setzen stattdessen wirklich jvm -D-Eigenschaften.

- "Die folgenden Eigenschaften werden als Umgebungsvariablen an die Anwendung übergeben. Weitere Informationen."

Diese Aussage ist für Java Tomcat ami falsch. Amazon nicht gesetzt diese als Umgebungsvariablen. Sie werden als Systemeigenschaften festgelegt, die in der Befehlszeile als -D-Eigenschaft für jvm an Tomcat übergeben werden. Die Methode in Java zum Abrufen von Umgebungsvariablen ist nicht dieselbe zum Abrufen einer Eigenschaft. System.getenv vs System.getProperty

Ich ging in die Box und verifizierte, dass die Umgebungsvariable nie gesetzt wurde. In den Tomcat-Protokollen kann ich jedoch sehen, dass die Eigenschaft -D festgelegt ist.

Ich habe meinen Code geändert, um jetzt als Problemumgehung nach beiden Speicherorten zu suchen.

Ed J.
quelle
Und für .Net werden sie in Ihre web.config-Datei eingefügt und nicht in Umgebungsvariablen gemäß stackoverflow.com/a/33465765/1991614 . Weiter verwirrend ist das Problem, dass sie nicht eingefügt werden, wenn dieser Schlüssel bereits in web.confg vorhanden ist :(
Bitcoder
Sie sind mein Held! Vielen Dank, dass Sie die -D-Eigenschaftszuordnung in Tomcat 8 bemerkt haben.
shadowhorst
1
Für diejenigen wie mich, die wirklich Systemumgebungsvariablen festlegen müssen, können Sie diese Umgebungseigenschaften mithilfe eines integrierten Beanstalk-Skripts abrufen. Siehe diese Antwort für weitere Informationen: serverfault.com/a/770736/292741
BoomShadow
1
Amazon Linux 2017.03 v2.5.4 with Java8setzt auch nicht env.
Sanoob
2
Sie können nicht SSH in die Box und sehen die Variablen. Sie werden nur in der Shell festgelegt, in der Ihre App ausgeführt wurde. 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. Ihre Variablen werden nicht in einem Anmeldeskript wie festgelegt .bashrc. Sie sind jedoch korrekt. Tomcat-Variablen werden als Eigenschaften übergeben. (Siehe oben auf der verlinkten Seite.)
Chloe
18

AWS interpretiert CloudFormation-Vorlagenzeichenfolgen in Ihren Umgebungsvariablen. Sie können dies verwenden, um auf Informationen zu Ihrer EB-Umgebung in Ihrer Anwendung zuzugreifen:

In der AWS-Weboberfläche wird Folgendes als Name Ihrer Umgebung ausgewertet (beachten Sie die hinteren Häkchen):

`{ "Ref" : "AWSEBEnvironmentName" }`

Oder Sie können eine verwenden .ebextensions/*.configund die CloudFormation-Vorlage in Back Ticks (`) einschließen:

{
  "option_settings": [
    {
      "namespace": "aws:elasticbeanstalk:application:environment",
      "option_name": "ENVIRONMENT_NAME",
      "value": "`{ \"Ref\" : \"AWSEBEnvironmentName\" }`"
    }
  ]
}
George Brassey
quelle
3
Dunkel, aber genau das, wonach ich gesucht habe.
Eric Walker
1
Gibt es dafür Unterlagen? Ich kann es nicht finden.
Yangmillstheory
@ Yangmillstheory docs.aws.amazon.com/elasticbeanstalk/latest/dg/…
Mike McKechnie
12

Alternativ können Sie die Elastic Beanstalk-CLI verwenden, um Umgebungsvariablen festzulegen.

So legen Sie eine Umgebungsvariable fest: eb setenv FOO=bar

So zeigen Sie die Umgebungsvariablen an: eb printenv

T-Rex
quelle
9

Umgebungsdetails -> Konfiguration bearbeiten -> Container

Geben Sie hier die Bildbeschreibung ein

Ben
quelle
5

Dies scheint die einzige Möglichkeit zu sein, ENVs mit dynamischen Werten in Beanstalk festzulegen. Ich habe eine Problemumgehung gefunden, die für mein Multi-Docker-Setup funktioniert:

1) Fügen Sie dies Ihrer Docker-Datei hinzu, bevor Sie es erstellen + in Ihr ECS-Repository hochladen:

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

2) Erstellen Sie in Ihrer Datei Dockerrun.aws.json ein Volume:

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

3) Montieren Sie das Volumen an Ihrem Behälter

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

4) Fügen Sie in Ihrer Datei .ebextensions / options.config einen container_commands-Block wie folgt hinzu:

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 und Ihr ENVS sollten in Ihrem Docker-Container verfügbar sein

Sie können weitere ENVs hinzufügen, indem Sie weitere container_commands hinzufügen, z.

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

Hoffe das hilft!

dsorensen
quelle
Lebensretter. Wenn Sie dynamische Umgebungsvariablen haben, z. B. X: '{"Ref": "MyCache"} ', wird der Wert {"Ref": "MyCache"}standardmäßig nicht analysiert (Wert ist nur ' '), wenn der Container versucht, darauf zuzugreifen. Damit können Sie solche dynamischen Variablen haben.
Petter Kjelkenes