View a markdown version of this page

Amazon ECS 托管实例实例配置文件 - Amazon Elastic Container Service

Amazon ECS 托管实例实例配置文件

实例配置文件是一个 IAM 容器,它只包含一个 IAM 角色,并允许 Amazon ECS 托管实例安全地代入该角色。实例配置文件包含 ECS 代理代入的实例角色,用于向集群注册实例并与 ECS 服务进行通信。

重要

如果您将 Amazon ECS 托管实例与 AmazonECSInfrastructureRolePolicyForManagedInstances 托管策略一起使用,则实例角色名称必须以 ecsInstanceRole 开头。该策略将 iam:PassRole 的作用范围限定为 arn:aws:iam::*:role/ecsInstanceRole*,因此名称不匹配会导致任务启动时出现授权错误。省略 RoleName 时,CloudFormation 经常出现这种情况,因为 CloudFormation 会自动生成类似于 MyStack-InstanceRole-ABC123 的名称。

如果您改用自定义基础设施角色策略,则只要您的策略包含针对实例角色 ARN 的 iam:PassRole 授权,则实例角色可以具有任何名称。

使用信任策略创建角色

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

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

    JSON
    { "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "ec2.amazonaws.com"}, "Action": "sts:AssumeRole" } ] }
  2. 使用您在上一步中创建的信任策略,并使用以下 AWS CLI 命令创建一个名为 ecsInstanceRole 的角色。

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

    aws iam attach-role-policy \ --role-name ecsInstanceRole \ --policy-arn arn:aws:iam::aws:policy/AmazonECSInstanceRolePolicyForManagedInstances
    注意

    如果您选择应用最低权限,并指定您自己的权限,则可以添加以下权限,以帮助排查 Amazon ECS 托管实例与任务相关的问题:

    • ecs:StartTelemetrySession

    • ecs:PutSystemLogEvents

您也可以使用 IAM 控制台的自定义信任策略工作流程来创建该角色。有关更多信息,请参阅《IAM 用户指南》中的使用自定义信任策略创建角色(控制台)

创建该文件后,您必须向用户授予将该角色传递给 Amazon ECS 的权限。

使用 AWS CLI 创建实例配置文件

创建角色后,请使用 AWS CLI 创建实例配置文件:

aws iam create-instance-profile --instance-profile-name ecsInstanceRole

将角色添加到实例配置文件中:

aws iam add-role-to-instance-profile \ --instance-profile-name ecsInstanceRole \ --role-name ecsInstanceRole

验证是否已成功创建配置文件:

aws iam get-instance-profile --instance-profile-name ecsInstanceRole

使用 CloudFormation 创建实例配置文件

可以使用 AWS CloudFormation 创建实例角色和实例配置文件。根据您使用的是 AWS 托管基础设施策略还是自定义策略,选择以下选项之一。

选项 1:使用 ecsInstanceRole 命名约定(建议)

使用 AWS 托管基础设施策略时,必须明确将 RoleName 设置为以 ecsInstanceRole 开头的值。如果省略 RoleName,则 CloudFormation 会自动生成与托管策略的 iam:PassRole 条件不匹配的名称,任务将无法启动。

Resources: EcsInstanceRole: Type: AWS::IAM::Role Properties: RoleName: ecsInstanceRole AssumeRolePolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Principal: Service: ec2.amazonaws.com Action: sts:AssumeRole ManagedPolicyArns: - arn:aws:iam::aws:policy/AmazonECSInstanceRolePolicyForManagedInstances EcsInstanceProfile: Type: AWS::IAM::InstanceProfile Properties: InstanceProfileName: ecsInstanceRole Roles: - !Ref EcsInstanceRole

选项 2:使用自定义角色名称

如果您希望让 CloudFormation 生成角色名称,或者使用不以 ecsInstanceRole 开头的自定义名称,则必须为基础设施角色添加内联策略,以便为实例角色授予 iam:PassRole

Resources: EcsInstanceRole: Type: AWS::IAM::Role Properties: # No RoleName — CFN auto-generates AssumeRolePolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Principal: Service: ec2.amazonaws.com Action: sts:AssumeRole ManagedPolicyArns: - arn:aws:iam::aws:policy/AmazonECSInstanceRolePolicyForManagedInstances EcsInstanceProfile: Type: AWS::IAM::InstanceProfile Properties: Roles: - !Ref EcsInstanceRole EcsInfrastructureRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Principal: Service: ecs.amazonaws.com Action: sts:AssumeRole ManagedPolicyArns: - arn:aws:iam::aws:policy/AmazonECSInfrastructureRolePolicyForManagedInstances Policies: - PolicyName: PassInstanceRoleToEC2 PolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Action: iam:PassRole Resource: !GetAtt EcsInstanceRole.Arn Condition: StringLike: iam:PassedToService: "ec2.*"

问题排查

任务失败并显示 iam:PassRole 授权错误

如果您的任务失败并带有提及 iam:PassRoleResourceInitializationError,请验证您的实例角色名称是否以 ecsInstanceRole 开头。你可以在 CloudFormation 控制台中堆栈的资源选项卡下查看自动生成的名称。如果名称不匹配,可以:

  • RoleName: ecsInstanceRole 添加到您的 AWS::IAM::Role 资源。

  • 将明确的 iam:PassRole 内联策略添加到您的基础设施角色。有关更多信息,请参阅 选项 2:使用自定义角色名称