ECS CLI - 您不能为需要服务相关角色的服务指定 IAM 角色

Posted

技术标签:

【中文标题】ECS CLI - 您不能为需要服务相关角色的服务指定 IAM 角色【英文标题】:ECS CLI - You cannot specify an IAM role for services that require a service linked role 【发布时间】:2018-11-05 06:55:51 【问题描述】:

我正在尝试通过 aws cli 将容器部署到 ECS (Fargate)。我能够成功创建任务定义,当我想向我的 Fargate 集群添加新服务时出现问题。

这是执行的命令:

aws ecs create-service --cli-input-json file://aws_manual_cfn/ecs-service.json

这是我得到的错误:

An error occurred (InvalidParameterException) when calling the CreateService operation: You cannot specify an IAM role for services that require a service linked role.`

ecs-service.json


"cluster": "my-fargate-cluster",
"role": "AWSServiceRoleForECS",
"serviceName": "dropinfun-spots",
"desiredCount": 1,
"launchType": "FARGATE",
"networkConfiguration": 
    "awsvpcConfiguration": 
        "assignPublicIp": "ENABLED",
        "securityGroups": ["sg-06d506f7e444f2faa"],
        "subnets": ["subnet-c8ffcbf7", "subnet-1c7b6078", "subnet-d47f7efb", "subnet-e704cfad", "subnet-deeb43d1", "subnet-b59097e8"]
     
,
"taskDefinition": "dropinfun-spots-task",
"loadBalancers": [
    
        "targetGroupArn": "arn:aws:elasticloadbalancing:us-east-1:************:targetgroup/dropinfun-spots-target-group/c21992d4a411010f",
        "containerName": "dropinfun-spots-service",
        "containerPort": 80
    
]

task-definition.json


"family": "dropinfun-spots-task",
"executionRoleArn": "arn:aws:iam::************:role/aws-service-role/ecs.amazonaws.com/AWSServiceRoleForECS",
"memory": "0.5GB",
"cpu": "256",
"networkMode": "awsvpc",
"requiresCompatibilities": [
  "FARGATE"
],
"containerDefinitions": [
  
    "name": "dropinfun-spots-service",
    "image": "************.dkr.ecr.us-east-1.amazonaws.com/dropinfun-spots-service:latest",
    "memory": 512,
    "portMappings": [
        
          "containerPort": 80
        
      ],
    "essential": true
  
]

知道如何管理这个linked-role错误吗?

【问题讨论】:

我收到此错误的另一个原因(向服务添加第二个目标组):“如果您的任务定义使用 awsvpc 网络模式或服务配置为使用服务发现、外部部署控制器、多个目标组或 Elastic Inference 加速器,在这种情况下,您不应在此处指定角色。” 【参考方案1】:

由于您尝试创建 Fargate 启动类型的任务,因此您在任务定义中将网络模式设置为 awsvpc 模式(Fargate 仅支持 awsvpc 模式)。

在您的 ecs-service.json 中,我可以看到它有 "role": "AWSServiceRoleForECS"。您似乎正在尝试为此服务分配服务角色。 AWS 不允许您为需要服务相关角色的服务指定 IAM 角色。

如果您因为要使用负载均衡器而分配了服务 IAM 角色,则可以将其移除。因为使用 awsvpc 网络模式的任务定义使用服务相关角色,它是自动为您创建的[1]。

https://docs.aws.amazon.com/AmazonECS/latest/developerguide/using-service-linked-roles.html#create-service-linked-role

【讨论】:

嗨!你能告诉我服务角色和服务链接角色有什么区别吗?理论上,我是否可以使用与AWSServiceRoleForECS 中完全相同的信任/权限策略在我的模板中创建此服务相关角色?那么它会起作用吗? 请看第一段here > 服务相关角色是直接链接到 Amazon ECS 的一种独特类型的 IAM 角色。服务相关角色由 Amazon ECS 预定义,包括该服务代表您调用其他 AWS 服务所需的所有权限。 服务角色只是在 Amazon ECS 控制台中自动为您创建的常规角色,其主体设置为服务。另一方面,与服务相关的角色有一些不能放在服务角色上的特性和限制。您无法创建服务链接角色并将其附加到服务角色。他们是两个不同的东西。是的,您可以使用与 AWSServiceRoleForECS 相同的权限策略创建服务相关角色(实际上是服务相关角色)。 谢谢,但在我看来,您说了两句相反的话:您不能创建服务链接角色然后是的,您可以创建一个服务相关角色。我怎么了?我可以在 CFN 模板中创建服务相关角色的副本并将其用作一个副本吗? 抱歉我的语法不好。我的意思是,是的,您可以创建服务相关角色。但是您不能将服务相关角色附加到服务角色。【参考方案2】:

而不是指定"role": "AWSServiceRoleForECS"

如果您想为您的服务(容器)分配特定角色,除了 executionRoleArn 之外,您还可以指定 taskRoleArn。如果您希望您的容器代表您访问其他 AWS 服务,这将非常有用。

task-definition.json


"family": "dropinfun-spots-task",
"executionRoleArn": "arn:aws:iam::************:role/aws-service-role/ecs.amazonaws.com/AWSServiceRoleForECS",
"taskRoleArn" : "here_you_can_define_arn_of_a_specific_iam_role"
"memory": "0.5GB",
"cpu": "256",
"networkMode": "awsvpc",
"requiresCompatibilities": [
  "FARGATE"
],
"containerDefinitions": [
  
    "name": "dropinfun-spots-service",
    "image": "************.dkr.ecr.us-east-1.amazonaws.com/dropinfun-spots-service:latest",
    "memory": 512,
    "portMappings": [
        
          "containerPort": 80
        
      ],
    "essential": true
  
]

注解:发布 aws account_id 是非常糟糕的做法:"

【讨论】:

以上是关于ECS CLI - 您不能为需要服务相关角色的服务指定 IAM 角色的主要内容,如果未能解决你的问题,请参考以下文章

添加作为服务相关角色的 IAM 角色

如何从 ECS 服务中删除/移除任务

阿里云的服务器ecs怎么配置

ECS 任务。如何在容器中使用 AWS CLI

云服务器ECS

aws ecs 使用copilot快速创建ecs集群环境并部署服务