Amazon ECS Exec를 이용해서 Amazon Fargate 컨테이너로 접속해 보기

Amazon ECS Exec를 이용해서 Amazon Fargate 컨테이너로 접속해 보는 과정을 정리해 봤습니다.
2022.09.24

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

안녕하세요 클래스메소드 김재욱(Kim Jaewook) 입니다. 이번에는 Amazon ECS Exec를 이용해서 Amazon Fargate 컨테이너로 접속해 보는 과정을 정리해 봤습니다.

Amazon Fargate 생성에 대한 내용은 아래 블로그를 참고해 주세요.

ECS Exec란?

기본적으로 Dokcer에서는 exec 명령을 통해 컨테이너 내부에 액세스 할 수 있습니다.

이러한 exec를 AWS에서 Amazon ECS Exec라는 이름으로 제공하며, ECS의 EC2 Instance, Fargate의 Task 컨테이너 내부에 접속할 수 있도록 도와줍니다.

Docker 즉, 컨테이너에서의 exec 명령어는 컨테이너에 CMD 명령어를 전달합니다.

Amazon ECS Exec에 관한 보다 자세한 내용은 아래 링크를 참고해 주세요.

Amazon ECS Exec 사용해 보기

먼저 Amazon ECS Exec를 사용하기 위해서는 몇 가지 절차가 필요합니다.

먼저 IAM Role을 설정해야 하는데, 기존에 사용하고 있는 ECS Role로는 Amazon ECS Exec를 사용할 수 없습니다.

추가해야 하는 정책은 다음과 같습니다.

  • ssmmessages:CreateControlChannel
  • ssmmessages:CreateDataChannel
  • ssmmessages:OpenControlChannel
  • ssmmessages:OpenDataChannel

해당 정책을 그대로 IAM Role에 추가해도 되지만,

AmazonSSMManagedInstanceCore 정책에 해당 정책들이 전부 포함되어 있으므로, ECS Role에 AmazonSSMManagedInstanceCore 정책을 추가해도 상관 없습니다.

AWS CLI를 통해 Fargate 서비스의 enable-execute-command 옵션을 활성화 시킬 필요가 있습니다.

AWS CLI 설치 방법에 대해서는 아래 링크를 참고해 주세요.

AWS CLI 설정에 관해서는 아래 블로그를 참고해 주세요.

aws ecs update-service \
    --cluster cluster-name \
    --service service-name \
    --enable-execute-command

다음 명령어로 enable-execute-command 옵션을 활성화 합니다.

반대로 비활성화를 하고 싶을 경우 --enable-execute-command 부분을 --disable-execute-command로 변경합니다.

enable-execute-command가 true로 되어있는 것을 확인합니다.

aws ecs describe-tasks \
    --cluster cluster-name \
    --tasks task-number

따로 명령어로 상세 내용을 확인하고 싶을 경우 다음 명령어로 확인합니다.

이제 접속하기 위한 명령어를 입력해야 하는데, 다음 3가지 정보가 필요합니다

  • cluster
  • task
  • container

컨테이너 이름의 경우 작업 정의에서 확인할 수 있습니다.

aws ecs execute-command --cluster cluster-name \
    --task task-name \
    --container container-name \
    --interactive \
    --command "/bin/sh"

이제 다음 명령어로 Fargate의 Task 내부로 접속해 봅니다.

The Session Manager plugin was installed successfully. Use the AWS CLI to start a session.

An error occurred (InvalidParameterException) when calling the ExecuteCommand operation: The execute command failed because execute command was not enabled when the task was run or the execute command agent isn’t running. Wait and try again or run a new task with execute command enabled and try again.

하지만 실행되는 듯 하다가 에러가 발생합니다.

이럴 경우 Task를 한 번 중지시킵니다.

그리고 다시 Task가 Running 상태로 바뀌면 명령어를 통해 접속해 봅니다.

여기서 주의할 점은, Task를 중지시키면 Task의 Number가 변경 되기 때문에 변경 된 Task의 Number로 접속해야 합니다.

그 외 이러한 에러를 마주치고 싶지 않다면, enable-execute-command 옵션을 활성화할 때, Task를 중지시키고 활성화 명령어를 실행한다면 에러가 나타나는 일은 없을 것 입니다.

마지막으로 명령어를 입력해 보면 문제 없이 Task 내부로 접속한 것을 확인할 수 있습니다.

참고

본 블로그 게시글을 보시고 문의 사항이 있으신 분들은 클래스메소드코리아 (info@classmethod.kr)로 연락 주시면 빠른 시일 내 담당자가 회신 드릴 수 있도록 하겠습니다 !