5

Staramy się przechowywać pliki konfiguracji aplikacji specyficzne dla środowiska w s3. Pliki są przechowywane w różnych podkatalogach, których nazwa pochodzi od środowiska, a także mają środowisko jako część nazwy pliku.AWS Elastic Beanstalk: Jak korzystać ze zmiennych środowiskowych w ebextensions?

Przykładami są

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

Środowiska elastyczny łodygi są nazywane dev stg, PRD i ewentualnie również mieć zmienną środowiska zdefiniowanego w elastyczny łodygi nazwie środowisko, które może być dev STG lub PRD .

Moje pytanie brzmi: jak mogę odwołać się do nazwy środowiska lub zmiennej środowiskowej podczas pobierania pliku konfiguracyjnego z pliku konfiguracyjnego w rozszerzeniu .ebextensions?

Próbowałem użyć referencji {"Ref": "AWSEBEnvironmentName" } w pliku .ebextensions/myapp.config, ale podczas wdrażania wystąpił błąd składni.

treści .ebextensions/myapp.config jest:

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 

Błąd pojawia się:

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. 

Co to jest poprawny sposób o przedstawieniu zmienną środowiska w .ebextensions config plik w AWS Elastic Beanstalk?

Odpowiedz

4

zmagałem się uzyskać tej pracy, dopóki nie odkryłem, że funkcja Sub nie wydaje się być dostępny w ebextensions: http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/ebextensions-functions.html

Oznacza to, że należy cofnąć się do wersji Fn::Join i Ref, przynajmniej do czasu wprowadzenia obsługi rozszerzenia Sub do rozszerzeń e-mail. Wydaje się również, że atrybut files wymaga stałej ścieżki (i nie mogłem w tym kontekście użyć Fn::Join).

Moje ogólne rozwiązanie tego był następujący:

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 

Spowoduje to w pliku application.properties (bez nazwy środowisko kwalifikacjach) w config katalogu obok wdrożonej instancji aplikacji.

Jeśli chcesz zachować nazwę środowiska jako część nazwy pliku za pomocą tego podejścia, musisz dostosować polecenie, które przenosi plik, aby użyć innego wyrażenia Fn::Join do sterowania nazwą pliku.

1

Już prawie jesteś. Rozszerzenie używa formatu YAML, podczas gdy próbujesz użyć JSON. Użyj Ref: AWSEBEnvironmentName. Ponadto, można skorzystać z funkcji, aby uniknąć Sub brzydkie Join:

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

1

Twój plik konfiguracyjny .ebextensions był prawie poprawny. Zastąpienie nazwy pliku zmienną środowiskową lub nazwą zasobu AWS nie będzie działać, ponieważ tak jak w odpowiedzi Marka, aby zmienić nazwę pliku utworzonego w sekcji container_commands.

Wartość source opcja próbuje uzyskać dostęp do nazwy zasobu AWS korzystając Ref była prawidłowa, to właśnie miał być otoczony przez pojedynczy cudzysłów ', jak poniżej:

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 

oraz uzyskać dostęp do zmiennych środowiskowych użyć Fn::GetOptionSetting. Zmienne środowiskowe są w aws:elasticbeanstalk:application:environmentnamespace.

Poniżej przykład uzyskać dostęp do zmiennej środowiskowej ENVIRONMENT w source opcją 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