5

Wir versuchen, Umgebungsspezifische Anwendungskonfigurationsdateien in s3 zu speichern. Die Dateien werden in verschiedenen Unterverzeichnissen gespeichert, die nach der Umgebung benannt sind und die Umgebung als Teil des Dateinamens enthalten.AWS Elastic Beanstalk: Wie werden Umgebungsvariablen in Ebextensions verwendet?

Beispiele sind

dev/application-dev.properties 
stg/application-stg.properties 
prd/application-prd.properties 

Die Elastic Beanstalk-Umgebungen namens dev, stg, prd und alternativ in Elastic Beanstalk genannt Umgebung definiert eine Umgebungsvariable, die dev sein kann, stg oder prd Ich habe auch .

Meine Frage ist jetzt, wie referenziere ich den Umgebungsnamen oder die Variable ENVIRONMENT beim Herunterladen der Konfigurationsdatei aus einer Konfigurationsdatei in .extensions?

Ich habe versucht, eine {"Ref": "AWSEBEnvironmentName" } Referenz in .exextensions/myapp.config verwenden, aber einen Syntaxfehler beim Deployment erhalten.

Der Inhalt .ebextensions/myapp.config ist:

files: 
    /config/application-`{"Ref": "AWSEBEnvironmentName" }`.properties: 
    mode: "000666" 
    owner: webapp 
    group: webapp 
    source: https://s3.amazonaws.com/com.mycompany.mybucket/`{"Ref": "AWSEBEnvironmentName" }`/application-`{"Ref": "AWSEBEnvironmentName" }`.properties 
    authentication: S3Access 

Resources: 
    AWSEBAutoScalingGroup: 
    Metadata: 
     AWS::CloudFormation::Authentication: 
     S3Access: 
      type: S3 
      roleName: aws-elasticbeanstalk-ec2-role 
      buckets: com.mycompany.api.config 

Der Fehler, den ich bekommen ist:

The configuration file .ebextensions/myapp.config in application version 
manualtest-18 contains invalid YAML or JSON. YAML exception: Invalid Yaml: 
mapping values are not allowed here in "<reader>", line 6, column 85: 
... .config/stg/application-`{"Ref": "AWSEBEnvironmentName" }`.prop ...^, 
JSON exception: Invalid JSON: Unexpected character (f) at position 0.. 
Update the configuration file. 

Was die Referenzierung eine Umgebungsvariable in einem .ebextensions der richtige Weg ist Config Datei in AWS Elastic Beanstalk?

Antwort

4

Ich kämpfte diese Funktion zu erhalten, bis ich, dass die Sub-Funktion in ebextensions verfügbar zu sein scheint nicht entdeckt: http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/ebextensions-functions.html

Dies bedeutet, dass Sie auf Fn::Join und Ref zurückgreifen müssen, zumindest bis die Unterstützung für Sub in Ebextensions eingeführt wird. Es scheint auch, dass das Attribut files einen festen Pfad benötigt (und ich konnte Fn::Join in diesem Kontext nicht verwenden).

Meine Gesamtlösung war wie folgt:

Resources: 
    AWSEBAutoScalingGroup: 
    Metadata: 
     AWS::CloudFormation::Authentication: 
     S3Auth: 
      type: S3 
      buckets: arn:aws:s3:::elasticbeanstalk-xxx 
      roleName: aws-elasticbeanstalk-ec2-role 

files: 
    "/tmp/application.properties" : 
    mode: "000644" 
    owner: root 
    group: root 
    source: { "Fn::Join" : ["", ["https://s3-xxx.amazonaws.com/elasticbeanstalk-xxx/path/to/application-", { "Ref" : "AWSEBEnvironmentName" }, ".properties" ]]} 
    authentication: S3Auth 

container_commands: 
    01-apply-configuration: 
    command: mkdir -p config && mv /tmp/application.properties config 

Dies in einer application.properties Datei führen wird (ohne die Umwelt Namen-Qualifizierer) in einem config Verzeichnis neben der entfalteten Anwendungsinstanz.

Wenn Sie den Namen der Umgebung als Teil des Dateinamens beibehalten möchten, müssen Sie den Befehl, der die Datei verschiebt, so anpassen, dass ein anderer Fn::Join Ausdruck verwendet wird, um den Dateinamen zu steuern.

1

Sie sind fast da. Ebextensions verwenden YAML-Format, während Sie versuchen, JSON zu verwenden. Verwenden Sie Ref: AWSEBEnvironmentName. Darüber hinaus können Sie die Vorteile von Sub Funktion übernehmen zu vermeiden lästigen Join:

!Sub "/config/application-${AWSEBEnvironmentName}.properties"

1

Ihre .ebextensions Konfigurationsdatei war fast korrekt. Das Ersetzen des Dateinamens durch die Umgebungsvariable oder den Namen der AWS-Ressource funktioniert nicht. Verwenden Sie dazu die Antwort von Mark, um die im Abschnitt container_commands erstellte Datei umzubenennen.

Die source-Value-Option versucht AWS Ressourcennamen für den Zugriff mit Ref richtig war, hatte es wie unten durch Apostroph ', umgeben sein:

files: 
    /config/application.properties: 
    mode: "000666" 
    owner: webapp 
    group: webapp 
    source: 'https://s3.amazonaws.com/com.mycompany.mybucket/`{"Ref": "AWSEBEnvironmentName" }`/application-`{"Ref": "AWSEBEnvironmentName" }`.properties' 
    authentication: S3Access 

Und auf Variablen Fn::GetOptionSetting zugreifen Umgebung. Umgebungsvariablen sind in aws:elasticbeanstalk:application:environmentnamespace.

Below Beispiel Zugriff auf eine Umgebungsvariable ENVIRONMENT in source Option files:

files: 
    "/tmp/application.properties" : 
    mode: "000666" 
    owner: webapp 
    group: webapp 
    source: 'https://s3.amazonaws.com/com.mycompany.mybucket/`{"Ref": "AWSEBEnvironmentName" }`/application-`{"Fn::GetOptionSetting": {"Namespace": "aws:elasticbeanstalk:application:environment", "OptionName": "ENVIRONMENT ", "DefaultValue": "dev"}}`.properties' 
    authentication: S3Auth 
Verwandte Themen