通过环境变量检索 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 密钥的任务定义。
-
在导航窗格中,选择 Task definitions(任务定义)
-
选择 Create new task definition(创建新的任务定义)、Create new task definition(创建新的任务定义)。
-
对于Task definition family(任务定义系列)中,为任务定义指定唯一名称。
-
对于在您的任务定义中定义的每个容器,请完成以下步骤。
-
对于 Name(名称),输入容器的名称。
-
对于 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:tag
或repository-url/image@digest
格式指定存储库。 -
对于Essential container(关键容器),如果您的任务定义中定义了两个或更多容器,则可以指定是否应将该容器视为关键容器。如果容器被标记为essential(关键),如果该容器停止,那么任务将停止。每个任务定义都必须至少包含一个关键容器。
-
端口映射可让容器访问主机容器上的端口以发送或接收流量。在 Port mappings(端口映射)下,请执行以下操作之一:
-
当您使用 awsvpc 网络模式时,对于 Container port(容器端口)和 Protocol(协议),选择要用于容器的端口映射。
-
当您使用 bridge 网络模式时,对于 Container port(容器端口)和 Protocol(协议),选择要用于容器的端口映射。您选择下一页上的 bridge 网络模式。选择它之后,选择 Previous(上一个),然后为 Host port(主机端口),指定要为容器预留的容器实例上的端口号。
选择 Add more port mappings(添加更多端口映射)以指定其他容器端口映射。
-
-
对于要注入为环境变量的敏感数据,请在 Environment (环境) 下,为 Environment variables (环境变量) 填写以下字段:
-
对于 Key (键),输入要在容器中设置的环境变量的名称。此选项对应于容器定义的
secrets
部分中的name
字段。 -
对于值类型,选择 ValueFrom。对于Add value (添加值),请输入包含要作为环境变量提供给容器的数据的 Secrets Manager 密钥 ARN。
-
-
(可选)选择 Add more containers(添加更多容器)将其他容器添加到任务定义。一旦定义了所有容器,即选择 Next(下一步)。
-
-
对于应用程序环境、任务大小和容器大小,填写其余的必填字段和任何可选字段。
-
(可选)展开 Task roles, network mode(任务角色、网络模式)部分指定以下内容:
-
对于 Task role(任务角色),选择要分配到任务的 IAM 角色。任务 IAM 角色为要调用 Amazon 的任务中的容器提供权限。
-
-
(可选)Storage(存储)部分用于扩展 Fargate 上托管的任务的短暂存储量,以及为该任务添加数据卷配置。
-
要将可用的短暂存储扩展到超出您的 Fargate 任务的默认值 20 GiB,请在 Amount(量)中输入一个最高为 200 GiB 的值。
-
-
对于容器的日志配置中引用的敏感数据,请在使用日志收集下,为日志配置完成以下配置:
-
选择日志选项,然后在键下选择添加。
-
对于键,输入要设置的日志配置选项的名称。
-
对于值,输入包含要作为日志选项提供给日志配置的数据的 Secrets Manager 密钥的完整 ARN。
-
对于值类型,选择 ValueFrom。
-
-
选择 Next(下一步)以查看任务定义。
-
在 Review and create(审核和创建)页面上,查看每个任务定义部分。选择 Edit (编辑) 以进行更改。任务定义完成后,选择 Create(创建)以注册任务定义。