Amazon ECS 任务执行 IAM 角色 - Amazon Elastic Container Service

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

Amazon ECS 任务执行 IAM 角色

任务执行角色的 ,该角色授予 Amazon ECS 容器和 Fargate 代理代表您进行 AWS API 调用的权限。任务执行 IAM 角色是必需的,具体取决于任务的要求。您可以将多个任务执行角色用于与您的账户关联的服务不同目的。有关您的应用程序运行所需的 IAM 权限,请参阅 任务 IAM 角色

以下是任务执行 IAM 角色的常见使用案例:

  • 您的任务托管在外部实例上 AWS Fargate或之上,并且:

    • 从 Amazon ECR 私有存储库中提取容器映像。

    • 在与运行任务的账户不同的账户中,从 Amazon ECR 私有存储库中提取容器映像。

    • 使用日志驱动程序将容器 CloudWatch 日志发送到 awslogs Logs。有关更多信息,请参阅 使用 awslogs 日志驱动程序

  • 您的任务托管在 Amazon EC2 实例上并且... AWS Fargate

注意

该任务执行角色由 Amazon ECS 容器代理版本 1.16.0 和更高版本支持。

Amazon ECS 提供了名为 AmazonECSTaskExecutionRolePolicy 的托管策略,该策略包含上述常见使用案例所需的权限。对于特殊使用案例,可能需要向您的任务执行角色添加内联策略,这些策略概述如下。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ecr:GetAuthorizationToken", "ecr:BatchCheckLayerAvailability", "ecr:GetDownloadUrlForLayer", "ecr:BatchGetImage", "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": "*" } ] }

可以在 Amazon ECS 控制台中为您创建一个Amazon ECS 任务执行角色;但是,您应该为任务手动附加托管 IAM policy,允许 Amazon ECS 在引入未来功能和增强功能时添加权限。您可以使用 IAM 控制台搜索来搜索ecsTaskExecutionRole并查看您的账户是否已拥有任务执行角色。有关更多信息,请参阅 IAM 用户指南中的 IAM 控制台搜索

创建任务执行 (ecsTaskExecutionRole) 角色

如果您的账户还没有任务执行角色,请按照以下步骤创建该角色。

AWS Management Console
创建任务执行 IAM 角色 (AWS Management Console)
  1. 通过以下网址打开 IAM 控制台:https://console.aws.amazon.com/iam/

  2. 在导航窗格中,选择 Roles(角色)和 Create role(创建角色)。

  3. Trusted entity type(可信实体类型)部分,选择 AWS service( 服务)、Elastic Container Service

  4. 对于使用案例,选择 Elastic Container Service 任务,然后选择下一步

  5. 在 “添加权限” 部分中,执行以下操作:

    1. 搜索亚马逊 ECS TaskExecutionRolePolicy,然后选择政策。

    2. Set permissions boundary - optional(设置权限边界 - 可选)下,选择 Create role without a permissions boundary(创建没有权限边界的角色)。

    3. 选择下一步

  6. 在 “名称、查看和创建” 下,执行以下操作:

    1. 对于 Role name(角色名称),键入 ecsTaskExecutionRole

    2. 对于 Add tags (optional)(添加标签(可选)),指定要与策略关联的任何自定义标签。

  7. 选择 创建角色

AWS CLI

用您自己的信息替换所有用户输入

  1. 创建一个名为 ecs-tasks-trust-policy.json 的文件,其中包含要用于 IAM 角色的信任策略。该文件应包含以下内容:

    { "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": "ecs-tasks.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
  2. 使用上一步中创建的信任策略创建命名为 ecsTaskExecutionRole 的 IAM 角色。

    aws iam create-role \ --role-name ecsTaskExecutionRole \ --assume-role-policy-document file://ecs-tasks-trust-policy.json
  3. 将 AWS 托管AmazonECSTaskExecutionRolePolicy策略附加到ecsTaskExecutionRole角色。

    aws iam attach-role-policy \ --role-name ecsTaskExecutionRole \ --policy-arn arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy

私有注册表身份验证所需的 IAM 权限

使用此功能需要 Amazon ECS 任务执行角色。这允许容器代理拉取容器映像。

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

  • secretsmanager:GetSecretValue

  • kms:Decrypt - 仅当密钥使用自定义 KMS 密钥而不是原定设置密钥时才需要。您的自定义密钥的 Amazon 资源名称(ARN)必须添加为资源。

下面是添加所需权限的示例内联策略。

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

密钥 Amazon ECS 机密所需的 IAM 权限

要使用 Amazon ECS 密钥功能,您必须具有 Amazon ECS 任务执行角色并在任务定义中引用它。这允许容器代理提取必要的 AWS Systems Manager 或 Secrets Manager 资源。有关更多信息,请参阅 将敏感数据传递给容器

使用 Secrets Manager

要提供对您创建的 Secrets Manager 密钥的访问权限,请将以下权限手动添加到任务执行角色。有关如何管理权限的信息,请参阅《IAM 用户指南》中的添加和删除 IAM 身份权限

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

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

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

使用 Systems Manager

重要

对于使用 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" ] } ] }

通过接口端点拉取 Amazon ECR 映像的 Fargate 任务的可选 IAM 权限

在 Amazon ECR 配置为使用接口 VPC 端点的情况下,当启动使用 Fargate 启动类型的任务(该任务从 Amazon ECR 中提取映像)时,可以限制任务对特定 VPC 或 VPC 端点的访问。可通过为要使用 IAM 条件键的任务创建任务执行角色来做到这一点。

使用以下 IAM 全局条件键来限制对特定 VPC 或 VPC 端点的访问。有关更多信息,请参阅 AWS Global Condition Context Keys

  • aws:SourceVpc - 限制对特定 VPC 的访问。

  • aws:SourceVpce - 限制对特定 VPC 端点的访问。

以下任务执行角色策略提供了一个添加条件键的示例:

重要

ecr:GetAuthorizationTokenAPI 操作无法应用aws:sourceVpcaws:sourceVpce条件密钥,因为 GetAuthorizationToken API 调用通过 AWS Fargate 拥有的弹性网络接口,而不是任务的弹性网络接口。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ecr:GetAuthorizationToken", "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "ecr:BatchCheckLayerAvailability", "ecr:GetDownloadUrlForLayer", "ecr:BatchGetImage" ], "Resource": "*", "Condition": { "StringEquals": { "aws:sourceVpce": "vpce-xxxxxx", "aws:sourceVpc": "vpc-xxxxx" } } } ] }