Pau*_*son 5 python amazon-web-services amazon-elastic-beanstalk
我有一个存储在 AWS Systems Manager Parameter Store 中的数据库连接字符串,我想将其传递给 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 实例没有正确的权限,我不确定如何设置它们。
我曾尝试使用 S3 文件的内容创建一个文件files:,source:但出现错误。
理想情况下,动态引用可以工作,例如.ebextensions/env.config=>
OptionSettings:
aws:elasticbeanstalk:application:environment:
DATABASE_CONNECTION_STRING: {{resolve:ssm:ANNOTATOR_DATABASE_CONNECTION_STRING:1}}
Run Code Online (Sandbox Code Playgroud)
我可以通过创建.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}}'
Run Code Online (Sandbox Code Playgroud)
我采用的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
Run Code Online (Sandbox Code Playgroud)
确保将S3_BUCKET_NAME和更改URL_TO_S3_BUCKET为您的设置。
然后在Python中我使用;
if os.path.exists('/tmp/app.env'):
load_dotenv('/tmp/app.env')
else:
load_dotenv('.env')
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1245 次 |
| 最近记录: |