在 Elastic Beanstalk 部署期间从 AWS Systems Manager Parameter Store 获取价值

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)

gre*_*dev 7

我可以通过创建.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)


Pau*_*son 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
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)