【问题标题】:Get value from AWS Systems Manager Parameter Store during Elastic Beanstalk deploy在 Elastic Beanstalk 部署期间从 AWS Systems Manager Parameter Store 获取价值
【发布时间】:2020-07-01 18:25:44
【问题描述】:

我有一个存储在 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 实例没有正确的权限,我不确定如何设置它们。

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

理想情况下,动态引用会起作用,例如.ebextensions/env.config =>

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

【问题讨论】:

    标签: python amazon-web-services amazon-elastic-beanstalk


    【解决方案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}}'
    

    【讨论】:

    • 您必须通过哪些权限步骤才能完成这项工作?
    • @John23 我使用 Bitbucket Pipelines 进行部署;用户拥有 AmazonSSMReadOnlyAccess 和 AWSElasticBeanstalkFullAccess 权限
    【解决方案2】:

    我使用了 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')
    

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2020-07-22
        • 2019-04-02
        • 2022-10-09
        • 1970-01-01
        • 2015-09-20
        • 2020-08-02
        • 2014-12-25
        • 2020-08-16
        • 1970-01-01
        相关资源
        最近更新 更多