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

问题描述 投票:0回答:4

我有一个存储在 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
4个回答
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}}'

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_NAME
URL_TO_S3_BUCKET
更改为您的设置。

然后在Python中我使用;

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

1
投票

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

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

如果更新参数,请将末尾的

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


0
投票

我按照以下步骤解决了类似的问题:

关注了这两篇文章:

创建了 .ebextensions nv-variables.config 项目根目录中的文件包含以下内容:

container_commands:
    setvars:
        command: /opt/elasticbeanstalk/bin/get-config environment | jq -r 'to_entries | .[] | "export \(.key)=\"\(.value)\""' > /etc/profile.d/local.sh
packages:
    yum:
        jq: []

转至 Elastic Beanstalk > 环境 > [您的环境] > 配置 > 更新、监控和日志记录 > 环境属性。

  • 根据需要提供 .env 变量和值
© www.soinside.com 2019 - 2024. All rights reserved.