通过 Amazon ECS 环境变量检索 Secrets Manager 密钥 - Amazon Elastic Container Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

通过 Amazon ECS 环境变量检索 Secrets Manager 密钥

将密钥注入为环境变量时,可以指定密钥的完整内容、密钥中的特定 JSON 密钥或要注入的密钥的特定版本。这将帮助您控制提供给容器的敏感数据。有关密钥版本控制的更多信息,请参阅《Amazon Secrets Manager 用户指南》中的 Amazon Secrets Manager 的主要术语和概念

在使用环境变量将 Secrets Manager 密钥注入容器时,应考虑以下事项。

  • 最初启动容器时,会将敏感数据注入容器中。如果随后更新或轮换密钥,则容器将不会自动接收更新后的值。您必须启动新任务,或者如果您的任务是服务的一部分,则可以更新服务并使用强制新部署选项来强制服务启动新任务。

  • 对于 Amazon Fargate 上的 Amazon ECS 任务,应注意以下事项:

  • 对于 EC2 上的 Amazon ECS 任务,应注意以下事项:

    • 要使用特定的 JSON 密钥或密钥版本注入密钥,容器实例必须具有版本 1.37.0 或更高版本的容器代理。但是,我们建议使用最新的容器代理版本。有关检查您的代理版本并更新到最新版本的信息,请参阅更新 Amazon ECS 容器代理

      要将密钥的完整内容注入为环境变量或将密钥注入日志配置中,您的容器实例必须具有版本 1.22.0 或更高版本的容器代理。

  • 使用接口 VPC 端点增强安全控制措施,并通过私有子网连接到 Secrets Manager。您必须为 Secrets Manager 创建接口 VPC 端点。有关 VPC 端点的信息,请参阅《Amazon Secrets Manager 用户指南》中的创建 VPC 端点。有关使用 Secrets Manager 和 Amazon VPC 的更多信息,请参阅如何在 Amazon VPC 内连接到 Secrets Manager 服务

  • 对于配置为使用 awslogs 日志记录驱动程序的 Windows 任务,您还必须在容器实例上设置 ECS_ENABLE_AWSLOGS_EXECUTIONROLE_OVERRIDE 环境变量。可使用以下语法对用户数据执行此操作:

    <powershell> [Environment]::SetEnvironmentVariable("ECS_ENABLE_AWSLOGS_EXECUTIONROLE_OVERRIDE", $TRUE, "Machine") Initialize-ECSAgent -Cluster <cluster name> -EnableTaskIAMRole -LoggingDrivers '["json-file","awslogs"]' </powershell>

IAM 权限

要使用此功能,您必须具有 Amazon ECS 任务执行角色,并在任务定义中引用它。有关更多信息,请参阅 Amazon ECS 任务执行 IAM 角色

要提供对您创建的 Secrets Manager 密钥的访问权限,请将以下权限作为内联策略手动添加到任务执行角色。有关更多信息,请参阅添加和删除 IAM policy

  • secretsmanager:GetSecretValue–在引用 Secrets Manager 密钥时需要。添加从 Secrets Manager 中检索密钥的权限。

  • kms:Decrypt – 仅当您的密钥使用客户托管键而不是默认键时才需要。您的客户托管键的 ARN 应添加为资源。添加解密客户托管密钥的权限。

以下示例策略添加了所需的权限:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "secretsmanager:GetSecretValue", "kms:Decrypt" ], "Resource": [ "arn:aws:secretsmanager:region:aws_account_id:secret:secret_name", "arn:aws:kms:region:aws_account_id:key/key_id" ] } ] }

创建 Amazon Secrets Manager 密钥

您可以使用 Secrets Manager 控制台为您的敏感数据创建密钥。有关更多信息,请参阅《Amazon Secrets Manager 用户指南》中的创建 Amazon Secrets Manager 密钥

将环境变量添加到容器定义中

在容器定义中,可以指定以下内容:

  • secrets 对象,该对象包含要在容器中设置的环境变量名称

  • Secrets Manager 密钥的 Amazon Resource Name (ARN)。

  • 其他参数,这些参数包含要提供给容器的敏感数据

以下示例显示必须为 Secrets Manager 密钥指定的完整语法。

arn:aws:secretsmanager:region:aws_account_id:secret:secret-name:json-key:version-stage:version-id

下一部分介绍了其他参数。这些参数是可选的,但如果不使用它们,则必须包含冒号 : 以使用默认值。下面提供了示例,以便您了解更多上下文。

json-key

使用要设置为环境变量值的值指定密钥-值对中密钥的名称。仅支持 JSON 格式的值。如果未指定 JSON 密钥,则使用密钥的完整内容。

version-stage

指定要使用的密钥版本的暂存标签。如果指定了版本的暂存标签,则无法指定版本 ID。如果未指定版本阶段,则默认行为是使用 AWSCURRENT 暂存标签检索密钥。

暂存标签用于在更新或轮换密钥的各个版本时对其进行跟踪。密钥的每个版本均有一个或多个暂存标签和一个 ID。有关更多信息,请参阅 Amazon Secrets Manager 用户指南中的 Amazon Secrets Manager 主要术语和概念。

version-id

指定要使用的密钥版本的唯一标识符。如果指定了版本 ID,则无法指定版本暂存标签。如果未指定版本 ID,则默认行为是使用 AWSCURRENT 暂存标签检索密钥。

版本 ID 用于在更新或轮换密钥的各个版本时对其进行跟踪。密码的每个版本均有一个 ID。有关更多信息,请参阅 Amazon Secrets Manager 用户指南中的 Amazon Secrets Manager 主要术语和概念。

示例容器定义

以下示例说明了可用于在容器定义中引用 Secrets Manager 密钥的方法。

例 引用完整密钥

以下是任务定义的片段,其中显示引用 Secrets Manager 密钥的完全文本时的格式。

{ "containerDefinitions": [{ "secrets": [{ "name": "environment_variable_name", "valueFrom": "arn:aws:secretsmanager:region:aws_account_id:secret:secret_name-AbCdEf" }] }] }

要从容器中访问此密钥的值,需要调用 $environment_variable_name

例 引用密钥中的特定密钥

下面显示了 get-secret-value 命令中的示例输出,其中显示了密钥的内容以及与之关联的版本暂存标签和版本 ID。

{ "ARN": "arn:aws:secretsmanager:region:aws_account_id:secret:appauthexample-AbCdEf", "Name": "appauthexample", "VersionId": "871d9eca-18aa-46a9-8785-981ddEXAMPLE", "SecretString": "{\"username1\":\"password1\",\"username2\":\"password2\",\"username3\":\"password3\"}", "VersionStages": [ "AWSCURRENT" ], "CreatedDate": 1581968848.921 }

通过在 ARN 的末尾指定密钥名称,引用容器定义中的上一个输出中的特定密钥。

{ "containerDefinitions": [{ "secrets": [{ "name": "environment_variable_name", "valueFrom": "arn:aws:secretsmanager:region:aws_account_id:secret:appauthexample-AbCdEf:username1::" }] }] }
例 引用特定的密钥版本

下面显示了 describe-secret 命令中的示例输出,其中显示了密钥的未加密内容以及密钥的所有版本的元数据。

{ "ARN": "arn:aws:secretsmanager:region:aws_account_id:secret:appauthexample-AbCdEf", "Name": "appauthexample", "Description": "Example of a secret containing application authorization data.", "RotationEnabled": false, "LastChangedDate": 1581968848.926, "LastAccessedDate": 1581897600.0, "Tags": [], "VersionIdsToStages": { "871d9eca-18aa-46a9-8785-981ddEXAMPLE": [ "AWSCURRENT" ], "9d4cb84b-ad69-40c0-a0ab-cead3EXAMPLE": [ "AWSPREVIOUS" ] } }

通过在 ARN 的末尾指定密钥名称,引用容器定义中的上一个输出中的特定版本暂存标签。

{ "containerDefinitions": [{ "secrets": [{ "name": "environment_variable_name", "valueFrom": "arn:aws:secretsmanager:region:aws_account_id:secret:appauthexample-AbCdEf::AWSPREVIOUS:" }] }] }

通过在 ARN 的末尾指定密钥名称,引用容器定义中的上一个输出中的特定版本 ID。

{ "containerDefinitions": [{ "secrets": [{ "name": "environment_variable_name", "valueFrom": "arn:aws:secretsmanager:region:aws_account_id:secret:appauthexample-AbCdEf:::9d4cb84b-ad69-40c0-a0ab-cead3EXAMPLE" }] }] }
例 引用密钥的特定密钥和版本暂存标签

以下内容说明如何同时引用密钥中的特定密钥和特定版本暂存标签。

{ "containerDefinitions": [{ "secrets": [{ "name": "environment_variable_name", "valueFrom": "arn:aws:secretsmanager:region:aws_account_id:secret:appauthexample-AbCdEf:username1:AWSPREVIOUS:" }] }] }

要指定特定密钥和版本 ID,请使用以下语法。

{ "containerDefinitions": [{ "secrets": [{ "name": "environment_variable_name", "valueFrom": "arn:aws:secretsmanager:region:aws_account_id:secret:appauthexample-AbCdEf:username1::9d4cb84b-ad69-40c0-a0ab-cead3EXAMPLE" }] }] }

有关如何使用环境变量中指定的密钥创建任务定义的信息,请参阅 使用控制台创建 Amazon ECS 任务定义