通过 Amazon ECS 环境变量检索 Systems Manager 参数
您可以使用 Amazon ECS 向容器中注入敏感数据,方法是将您的敏感数据存储在 Amazon Systems Manager Parameter Store 参数中,然后在容器定义中引用它们。
在使用环境变量将 Systems Manager 密钥注入容器时,请考虑以下事项。
-
最初启动容器时,会将敏感数据注入容器中。如果随后更新或轮换密钥,则容器将不会自动接收更新后的值。您必须启动新任务,或者如果您的任务是服务的一部分,则可以更新服务并使用强制新部署选项来强制服务启动新任务。
-
对于 Amazon Fargate 上的 Amazon ECS 任务,应注意以下事项:
-
要将密钥的完整内容注入为环境变量或注入到日志配置中,您必须使用版本
1.3.0
或更高版本的平台。有关信息,请参阅适用于 Amazon ECS 的 Fargate Linux 平台版本。 -
要将特定 JSON 密钥或密钥版本注入为环境变量或注入到日志配置中,您必须使用平台版本
1.4.0
或更高版本(Linux)或者1.0.0
(Windows)。有关信息,请参阅适用于 Amazon ECS 的 Fargate Linux 平台版本。
-
-
对于 EC2 上的 Amazon ECS 任务,应注意以下事项:
-
要使用特定的 JSON 密钥或密钥版本注入密钥,容器实例必须具有版本
1.37.0
或更高版本的容器代理。但是,我们建议使用最新的容器代理版本。有关检查您的代理版本并更新到最新版本的信息,请参阅更新 Amazon ECS 容器代理。要将密钥的完整内容注入为环境变量或将密钥注入日志配置中,您的容器实例必须具有版本
1.22.0
或更高版本的容器代理。
-
-
使用接口 VPC 端点增强安全控制。您必须为 Systems Manager 创建接口 VPC 端点。有关 VPC 端点的信息,请参阅《Amazon Systems 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 任务执行角色,并在任务定义中引用它。这允许容器代理提取必要的 Systems Manager 资源。有关更多信息,请参阅 Amazon ECS 任务执行 IAM 角色。
重要
对于使用 EC2 启动类型的任务,必须使用 ECS 代理配置变量 ECS_ENABLE_AWSLOGS_EXECUTIONROLE_OVERRIDE=true
才能使用此功能。您可以在创建容器实例的过程中将其添加到 ./etc/ecs/ecs.config
文件中,也可以将其添加到现有实例中,然后重新启动 ECS 代理。有关更多信息,请参阅 Amazon ECS 容器代理配置。
要提供对您创建的 Systems Manager Parameter Store 参数的访问权限,请将以下权限手动添加到任务执行角色。有关如何管理权限的信息,请参阅《IAM 用户指南》中的添加和删除 IAM 身份权限。
-
ssm:GetParameters
— 当您在任务定义中引用 Systems Manager Parameter Store 参数时是必需的。添加检索 Systems Manager 参数的权限。 -
secretsmanager:GetSecretValue
— 当您直接引用 Secrets Manager 密钥或者您的 System Manager Parameter Store 参数在任务定义中引用 Secrets Manager 密钥时,这是必需的。添加从 Secrets Manager 中检索密钥的权限。 -
kms:Decrypt
— 仅当您的密钥使用客户托管键而不是默认键时才需要。您的自定义密钥的 ARN 应添加为资源。添加解密客户托管密钥的权限。
以下示例策略添加了所需的权限:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ssm:GetParameters", "secretsmanager:GetSecretValue", "kms:Decrypt" ], "Resource": [ "arn:aws:ssm:
region
:aws_account_id
:parameter/parameter_name
", "arn:aws:secretsmanager:region
:aws_account_id
:secret:secret_name
", "arn:aws:kms:region
:aws_account_id
:key/key_id
" ] } ] }
创建 Systems Manager 参数
您可以使用 Systems Manager 控制台为您的敏感数据创建 Systems Manager Parameter Store 参数。有关更多信息,请参阅《Amazon Systems Manager 用户指南》中的创建 Systems Manager 参数(控制台)或创建 Systems Manager 参数 (Amazon CLI)。
将环境变量添加到容器定义中
在容器定义中,使用要在容器中设置的环境变量的名称和包含要提供给容器的敏感数据的 Systems Manager Parameter Store 参数的完整 ARN 指定 secrets
。有关更多信息,请参阅 secrets。
以下是任务定义的片段,其中显示引用 Systems Manager Parameter Store 参数时的格式。如果 Systems Manager Parameter Store 参数存在于要启动的任务所在的区域,则可以使用参数的完整 ARN 或名称。如果参数存在于不同的区域,则指定完整的 ARN。
{ "containerDefinitions": [{ "secrets": [{ "name": "
environment_variable_name
", "valueFrom": "arn:aws:ssm:region
:aws_account_id
:parameter/parameter_name
" }] }] }
有关如何使用环境变量中指定的密钥创建任务定义的信息,请参阅 使用控制台创建 Amazon ECS 任务定义。