ECS无法扮演角色

75
从控制台,我调用一个 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"
        }
      }
    ]
  }
}

问题是调用方式吗?我的用户拥有管理员权限,因此我认为这不是由于用户权限不足引起的问题。

5个回答

103

您需要将主体"ecs-tasks.amazonaws.com"添加到提交Batch作业的角色的信任策略中(而不是"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": "/"
      }
    },

15
我找到的所有文档(包括官方的AWS文档)都提到要将ecs.amazonaws.com添加到信任策略中,但没有提到ecs-tasks.amazonaws.com。这个答案帮助我解决了缺少主体的问题。 - balas
3
@balas,我同意。在控制台查看一个正在工作的ECS角色的“信任关系”时,我注意到列出的实体是 ecs-tasks.amazonaws.com(不幸的是,我在找到这个问题后才注意到)。 - mjkrause
请注意,无论您是否使用批处理作业等,ecs-tasks.amazonaws.com 似乎是必需的服务。 - tschumann
在我的情况下,问题发生的原因是路径配置为除“Path”以外的其他值:“/”。 - Felipe Desiderati
你可以在这里找到它的官方文档:https://github.com/awsdocs/amazon-ecs-developer-guide/blob/master/doc_source/task_execution_IAM_role.md - Alexandre Brown

2

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


1
您需要为 ECS 添加信任策略以调用 Batch 服务。
   "Principal": {
      "Service":  [
            "batch.amazonaws.com"
      ]
    },

0

0

通过在CDK脚本中添加角色名称,我的问题得到了解决。

 const ecsFargateServiceRole = new iam.Role(this, 'execution-role', {
  assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'),
  roleName: "execution-role"
});
ecsFargateServiceRole.addToPolicy(executionRolePolicy);

正如@horizon7所提到的,除非您需要添加其他策略,否则不需要指定IAM角色。 - A Simple Programmer
@ASimpleProgrammer提到了如果使用JAVA。上面的代码是JavaScript的。 - Muhammad Waqas
@ASimpleProgrammer 他提到如果使用JAVA。上面的代码是JavaScript的。 - undefined
SDK在各种编程语言中基本相同。您不需要指定roleName: "execution-role"这一部分。 - A Simple Programmer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接