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

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

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

注意事项

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

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

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

    • 要将密钥的完整内容注入为环境变量或注入到日志配置中,您必须使用版本 1.3.0 或更高版本的平台。有关信息,请参阅Fargate Linux 平台版本

    • 要将特定 JSON 密钥或密钥版本注入为环境变量或注入到日志配置中,您必须使用平台版本 1.4.0 或更高版本(Linux)或者 1.0.0(Windows)。有关信息,请参阅Fargate Linux 平台版本

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

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

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

  • 使用接口 VPC 端点增强安全控制。您必须为 Secrets Manager 创建接口 VPC 端点。有关 VPC 端点的信息,请参阅《Amazon Secrets Manager 用户指南》中的创建 VPC 端点

  • 对于配置为使用 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 控制台创建引用了 Secrets Manager 密钥的任务定义。

  1. https://console.aws.amazon.com/ecs/v2 打开控制台。

  2. 在导航窗格中,选择 Task definitions(任务定义)

  3. 选择 Create new task definition(创建新的任务定义)、Create new task definition(创建新的任务定义)。

  4. 对于Task definition family(任务定义系列)中,为任务定义指定唯一名称。

  5. 对于在您的任务定义中定义的每个容器,请完成以下步骤。

    1. 对于 Name(名称),输入容器的名称。

    2. 对于 Image URI(映像 URI),输入用于启动容器的映像。Amazon ECR Amazon ECR Public Gallery 注册表中的映像只能使用 Amazon ECR Public 注册表名称来指定。例如,如果 public.ecr.aws/ecs/amazon-ecs-agent:latest 已指定,则使用 Amazon ECR Public Gallery 上托管的 Amazon Linux 容器。对于所有其他存储库,请使用 repository-url/image:tagrepository-url/image@digest 格式指定存储库。

    3. 对于Essential container(关键容器),如果您的任务定义中定义了两个或更多容器,则可以指定是否应将该容器视为关键容器。如果容器被标记为essential(关键),如果该容器停止,那么任务将停止。每个任务定义都必须至少包含一个关键容器。

    4. 端口映射可让容器访问主机容器上的端口以发送或接收流量。在 Port mappings(端口映射)下,请执行以下操作之一:

      • 当您使用 awsvpc 网络模式时,对于 Container port(容器端口)和 Protocol(协议),选择要用于容器的端口映射。

      • 当您使用 bridge 网络模式时,对于 Container port(容器端口)和 Protocol(协议),选择要用于容器的端口映射。您选择下一页上的 bridge 网络模式。选择它之后,选择 Previous(上一个),然后为 Host port(主机端口),指定要为容器预留的容器实例上的端口号。

      选择 Add more port mappings(添加更多端口映射)以指定其他容器端口映射。

    5. 对于要注入为环境变量的敏感数据,请在 Environment (环境) 下,为 Environment variables (环境变量) 填写以下字段:

      1. 对于 Key (键),输入要在容器中设置的环境变量的名称。此选项对应于容器定义的 secrets 部分中的 name 字段。

      2. 对于值类型,选择 ValueFrom。对于Add value (添加值),请输入包含要作为环境变量提供给容器的数据的 Secrets Manager 密钥 ARN。

    6. (可选)选择 Add more containers(添加更多容器)将其他容器添加到任务定义。一旦定义了所有容器,即选择 Next(下一步)。

  6. 对于应用程序环境任务大小容器大小,填写其余的必填字段和任何可选字段。

  7. (可选)展开 Task roles, network mode(任务角色、网络模式)部分指定以下内容:

    1. 对于 Task role(任务角色),选择要分配到任务的 IAM 角色。任务 IAM 角色为要调用 Amazon 的任务中的容器提供权限。

  8. (可选)Storage(存储)部分用于扩展 Fargate 上托管的任务的短暂存储量,以及为该任务添加数据卷配置。

    1. 要将可用的短暂存储扩展到超出您的 Fargate 任务的默认值 20 GiB,请在 Amount(量)中输入一个最高为 200 GiB 的值。

  9. 对于容器的日志配置中引用的敏感数据,请在使用日志收集下,为日志配置完成以下配置:

    1. 选择日志选项,然后在下选择添加

    2. 对于,输入要设置的日志配置选项的名称。

    3. 对于,输入包含要作为日志选项提供给日志配置的数据的 Secrets Manager 密钥的完整 ARN。

    4. 对于值类型,选择 ValueFrom

  10. 选择 Next(下一步)以查看任务定义。

  11. Review and create(审核和创建)页面上,查看每个任务定义部分。选择 Edit (编辑) 以进行更改。任务定义完成后,选择 Create(创建)以注册任务定义。