ECS CLI - вы не можете указать роль IAM для сервисов, которым требуется связанная с сервисом роль.

Я пытаюсь развернуть контейнер в ECS (Fargate) через aws cli. Я могу успешно создать определение задачи, проблема возникает, когда я хочу добавить новую службу в свой кластер 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
  }
]
}

Есть идеи, как управлять этой ошибкой связанной роли?


person Juan Pablo García    schedule 25.05.2018    source источник
comment
Я получил эту ошибку по другой причине (добавление второй целевой группы к службе): роль, связанная со службой, требуется, если в определении вашей задачи используется сетевой режим awsvpc или если служба настроена на использование обнаружения службы, внешнего контроллера развертывания, несколько целевых групп или ускорители эластичного вывода, в этом случае вам не следует указывать здесь роль.   -  person Andy    schedule 11.07.2020


Ответы (2)


Поскольку вы пытаетесь создать задачи типа запуска 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

person Veck Hsiao    schedule 28.05.2018
comment
Привет! Подскажите, пожалуйста, в чем разница между ролью службы и ролью, связанной со службой? И могу ли я теоретически создать эту связанную со службой роль в моем шаблоне, используя те же политики доверия / разрешений, что и в AWSServiceRoleForECS? Будет ли тогда работать? - person Ruslan Plastun; 21.08.2018
comment
Взгляните на первый абзац здесь ›Роль, связанная с сервисом, - это уникальный тип роли IAM, которая напрямую связана с Amazon ECS. Роли, связанные с сервисом, предопределены Amazon ECS и включают все разрешения, которые требуются сервису для вызова других сервисов AWS от вашего имени. - person Veck Hsiao; 21.08.2018
comment
Роль службы - это обычная роль, автоматически созданная для вас в консоли Amazon ECS, при этом основная роль принадлежит службе. С другой стороны, роль, связанная со службой, имеет несколько функций и ограничений, которые нельзя наложить на роль службы. Вы не можете создать обслуживаемую связанную роль и прикрепить ее к роли службы. Это разные вещи. Да, вы можете создать роль, связанную с сервисом, с теми же политиками разрешений, что и AWSServiceRoleForECS (которая на самом деле является ролью, связанной с сервисом). - person Veck Hsiao; 21.08.2018
comment
Спасибо, но мне кажется, что вы сказали две противоположные вещи: Вы не можете создать роль с обслуживаемой связью, а затем Да, вы можете создать роль, связанную со службой. Что я ошибаюсь? Могу ли я создать копию связанной с сервисом роли в шаблоне CFN и использовать ее как одну или нет? - person Ruslan Plastun; 21.08.2018
comment
Простите за плохую грамматику. Я имею в виду, что да, вы можете создать роль, связанную со службой. Но вы не можете прикрепить роль, связанную со службой, к роли службы. - person Veck Hsiao; 21.08.2018

Вместо указания "role": "AWSServiceRoleForECS"

вы можете указать taskRoleArn в дополнение к executionRoleArn, если хотите назначить определенную роль вашей службе (контейнеру). Это будет полезно, если вы хотите, чтобы ваш контейнер имел доступ к другим сервисам 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: "{

person Manmay Barot    schedule 26.06.2019