使用Elastic Beanstalk .config
文件有点......很有趣。我正在尝试在Elastc Beanstalk files:
文件中使用带有.config
配置选项的环境属性。我想做的是:
files:
"/etc/passwd-s3fs" :
mode: "000640"
owner: root
group: root
content: |
${AWS_ACCESS_KEY_ID}:${AWS_SECRET_KEY}
创建包含以下内容的/etc/passwd-s3fs
文件:
ABAC73E92DEEWEDS3FG4E:aiDSuhr8eg4fHHGEMes44zdkIJD0wkmd
即。使用AWS控制台(Elastic Beanstalk/Configuration/Software Configuration/Environment Properties
)中定义的环境属性来初始化系统配置文件等。
我发现可以在container-command:
中使用环境属性,如下所示:
container_commands:
000-create-file:
command: echo ${AWS_ACCESS_KEY_ID}:${AWS_SECRET_KEY} > /etc/passwd-s3fs
但是,这样做需要我手动设置所有者,组,文件权限等。处理比Files:
配置选项更大的配置文件时,这也更麻烦...
有人对此有任何提示吗?
答案 0 :(得分:3)
这样的事情怎么样?我将使用“上下文”一词来表示开发与qa。
为每个上下文创建一个文件:
<强> DEV-envvars中强>
export MYAPP_IP_ADDR=111.222.0.1
export MYAPP_BUCKET=dev
<强> QA-envvars中强>
export MYAPP_IP_ADDR=111.222.1.1
export MYAPP_BUCKET=qa
将这些文件上传到私人S3文件夹,S3:// myapp / config。
在IAM中,将策略添加到aws-elasticbeanstalk-ec2-role角色,该角色允许读取S3:// myapp / config。
将以下文件添加到.ebextensions目录:
<强> envvars.config 强>
files:
"/opt/myapp_envvars" :
mode: "000644"
owner: root
group: root
# change the source when you need a different context
#source: https://s3-us-west-2.amazonaws.com/myapp/dev-envvars
source: https://s3-us-west-2.amazonaws.com/myapp/qa-envvars
Resources:
AWSEBAutoScalingGroup:
Metadata:
AWS::CloudFormation::Authentication:
S3Access:
type: S3
roleName: aws-elasticbeanstalk-ec2-role
buckets: myapp
commands:
# commands executes after files per
# http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers-ec2.html
10-load-env-vars:
command: . /opt/myapp_envvars
根据AWS Developer's Guide,命令“在设置应用程序和Web服务器之前运行并提取应用程序版本文件”,以及容器命令之前。我想问题是,在启动过程中是否足够早,以便在需要时使环境变量可用。我实际上编写了一个init.d脚本来启动和停止我的EC2实例中的事情。我使用上面的技术来部署脚本。
允许从安全S3下载的“资源”部分的信用到2014年5月7日Joshua @ AWS发布到this thread的帖子。
答案 1 :(得分:2)
我认为在部署应用之前您已知道AWS_ACCESS_KEY_ID
和AWS_SECRET_KEY
。
您可以在工作站上创建该文件,并使用$ git aws.push
$ cd .ebextensions
$ echo 'ABAC73E92DEEWEDS3FG4E:aiDSuhr8eg4fHHGEMes44zdkIJD0wkmd' > passwd-s3fs
在.config中:
files:
"/etc/passwd-s3fs" :
mode: "000640"
owner: root
group: root
container_commands:
10-copy-passwords-file:
command: "cat .ebextensions/passwd-s3fs > /etc/passwd-s3fs"
您可能必须使用权限或执行cat
作为sudo
。另外,我将文件放入.ebextensions例如,它可以在项目的任何位置。
希望它有所帮助。
答案 2 :(得分:1)
我很沮丧,但是因为我在旅途中偶然发现了这一点,所以有一个聪明的&#34;至少在2018年,至少从2016年起的方式做你所描述的 - 。您可以使用get-config按键检索环境变量:
/opt/elasticbeanstalk/bin/get-config environment --key YOUR_ENV_VAR_KEY
同样所有环境变量都有(如JSON或--output YAML
)
/opt/elasticbeanstalk/bin/get-config environment
容器命令中的示例用法:
container_commands:
00_store_env_var_in_file_and_chmod:
command: "/opt/elasticbeanstalk/bin/get-config environment --key YOUR_ENV_KEY | install -D /dev/stdin /etc/somefile && chmod 640 /etc/somefile"
文件中的示例用法:
files:
"/opt/elasticbeanstalk/hooks/appdeploy/post/00_do_stuff.sh":
mode: "000755"
owner: root
group: root
content: |
#!/bin/bash
YOUR_ENV_VAR=$(source /opt/elasticbeanstalk/bin/get-config environment --key YOUR_ENV_VAR_KEY)
echo "Hello $YOUR_ENV_VAR"
Thomas Reggi在https://serverfault.com/a/771067中介绍了get-config。