AWS Elastic Beanstalk:如何在 ebextensions 中使用环境变量?
Posted
技术标签:
【中文标题】AWS Elastic Beanstalk:如何在 ebextensions 中使用环境变量?【英文标题】:AWS Elastic Beanstalk: How to use environment variables in ebextensions? 【发布时间】:2017-07-21 00:25:48 【问题描述】:我们正在尝试将环境特定的应用程序配置文件存储在 s3 中。 这些文件存储在不同的子目录中,这些子目录以环境命名,并且环境也作为文件名的一部分。
例子是
dev/application-dev.properties
stg/application-stg.properties
prd/application-prd.properties
Elastic Beanstalk 环境被命名为 dev、stg、prd,或者我还在 Elastic Beanstalk 中定义了一个名为 ENVIRONMENT 的环境变量,它可以是 dev、stg 或 prd .
我现在的问题是,从 .ebextensions 中的配置文件下载配置文件时,如何引用环境名称或 ENVIRONMENT 变量?
我尝试在 .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.
在 AWS Elastic Beanstalk 的 .ebextensions 配置文件中引用环境变量的正确方法是什么?
【问题讨论】:
【参考方案1】:您快到了 .ebextensions 正在使用 YAML 格式,而您正在尝试使用 JSON。使用Ref: AWSEBEnvironmentName
。
另外,你可以利用Sub
功能来避免讨厌Join
:
!Sub "/config/application-$AWSEBEnvironmentName.properties"
【讨论】:
【参考方案2】:我努力让它工作,直到我发现 Sub 函数似乎在 ebextensions 中不可用:http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/ebextensions-functions.html
这意味着您需要退回到Fn::Join
和Ref
,至少在ebextensions 引入对Sub
的支持之前。似乎 files 属性需要一个固定的路径(在这种情况下我不能使用Fn::Join
)。
我对此的总体解决方案如下:
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
这将在部署的应用程序实例旁边的config
目录中生成一个application.properties
文件(没有环境名称限定符)。
如果您想使用此方法将环境名称保留为文件名的一部分,则需要调整移动文件的命令以使用另一个 Fn::Join
表达式来控制文件名。
【讨论】:
【参考方案3】:您的.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:environment
namespace。
以下示例在files
的source
选项中访问环境变量ENVIRONMENT
:
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
【讨论】:
这是不正确的,这给出了服务:AmazonCloudFormation,消息:模板格式错误:模板的资源块中未解决的资源依赖项 [AWS_ENVIRONMENT]以上是关于AWS Elastic Beanstalk:如何在 ebextensions 中使用环境变量?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 AWS Elastic Beanstalk 上修改 Nginx 配置
如何在 AWS Elastic Beanstalk 上设置 HTTPS
如何在 AWS Elastic Beanstalk 上设置 HTTPS
如何在 AWS Elastic Beanstalk 中更改数据库配置