[AWS][CloudFormation] Invalid request provided: CreateService error: Unable to assume the service linked role. Please verify that the ECS service linked role exists.

프로그래밍/서버2020. 12. 26. 21:49
./gradlew awsCfnMigrateStack awsCfnWaitStackComplete -PsubnetId=subnet-3016f123 -Pregion=ap-northeast-2

위와 같은 명령어로 Gradle을 통해 CloudForamtion stack을 만드려고 했습니다.

 

Starting a Gradle Daemon, 1 incompatible and 1 stopped Daemons could not be reused, use --status for details

 

> Task :awsCfnMigrateStack

stack myapp-stack not found (에러 원인 아님!)

 

> Task :awsCfnWaitStackComplete FAILED

 

FAILURE: Build failed with an exception.

 

* What went wrong:

Execution failed for task ':awsCfnWaitStackComplete'.

> Status of stack themepark-stack is FAILURE. It seems to be failed.

 

* Try:

Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

 

* Get more help at https://help.gradle.org

 

Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0.

Use '--warning-mode all' to show the individual deprecation warnings.

See https://docs.gradle.org/6.7.1/userguide/command_line_interface.html#sec:command_line_warnings

 

BUILD FAILED in 2m 54s

2 actionable tasks: 2 executed

위와 같은 에러가 떴습니다. 그런데 여기 에러에는 정확한 원인이 없습니다.

 

AWS 콘솔에 로그인하고.. CloudFormation에서 stack의 이벤트 로그를 봐야합니다.

 

에러가 발생한 원인은 아래와 같습니다.

Invalid request provided: CreateService error: Unable to assume the service linked role. Please verify that the ECS service linked role exists. (Service: Ecs, Status Code: 400, Request ID: 521b7036-3b8c-4431-b304-2b804e057920, Extended Request ID: null)

정보를 좀 더 찾아보겠습니다.

 

공식 홈에 따르면 아래와 같은 내용이 있습니다.(docs.aws.amazon.com/AmazonECS/latest/developerguide/using-service-linked-roles.html)

Under most circumstances, you don't need to manually create the service-linked role. For example, when you create a new cluster (for example, with the Amazon ECS first-run experience, the cluster creation wizard, or the AWS CLI or SDKs), or create or update a service in the AWS Management Console, Amazon ECS creates the service-linked role for you, if it does not already exist.

대부분의 경우에 직접.. service-linked role을 만들 필요가 없다고 합니다. 그런데 왜 이런 문제가 발생했을까요?

 

또 다른 정보입니다.

github.com/aws/amazon-ecs-cli/issues/733

good callout, I don't find any mention of it in the tutorial currently and it would be helpful to at least include a note re: why it's needed and a link to the AWSServiceRoleForECS page.

Typically, this role doesn't need to be manually created because ECS tries to create it for you automatically when creating a cluster or creating/updating a service that requires it. However, if your IAM user doesn't have permissions to create the role, automatic creation will fail, as it did above.

Instructions on how to create this role and the permissions needed to do it are described in the above link.

해결책만 간단히 언급된 댓글도 있습니다.

Since I ran into this problem today and it took a few hours to figure out, I'll make it easy for everyone else who is having the same issue. Simply execute this command in your AWS CLI aws iam create-service-linked-role --aws-service-name ecs.amazonaws.com, then use the newly created role's Arn within the ExecutionRoleArn property of your AWS::ECS::TaskDefinition

 

음.. IAM user가 권한이 없어서 role을 생성하지 못하면 이런 문제가 발생한다고 하네요.

그런데 저는..  (보안에는 안좋지만.. 테스트를 위해) root user 계정으로 aws를 사용하고 있는데도.. 이 문제가 발생했네요. 버그가 있는 걸까요?

 

root가 아닌 admin 사용자에게 모든 권한을 주고 다시 테스트 해보겠습니다.

이상하게 timeout이 계속 발생해서.. stack name을 변경해봤는데 소용이 없네요. 그래서 subnet을 변경하고 진행했는데도 안되네요. Service 생성 단계에서 응답이 없는데 이 역시도 linked-role이 없어서 발생하는 문제가 아닐까 추측해봅니다.

 

aws iam create-service-linked-role --aws-service-name ecs.amazonaws.com

 

위의 명령어로 service linked role을 만들어봅니다.

 

An error occurred (InvalidInput) when calling the CreateServiceLinkedRole operation: Service role name AWSServiceRoleForECS has been taken in this account, please try a different suffix.

 

근데 에러가 발생하네요.(이미 AWSServiceRoleForECS라는 이름의 Service role이 있어서 에러가 발생했다는 내용임)

help 명령어를 사용해서 정보를 좀 더 보겠습니다.

"--aws-service-name" (string)

 

The service principal for the AWS service to which this role is

attached. You use a string similar to a URL but without the http://

in front. For example: "elasticbeanstalk.amazonaws.com" .

 

Service principals are unique and case-sensitive. To find the exact

service principal for your service-linked role, see AWS Services

That Work with IAM in the *IAM User Guide* . Look for the services

that have **Yes** in the **Service-Linked Role** column. Choose the

**Yes** link to view the service-linked role documentation for that

service.

docs.aws.amazon.com/IAM/latest/UserGuide/using-service-linked-roles.html#create-service-linked-role

docs.aws.amazon.com/IAM/latest/UserGuide/reference_aws-services-that-work-with-iam.html

docs.aws.amazon.com/AmazonECS/latest/developerguide/using-service-linked-roles.html

위의 가이드를 참고하라는 말 같습니다.

그러나.. 딱히 도움이 되는 내용이 없었습니다.

흠.. 오늘 만들어진 AWSServiceRoleForECS가 있습니다.

CloudFormation에서 만든 것일까요?

TaskDefinition:

  Type: AWS::ECS::TaskDefinition

  Properties:

    Family: !Sub ${ServiceName}-task

    Cpu: 256

    Memory: 512

    NetworkMode: awsvpc

    ContainerDefinitions:

      - Name: !Sub ${ServiceName}-container

        Image: !Sub ${DockerHubUsername}/${ServiceName}:${ServiceVersion}

        PortMappings:

          - ContainerPort: 8080

    RequiresCompatibilities:

      - EC2

      - FARGATE

    ExecutionRoleArn: arn:aws:iam::768088081162:role/aws-service-role/ecs.amazonaws.com/AWSServiceRoleForECS

 

위에서 빨간색으로 표시한 코드를 넣고 다시 테스트 해보겠습니다.

 

계속.. Service 생성에서 반응이 없네요;;

 

ECS 만들다가 응답이 없었기에.. ECS에 무슨 정보가 있나 했더니 여기에도 에러 로그가 있네요.

버그로 인해 이 정보가.. CloudFormation으로 전달이 안됐던 것 같습니다.

어쨋든 에러 메세지는 아래와 같습니다.

 

service themepark-service failed to launch a task with (error ECS was unable to assume the role 'arn:aws:iam::768088081162:role/aws-service-role/ecs.amazonaws.com/AWSServiceRoleForECS' that was provided for this task. Please verify that the role being passed has the proper trust relationship and permissions and that your IAM user has permissions to pass this role.).

 

흠..

CloudFormation에서 stack을 다 삭제하고.. AWSServiceRoleForECS도 삭제하니

제일 처음에 봤던 에러가 발생하네요.

AWSServiceRoleForECS는 CloudFormation 동작 과정 중에서 자동으로 만들어진 것이었습니다.

AWSServiceRoleForECS가 필요해서 스스로 만들었는데 아래의 에러가 떠서 문제가 생긴 것이었네요.

Invalid request provided: CreateService error: Unable to assume the service linked role. Please verify that the ECS service linked role exists. (Service: Ecs, Status Code: 400, Request ID: 4d9adb66-81a1-4aee-9dc7-64c60db4a327, Extended Request ID: null)

AWSServiceRoleForECS가 있는데.. 인식을 못하는 것 같습니다.

 

이리저리 디버깅 하다가 원인을 찾았습니다. ㅜㅜ

yaml파일에서 ECS TaskDefinition을 할 때.. ContainerDefinitions가 있습니다.

  TaskDefinition:
    Type: AWS::ECS::TaskDefinition
    Properties:
      Family: !Sub ${ServiceName}-task
      Cpu: 256
      Memory: 512
      NetworkMode: awsvpc
      ContainerDefinitions:
        - Name: !Sub ${ServiceName}-container
          Image: !Sub ${DockerHubUsername}/${ServiceName}:${ServiceVersion}
          PortMappings:
            - ContainerPort: 8080
      RequiresCompatibilities:
        - EC2
        - FARGATE

여기서.. 이미지 경로(repository)를 지정하게 되어있는데

이 경로가 잘못되면 발생하는 문제였습니다.

 

이미지 경로가 잘못되니 container 생성에 계속 실패를 하게 되는데 AWS는 이를 Role에 문제가 있다고 잘못 판단하는 것 같네요..

 

저와 같은 문제를 겪으시는 분들은 Image 경로가 제대로 되어있는지 확인하시길 바랍니다.

작성자

Posted by 드리머즈

관련 글

댓글 영역