【问题标题】:How to set environment variables from platform hooks in elastic beanstalk?如何从弹性beantalk中的平台挂钩设置环境变量?
【发布时间】:2021-11-21 05:31:56
【问题描述】:

我正在尝试使用弹性 beantalk 部署 django 应用程序。应用程序使用环境变量连接到数据库。

DATABASES = {
  'default': {
    'ENGINE': 'django.db.backends.mysql',
    'NAME': os.environ['RDS_DB_NAME'],
    'USER': os.environ['RDS_USERNAME'],
    'PASSWORD': os.environ['RDS_PASSWORD'],
    'HOST': os.environ['RDS_HOSTNAME'],
    'PORT': os.environ['RDS_PORT'],
  }
}

我不想在 EB 控制台或 option_settings 中显式设置这些变量,因为它们会以纯文本形式出现在 EB 控制台中。

RDS 凭证存储在 AWS Secrets Manager 中。由于 EB 还不支持 AWS 密钥管理器,我编写了一个平台挂钩来获取密钥并将凭证导出为环境变量。

django_app/.platform/hooks/prebuild/set_db_credentials.sh

#!/bin/sh

# fetch secrets from secrets manager and store in db_credentials.json
aws secretsmanager get-secret-value --secret-id="$RDS_SECRETS_ID" --region="$RDS_SECRETS_REGION" --query=SecretString --output text > db_credentials.json

# export as environment variables
export RDS_HOSTNAME="$(jq -r '.host' db_credentials.json)"
export RDS_PORT="$(jq -r '.port' db_credentials.json)"
export RDS_USERNAME="$(jq -r '.username' db_credentials.json)"
export RDS_PASSWORD="$(jq -r '.password' db_credentials.json)"
export RDS_DB_NAME="$(jq -r '.dbname' db_credentials.json)"

rm db_credentials.json

钩子运行良好,但应用程序无法使用环境变量。有谁知道怎么做?

【问题讨论】:

    标签: amazon-web-services amazon-ec2 amazon-elastic-beanstalk aws-secrets-manager


    【解决方案1】:

    您可以使用 EB 挂钩动态创建 aws:elasticbeanstalk:application:environment .ebextensions 配置文件。

    因此,我们的想法是在 EB 读取和执行您的 .ebextensions 文件之前,使用其中一个 EB 挂钩为 env 变量创建正确的 .ebextensions 文件。

    【讨论】:

    • 哇!我从来没想过,谢谢。但是以这种方式设置会使凭据在 EB 控制台中可见......还有其他方法吗?
    • @GowthamBhat 不确定。自己没试过。暂时想不出别的办法。通常是您的应用程序使用 aws sdk 来获取凭据。你可以修改你的应用来做到这一点吗?
    • 是的,我可以试试。我不愿意更改那部分,因为它是使用 EB 附加 RDS 实例时的标准代码
    • @GowthamBhat 如果您尝试,请告诉我结果如何。
    • @GowthamBhat 进展如何?你成功了吗?
    【解决方案2】:

    一个变通的解决方案是将您的秘密保存在钩子内的配置文件中。在 bash 脚本中设置变量将不起作用,因为 Elastic Beanstalk 可能会在不同的 shell 中运行钩子(并且到目前为止不支持秘密管理)。

    例如,如果您使用 docker(或任何自动从“.env”文件读取 env 变量的平台),here 描述的解决方案将起作用。将其保存到 .ebextensions 中也可能是一种解决方案,但它似乎不适用于 docker 平台。

    【讨论】:

      猜你喜欢
      • 2020-02-13
      • 1970-01-01
      • 1970-01-01
      • 2021-01-07
      • 2017-01-17
      • 1970-01-01
      • 2017-07-15
      • 2016-09-01
      • 1970-01-01
      相关资源
      最近更新 更多