在Elastic Beanstalk部署期间从AWS Systems Manager参数存储获取值



我在AWS Systems Manager参数存储中存储了一个数据库连接字符串,我想将其传递给Elastic Beanstalk实例的环境变量。我不想将其提交到源代码中,也不必依赖部署人员在部署时设置值或通过web控制台手动执行。

我尝试过像{{resolve:ssm:DATABASE_CONNECTION_STRING:1}}这样的动态引用(有和没有反勾号(,它们在CloudFormation堆栈中工作,但在Elastic Beanstalk配置中不工作。

我试过像一样使用container_commands

export DATABASE_CONNECTION_STRING=`aws ssm get-parameter --name DATABASE_CONNECTION_STRING --region eu-west-1 --query Parameter.Value --output text

但是Elastic Beanstalk实例没有正确的权限,我不确定如何设置它们。

我曾尝试使用files:source:从S3文件的内容创建一个文件,但出现了错误。

理想情况下,动态参考可以工作,例如.ebextensions/env.config=>

OptionSettings:
aws:elasticbeanstalk:application:environment:
DATABASE_CONNECTION_STRING: {{resolve:ssm:ANNOTATOR_DATABASE_CONNECTION_STRING:1}}

我能够通过创建包含以下内容的文件.ebextensions/options.config来实现这一点:

option_settings:
aws:elasticbeanstalk:application:environment:
ENCRYPT_CERT: '{{resolve:ssm:SOA_ENCRYPT_CERT:1}}'
ENCRYPT_KEY: '{{resolve:ssm:SOA_ENCRYPT_KEY:1}}'

我使用了files配置,它将文件从S3下载到/tmp/app.env,然后Python应用程序使用load_dotenv('/tmp/app.env')。不理想,但目前有效。

这是.ebextensions/env.config:

Resources:
AWSEBAutoScalingGroup:
Metadata:
AWS::CloudFormation::Authentication:
S3Auth:
type: "s3"
buckets: ["S3_BUCKET_NAME"]
roleName: 
"Fn::GetOptionSetting": 
Namespace: "aws:autoscaling:launchconfiguration"
OptionName: "IamInstanceProfile"
DefaultValue: "aws-elasticbeanstalk-ec2-role"
files:
"/tmp/app.env":  
mode: "444"
owner: wsgi
group: wsgi
authentication: "S3Auth"
source: https://URL_TO_S3_BUCKET/app.env

请确保将S3_BUCKET_NAMEURL_TO_S3_BUCKET更改为您的设置。

然后在Python中我使用;

if os.path.exists('/tmp/app.env'):
load_dotenv('/tmp/app.env')
else:
load_dotenv('.env')

您需要在配置文件中使用单引号,在浏览器上可以粘贴不带引号的文件。

DATABASE_CONNECTION_STRING: '{{resolve:ssm:ANNOTATOR_DATABASE_CONNECTION_STRING:1}}'

如果您更新参数,请将末尾的1更改为当前版本。因此,如果您在创建参数键后更新一次,则它将为2

最新更新