为 Elastic Beanstalk 环境变量获取密钥与参数 - AWS Elastic Beanstalk

为 Elastic Beanstalk 环境变量获取密钥与参数

Elastic Beanstalk 可以在实例引导期间从 AWS Secrets Manager 和 AWS Systems Manager Parameter Store 中获取值,并将它们分配给环境变量以供您的应用程序使用。

以下要点总结了使用环境变量作为密钥的配置、同步与访问方式:

  • 通过指定环境变量将存储的密钥和参数对应的 Amazon 资源名称(ARN)来配置存储密钥信息的环境变量。

  • 在 Secrets Manager 或 Systems Manager Parameter Store 中更新或轮换密钥值后,您必须手动刷新环境变量。

  • 密钥环境变量可用于 ebextension 容器命令和平台钩子

支持的平台版本

2025 年 3 月 26 日当天或之后发布的平台版本支持将 AWS Secrets Manager 密钥和 AWS Systems Manager Parameter Store 参数配置为环境变量。

注意

除基于 Docker 和 ECS 的 Docker 平台外,Amazon Linux 2 平台版本均不支持多行变量值。有关多行变量支持的更多信息,请参阅多行值

定价

使用 Secrets Manager 和 Systems Manager Parameter Store 需支付标准费用。有关定价的更多信息,请参阅以下网站:

对于应用程序通过环境变量引用的环境密钥,Elastic Beanstalk 不会收取额外费用。但 Elastic Beanstalk 代您向这些服务发起的 API 请求仍需支付标准费用。

将密钥配置为 Elastic Beanstalk 环境变量

您可以通过 Elastic Beanstalk 控制台、.ebextensions 中的配置文件、AWS CLI 和 AWS SDK 将密钥和参数配置为环境变量。

先决条件

在设置环境变量以引用密钥之前,首先需要完成以下步骤。

配置环境变量前的通用准备工作
  1. 创建 Secrets Manager 密钥或 Parameter Store 参数来存储您的敏感数据。有关更多信息,请参阅下列两个主题或其中之一:

  2. 为您环境的 EC2 实例设置所需的 IAM 权限以获取密钥和参数。有关更多信息,请参阅 所需的 IAM 权限

使用控制台

您可以通过 Elastic Beanstalk 控制台将密钥配置为环境变量。

通过 Elastic Beanstalk 控制台将密钥配置为环境变量
  1. 打开 Elastic Beanstalk 控制台,然后在 Regions(区域)列表中选择您的 AWS 区域。

  2. 在导航窗格中,选择 Environments(环境),然后从列表中选择环境的名称。

  3. 在导航窗格中,选择 Configuration(配置)。

  4. Updates, monitoring, and logging(更新、监控和日志记录)配置类别中,选择 Edit(编辑)。

  5. 向下滚动到运行时环境变量

  6. 选择添加环境变量

  7. 对于来源,选择 Secrets ManagerSSM Parameter Store

    注意

    有关下拉列表中纯文本选项的更多信息,请参阅配置环境属性(环境变量)

  8. 对于环境变量名称,输入用于保存密钥或参数值的环境变量名称。

  9. 对于环境变量值,输入 Systems Manager Parameter Store 参数或 Secrets Manager 密钥的 ARN。在实例引导期间,Elastic Beanstalk 会将您在步骤 8 中输入的变量值初始化为存储在此 ARN 资源中的值。

    控制台会验证您输入的值对您在步骤 7 中选择的存储是否是有效的 ARN 格式。但是,它不会验证 ARN 指定的资源是否存在,也不会验证您是否拥有访问该资源所需的 IAM 权限

  10. 如需添加更多变量,请重复步骤 6步骤 9

  11. 要保存更改,请选择页面底部的 Apply(应用)。

使用 .ebextensions 中的文件进行配置

您可以通过 Elastic Beanstalk 配置文件将密钥配置为环境变量。使用 aws:elasticbeanstalk:application:environmentsecrets 命名空间定义环境属性。

例 :用于环境密钥的 .ebextensions/options.config(速记语法
option_settings: aws:elasticbeanstalk:application:environmentsecrets: MY_SECRET: arn:aws:secretsmanager:us-east-1:111122223333:secret:mysecret MY_PARAMETER: arn:aws:ssm:us-east-1:111122223333:parameter/myparam
例 :用于环境密钥的 .ebextensions/options.config(标准语法
option_settings: - namespace: aws:elasticbeanstalk:application:environmentsecrets option_name: MY_SECRET value: arn:aws:secretsmanager:us-east-1:111122223333:secret:mysecret - namespace: aws:elasticbeanstalk:application:environmentsecrets option_name: MY_PARAMETER value: arn:aws:ssm:us-east-1:111122223333:parameter/myparam

使用 AWS CLI 进行配置

您可以通过 AWS 命令行界面(AWS CLI)将密钥配置为 Elastic Beanstalk 环境变量。本节提供包含 aws:elasticbeanstalk:application:environmentsecrets 命名空间 create-environmentupdate-environment 命令的示例。Elastic Beanstalk 为这些命令所引用的环境引导 EC2 实例时,它会使用获取的密钥和参数值来初始化环境变量。它从 Secrets Manager 和 Systems Manager Parameter Store 相应的 ARN 中获取这些值。

以下两个示例使用 create-environment 命令分别添加一个密钥和一个参数,并将其配置为名为 MY_SECRETMY_PARAMETER 的环境变量。

例 :使用 create-environment 命令将密钥配置为环境变量(内联命名空间选项)
aws elasticbeanstalk create-environment \ --region us-east-1 \ --application-name my-app \ --environment-name my-env \ --solution-stack-name "64bit Amazon Linux 2023 v6.5.0 running Node.js 20" \ --option-settings \ Namespace=aws:elasticbeanstalk:application:environmentsecrets,OptionName=MY_SECRET,Value=arn:aws:secretsmanager:us-east-1:111122223333:secret:mysecret \ Namespace=aws:elasticbeanstalk:application:environmentsecrets,OptionName=MY_PARAMETER,Value=arn:aws:ssm:us-east-1:111122223333:parameter/myparam

作为替代方法,请使用 options.json 文件来指定命名空间选项,而不是将其内联。

例 :使用 create-environment 命令将密钥配置为环境变量(options.json 文件中的命名空间选项)
aws elasticbeanstalk create-environment \ --region us-east-1 \ --application-name my-app \ --environment-name my-env \ --solution-stack-name "64bit Amazon Linux 2023 v6.5.0 running Node.js 20" \ --option-settings file://options.json
### example options.json ### [ { "Namespace": "aws:elasticbeanstalk:application:environmentsecrets", "OptionName": "MY_SECRET", "Value": "arn:aws:secretsmanager:us-east-1:111122223333:secret:mysecret" }, { "Namespace": "aws:elasticbeanstalk:application:environmentsecrets", "OptionName": "MY_PARAMETER", "Value": "arn:aws:ssm:us-east-1:111122223333:parameter/myparam" } ]

下一个示例配置名为 MY_SECRETMY_PARAMETER 的环境变量,以存储现有环境的密钥和参数。update-environment 命令会传递与 create-environment 命令语法相同的选项,既支持内联方式传入参数,也支持通过 options.json 文件进行配置。以下示例展示了使用与之前示例相同的 options.json 文件来执行命令。

例 :使用 update-environment 命令将密钥配置为环境变量(options.json 文件中的命名空间选项)
aws elasticbeanstalk update-environment \ --region us-east-1 \ --application-name my-app \ --environment-name my-env \ --solution-stack-name "64bit Amazon Linux 2023 v6.5.0 running Node.js 20" \ --option-settings file://options.json

使用 AWS SDK 进行配置

通过 AWS SDK 将密钥或参数配置为环境变量。与上一节中提到的 update-environmentcreate-environmentAWS CLI 命令类似,您也可以使用 CreateEnvironment 和 UpdateEnvironment API 操作。使用 OptionSettings 请求参数来指定 aws:elasticbeanstalk:application:environmentsecrets 命名空间的选项。

将密钥与 Elastic Beanstalk 环境变量同步的最佳实践

本主题为您推荐在应用程序中将环境密钥与 Secrets Manager 或 Systems Manager Parameter Store 配合使用时的最佳实践。如果密钥存储数据更新或轮换,您的 Elastic Beanstalk 应用程序将不会自动接收更新后的值。Elastic Beanstalk 仅会在实例引导时将密钥提取到环境变量中。

刷新环境变量

要触发您的 Elastic Beanstalk 环境从密钥存储中重新获取密钥的最新值,建议您运行 UpdateEnvironmentRestartAppServer 操作。您可以通过 Elastic Beanstalk 控制台、AWS CLI 或 Elastic Beanstalk API 运行这些操作。有关更多信息,请参阅 Elastic Beanstalk 的 AWS CLI 示例或《AWS Elastic Beanstalk API 参考》。https://docs.aws.amazon.com/elasticbeanstalk/latest/api/

管理自动扩缩对密钥同步的影响

如果在密钥存储更新后发生横向扩展事件或实例替换,则出现的新实例将具有来自 Secrets Manager 或 Systems Manager Parameter Store 的最新密钥值。即使并非环境中的所有其他实例都已刷新以检索新密钥,也可能发生此类事件。

重要

必须确保您的应用程序能够处理同一环境变量对应两个不同密钥值的情况。这种设计旨在应对以下场景:当 Secrets Manager 或 Systems Manager Parameter Store 中的密钥完成更新后,您的环境可能正在进行横向扩展或实例替换,而其他实例的环境变量尚未刷新。在此刷新等待期间,并非环境中所有实例的密钥存储环境变量都会具有相同的值。

这种应用场景的一个例子就是数据库凭证轮换。当凭证轮换之后出现横向扩展事件时,新引导的实例引用的环境密钥包含更新后的数据库凭证。但是,现有实例引用的环境密钥会保留旧值,直到通过 UpdateEnvironmentRestartAppServer 操作刷新。

Amazon Linux 2 环境变量中的多行值

多行值由多行文本组成,包含一个换行符。除基于 Docker 和 ECS 的 Docker 平台外,在 Amazon Linux 2 上运行的平台均不支持多行变量值

注意

如果 Elastic Beanstalk 检测到多行值,将导致相关环境部署失败。

针对多行值问题,可参考以下替代方法或解决方案:

  • 从 Amazon Linux 2 环境升级到 Amazon Linux 2023。有关更多信息,请参阅 从 Amazon Linux 2 迁移到 Amazon Linux 2023

  • 从密钥值中删除换行符。方案一:将值进行 Base64 编码,然后存入密钥存储。应用程序从环境密钥变量获取值后,需执行解码将值还原为原始格式。

  • 设计应用程序代码,使其可以直接从 Secrets Manager 或 Systems Manager Parameter Store 检索数据。有关更多信息,请参阅使用 Secrets Manager中的检索密钥使用 Systems Manager Parameter Store中的检索参数