5

우리는 환경 특정 응용 프로그램 구성 파일을 s3에 저장하려고합니다. 파일은 환경의 이름을 딴 다른 하위 디렉토리에 저장되며 파일 이름의 일부로 환경을 갖습니다.AWS Elastic Beanstalk : ebextensions에서 환경 변수를 사용하는 방법?

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

탄성 콩나무 환경은 명명 DEV, STG, PRD하고 대안 I은 DEV, STG 또는 PRD 될 수 탄성 콩나무라는 환경에서 정의 된 환경 변수를 가지고 .

지금 내 질문은 .ebextensions의 구성 파일에서 구성 파일을 다운로드 할 때 환경 변수 또는 환경 변수를 참조하는 방법입니다.

.ebextensions/myapp.config에서 {"Ref": "AWSEBEnvironmentName" } 참조를 사용했지만 배포시 구문 오류가 발생했습니다.

.ebextensions의 내용/myapp.config은 다음과 같습니다

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 

내가 오류는 다음과 같습니다

가 .ebextensions 설정에서 환경 변수를 참조하는 올바른 방법은 무엇입니까
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. 

AWS Elastic Beanstalk의 파일입니까?

답변

4

: http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/ebextensions-functions.html

즉, 적어도 Sub에 대한 지원이 ebextensions에 도입 될 때까지 Fn::JoinRef으로 폴백해야 함을 의미합니다. 또한 파일 특성에 고정 경로가 필요합니다 (이 경우 Fn::Join을 사용할 수 없음).

이 내 전체 솔루션은 다음과 같이했다 : 배포 된 응용 프로그램 인스턴스 옆에 config 디렉토리에

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 

이 (환경 이름 규정이없는)을 application.properties 파일에 발생합니다.

이 접근법을 사용하여 파일 이름의 일부로 환경 이름을 유지하려면 파일 이름을 제어하기 위해 다른 Fn::Join 표현식을 사용하도록 파일을 이동시키는 명령을 조정해야합니다.

1

거의 다 왔어. JSON을 사용하려고하는 동안 .ebextensions가 YAML 형식을 사용하고있다. Ref: AWSEBEnvironmentName을 사용하십시오. 또한, 당신이 피하기 위해 Sub 기능을 활용할 수 성가신 Join : 나는 하위 기능 ebextensions을 사용할 수없는 것으로 보입니다 것을 발견 할 때까지 나는이 작업을 진행하기 위해 노력

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

1

.ebextensions 구성 파일이 거의 정확했습니다. 파일 이름을 환경 변수 또는 AWS 자원 이름으로 대체하는 것은 작동하지 않습니다. 이는 Mark의 대답 에서처럼 container_commands 섹션에서 생성 된 파일의 이름을 바꾸는 것과 같습니다.

Ref이 옳았다 사용하여 AWS 리소스 이름에 액세스하려고 source 옵션 값, 그냥 아래처럼 작은 따옴표 '에 둘러싸여했다 :

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 

그리고 액세스 할 수있는 환경 변수가 Fn::GetOptionSetting를 사용합니다. 환경 변수는 aws:elasticbeanstalk:application:environmentnamespace입니다.

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 
예를 아래

filessource 옵션에 ENVIRONMENT 변수 환경에 액세스