【问题标题】:ECS unable to assume roleECS 无法承担角色
【发布时间】:2018-08-06 10:31:09
【问题描述】:

我正在从控制台调用一个提交批处理作业的 lambda。批处理作业失败,表明 ECS 无法承担为执行作业定义提供的角色。

对于角色,我添加了 lambda 和 ECS 服务。

错误信息:

"ECS 无法承担角色 'arn:aws:iam::749340585813:role/golfnow-invoke-write-progress' 为这项任务提供了。请验证正在传递的角色 具有适当的信任关系和权限,并且您的 IAM 用户有权传递此角色。”

"TrainingJobRole": {
  "Type": "AWS::IAM::Role",
  "Properties": {
    "RoleName": "golfnow-invoke-write-progress",
    "AssumeRolePolicyDocument": {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "Service": [
              "lambda.amazonaws.com",
              "ecs.amazonaws.com"
            ]
          },
          "Action": [
            "sts:AssumeRole"
          ]
        }
      ]
    },
    "Path": "/"
  }
}

批处理作业:

    "TrainingJob": {
  "Type": "AWS::Batch::JobDefinition",
  "Properties": {
    "Type": "container",
    "JobDefinitionName": {
      "Fn::Sub": "c12e-golfnow-${Environment}-job"
    },
    "ContainerProperties": {
      "Image": {
        "Fn::Join": [
          "",
          [
            "{{ image omitted }}",
            {
              "Ref": "AWS::Region"
            },
            ".amazonaws.com/amazonlinux:latest"
          ]
        ]
      },
      "Vcpus": 2,
      "Memory": 2000,
      "Command": [
        "while", "True", ";", "do", "echo", "'hello';", "done"
      ],
      "JobRoleArn": {
        "Fn::GetAtt": [
          "TrainingJobRole",
          "Arn"
        ]
      }
    },
    "RetryStrategy": {
      "Attempts": 1
    }
  }
},
"JobQueue": {
  "Type": "AWS::Batch::JobQueue",
  "Properties": {
    "Priority": 1,
    "ComputeEnvironmentOrder": [
      {
        "Order": 1,
        "ComputeEnvironment": {
          "Ref": "ComputeEnvironment"
        }
      }
    ]
  }
}

是调用方式的问题吗?我的用户有管理员权限,所以我认为这不是我的用户权限不足的问题。

【问题讨论】:

    标签: amazon-web-services aws-batch aws-ecs


    【解决方案1】:

    您需要向 ECS 添加信任策略才能调用 Batch 服务。

       "Principal": {
          "Service":  [
                "batch.amazonaws.com"
          ]
        },
    

    【讨论】:

      【解决方案2】:

      您必须将主体“ecs-tasks.amazonaws.com”添加到提交批处理作业的角色的信任策略中(而不是“ecs.amazonaws.com”)。

      修改后的角色:

      "TrainingJobRole": {
            "Type": "AWS::IAM::Role",
            "Properties": {
              "RoleName": "golfnow-invoke-write-progress",
              "AssumeRolePolicyDocument": {
                "Version": "2012-10-17",
                "Statement": [
                  {
                    "Effect": "Allow",
                    "Principal": {
                      "Service": [
                        "lambda.amazonaws.com",
                        "ecs-tasks.amazonaws.com"
                      ]
                    },
                    "Action": [
                      "sts:AssumeRole"
                    ]
                  }
                ]
              },
              "Path": "/"
            }
          },
      

      【讨论】:

      • 我发现的所有文档(包括官方 AWS 文档)都是指将 ecs.amazonaws.com 添加到信任策略,而不是 ecs-tasks.amazonaws.com。这个答案帮助我解决了缺少主体的问题。
      • @balas,我同意。一旦我在控制台中查看了一个工作 ECS 角色的 信任关系,我注意到列出的实体是 ecs-tasks.amazonaws.com(不幸的是,我在找到这个问题后才注意到它)
      • 请注意,无论您是否处理批处理作业等,ecs-tasks.amazonaws.com 似乎都是必需的服务。
      • 在我的情况下,问题的发生是因为路径配置了“路径”以外的其他值:“/”
      【解决方案3】:

      对于那些使用 Java 编写 CDK 脚本的人,在定义 TaskDefinition 时,您不必显式提供任何 taskRoleexecutionRole。 CDK 将为您创建适当的角色。

      【讨论】:

        猜你喜欢
        • 2019-09-15
        • 2019-07-19
        • 2019-02-25
        • 2023-02-18
        • 2017-11-20
        • 2020-04-29
        • 2020-07-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多