5

我們正在嘗試在s3中存儲環境特定的應用程序配置文件。 這些文件存儲在以環境命名的不同子目錄中,並且還將環境作爲文件名的一部分。AWS Elastic Beanstalk:如何在ebextensions中使用環境變量?

實例是

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

彈性豆莖環境被命名爲dev的,STG,PRD以及或者我也有在彈性豆莖名爲環境中定義的環境變量可以是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 

我得到的錯誤是:

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. 

什麼是引用在.ebextensions配置環境變量的正確方法AWS Elastic Beanstalk中的文件?

回答

4

我努力得到這個工作,直到我發現子功能不會出現在ebextensions可用:http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/ebextensions-functions.html

這意味着您需要回退到Fn::JoinRef,至少在支持Sub引入ebextensions之前。它也似乎是文件屬性需要一個固定的路徑(我不能在這種情況下使用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

你幾乎有.ebextensions使用YAML格式,而你試圖使用JSON。使用Ref: AWSEBEnvironmentName。 此外,你可以採取Sub功能的優勢,避免討厭的Join

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

1

.ebextensions配置文件幾乎是正確的。使用環境變量或AWS資源名替換文件名將不起作用,因爲在Mark的回答中,將文件名重命名爲container_commands部分中創建的文件。

source選項值試圖訪問使用Ref是正確的AWS資源的名稱,它只是必須由單引號'包圍,象下面這樣:

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

下面示例訪問可變ENVIRONMENT的環境中source選項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 
相關問題