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

Amazon ECS 任务执行 IAM 角色

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

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

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

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

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

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

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

注意

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

Amazon ECS 提供了名为 AmazonECSTaskExecutionRolePolicy 的托管式策略,该策略包含上述常见应用场景所需的权限。有关更多信息,请参阅《AWS 托管式策略参考指南》中的 AmazonECSTaskExecutionRolePolicy。对于特殊应用场景,可能需要向任务执行角色添加内联策略。

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

如果以经过身份验证的用户身份拉取映像,则不太可能受到 Docker Hub 拉取速率限制变化的影响。有关更多信息,请参阅容器实例的私有注册表身份验证

通过使用 Amazon ECR 和 Amazon ECR Public,您可以避开 Docker 施加的限制。如果您从 Amazon ECR 提取映像,这还有助于缩短网络提取时间,并减少流量离开您的 VPC 时的数据传输变化。

使用 Fargate 时,您必须使用 repositoryCredentials 向私有映像注册表进行身份验证。无法为 Fargate 上托管的任务设置 Amazon ECS 容器代理环境变量 ECS_ENGINE_AUTH_TYPEECS_ENGINE_AUTH_DATA 或修改 ecs.config 文件。有关更多信息,请参阅任务的私有注册表身份验证

创建任务执行 角色

如果您的账户尚未具有任务执行角色,请使用以下步骤创建角色。

AWS Management Console
为 Elastic Container Service 创建服务角色(IAM 控制台)
  1. 登录 AWS Management Console,然后通过以下网址打开 IAM 控制台:https://console.aws.amazon.com/iam/

  2. 在 IAM 控制台的导航窗格中,选择角色,然后选择创建角色

  3. 对于 Trusted entity type(可信实体类型),选择 AWS 服务

  4. 对于服务或使用案例,选择 Elastic Container Service,然后选择 Elastic Container Service 任务使用案例。

  5. 选择下一步

  6. 添加权限部分中,搜索 AmazonECSTaskExecutionRolePolicy,然后选择该策略。

  7. 选择下一步

  8. 对于角色名称,输入 ecsTaskExecutionRole

  9. 检查该角色,然后选择创建角色

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

创建该角色后,为该角色添加以下功能的附加权限。

功能 其他权限

使用 Secrets Manager 凭证访问您的容器映像专用存储库

私有注册表身份验证权限

使用 Systems Manager 或 Secrets Manager 传递敏感数据

Secrets Manager 或 Systems Manager 权限

让 Fargate 任务通过接口端点拉取 Amazon ECR 映像

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

在 Amazon S3 存储桶中托管配置文件

Amazon S3 存储桶文件存储权限

配置 Container Insights 以查看 Amazon ECS 生命周期事件

配置 Container Insights 以查看 Amazon ECS 生命周期事件所需的权限

在 Container Insights 中查看 Amazon ECS 生命周期事件

在 Container Insights 中查看 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" ] } ] }

Secrets Manager 或 Systems Manager 权限

允许容器代理拉取所需 AWS Systems Manager 或 Secrets Manager 资源的权限。有关更多信息,请参阅 将敏感数据传递给 Amazon ECS 容器

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

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

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

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

  • aws:SourceVpc - 限制对特定 VPC 的访问。可以将 VPC 限制为托管任务和端点的 VPC。

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

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

{ "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" } } } ] }

Amazon S3 存储桶文件存储权限

指定某个在 Amazon S3 中托管的配置文件时,任务执行角色必须包含对此配置文件的 s3:GetObject 权限以及对此文件所在 Amazon S3 存储桶的 s3:GetBucketLocation 权限。有关更多信息,请参阅《Amazon Simple Storage Service 用户指南》中的 Amazon S3 的策略操作

以下示例策略添加了从 Amazon S3 中检索文件所需的权限。指定 Amazon S3 存储桶的名称和配置文件名称。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject" ], "Resource": [ "arn:aws:s3:::amzn-s3-demo-bucket/folder_name/config_file_name" ] }, { "Effect": "Allow", "Action": [ "s3:GetBucketLocation" ], "Resource": [ "arn:aws:s3:::amzn-s3-demo-bucket" ] } ] }

配置 Container Insights 以查看 Amazon ECS 生命周期事件所需的权限

在任务角色中,配置生命周期事件需要以下权限:

  • events:PutRule

  • events:PutTargets

  • logs:CreateLogGroup

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "events:PutRule", "events:PutTargets", "logs:CreateLogGroup" ], "Resource": "*" } ] }

在 Container Insights 中查看 Amazon ECS 生命周期事件所需的权限

查看生命周期事件需要以下权限。将以下权限作为内联策略添加到任务执行角色。有关更多信息,请参阅添加和删除 IAM policy

  • events:DescribeRule

  • events:ListTargetsByRule

  • logs:DescribeLogGroups

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "events:DescribeRule", "events:ListTargetsByRule", "logs:DescribeLogGroups" ], "Resource": "*" } ] }