서비스를 Amazon EC2에서 Fargate 기반의 ECS로 옮기면서 다양한 장점을 얻을 수 있었습니다.
- EC2보다 빠르게 배포가 가능합니다.
- 컨테이너가 자동으로 다시 시작한다는 보장이 있습니다.
- 블루-그린 배포를 이용하여 무중단 배포가 가능합니다.
- 리소스를 좀 더 유연하게 사용할 수 있습니다.
- 인프라 관리에 대한 많은 부분을 배제할 수 있습니다.
물론 ECS가 Managed 서비스로 잘 동작하기는 하지만, 개발을 하다보면 Fargate 자체에 접근해서 테스트를 진행해보고 싶은 경우가 있습니다. 로컬 환경에 맞춰서 컨테이너를 빌드하고 Docker의 exec
명령을 이용할 수도 있지만, 실제 개발 환경에서 접근이 가능한지 여부와 컨테이너 내에서 무슨 일이 발생하고 있는지를 파악하기 위해서는 컨테이너에 접근할 방법 자체는 마련해두는 것이 좋습니다. 그리고 이러한 접근을 단순화해주는 프로그램이 바로 execs
입니다.
execs
는 execute + ecs의 합성어로 제가 편리하게 사용하기 위해서 철저하게 맞춤형으로 제작된 golang 기반의 프로그램입니다. AWS의 Credentials 정보를 가져와서 접근 가능한 ECS를 확인하고, 그 안에서 동작하고 있는 Fargate Task에 커맨드를 제공할 수 있습니다. 현재는 interactive 옵션과 함께 /bin/sh
명령이 고정적으로 적용됩니다. 즉, 컨테이너 내부에 접속해서 명령을 수행할 수 있는 최소한으로 설정되어 있습니다.
설치
프로그램을 사용하기 위해서는 github의 release에서 최신 버전의 실행 파일을 받아서 OS의 PATH에 등록하고 사용하시면 됩니다. Windows에서의 사용을 간편하게 하기 위해서 Chocolatey에 등록하는 절차를 진행하고 있으니, 아직 목록에는 표시되지 않아서 다음과 같이 직접 버전을 지정하여 설치가 가능합니다.
choco install execs --version=0.1.4
그리고 AWS에서 EC2나 ECS Fargate로 세션을 생성하기 위해서는 session-manager-plugin
의 설치도 필요합니다.
choco install awscli-session-manager
사용
execs
를 정상적으로 사용하기 위해서는 AWS Credential이 설정되어 있어야 합니다. 기본 Credential 프로바이더 체인을 사용하기 때문에 다음과 같은 순서로 Credential을 읽어들이게 됩니다.
- 환경 변수
- AWS_ACCESS_KEY_ID
- AWS_SECRET_ACCESS_KEY
- AWS_SESSION_TOKEN (필요한 경우에만)
- ~/.aws/credentials 파일
- 현재
execs
는 Default Profile만 지원 - awscli에서
aws configure
를 통해서 설정
- 현재
- IAM Role
저는 주로 AWS SSO에서 제공하는 Assume Role에 대한 Session Credential을 이용하기 때문에, cli 환경에서 다음과 같이 Session Token을 export한 다음에 execs
명령을 수행합니다.
export AWS_ACCESS_KEY_ID="ASIA**************"
export AWS_SECRET_ACCESS_KEY="E4iS**************"
export AWS_SESSION_TOKEN="IQoJb**************"
execs
Code language: JavaScript (javascript)
첫 화면에서는 리전을 선택하게 됩니다.
기본 리전으로 ap-northeast-2
가 지정되어 있습니다. 리전을 고르고 나면 ECS 클러스터를 선택해야 합니다.
? Select Region ap-northeast-2
? Select ECS Cluster [Use arrows to move, type to filter]
..
BATCH-AZBS-DEV-******
> ECS-FIN-DEV-******
Code language: CSS (css)
원하는 클러스터 내에서 작업을 검색합니다.
? Select Region ap-northeast-2
? Select ECS Cluster ECS-FIN-DEV-******
? Select ECS Task cost-dev [Use arrows to move, type to filter]
> 181b1efc************************ | TD-COST-DEV-WEB:2 | 1948768950
e84419b3************************ | TD-COST-DEV-ADMIN:1 | 4158339623
ee402ec9************************ | TD-COST-DEV-API:1 | 3724325744
Code language: PHP (php)
작업을 선택하게 되면 interactive shell이 제공됩니다.
? Select Region ap-northeast-2
? Select ECS Cluster ECS-FIN-DEV-******
? Select ECS Task 181b1efc************************ | TD-COST-DEV-WEB:2 | 1948768950
Starting session with SessionId: ecs-execute-command-07319f1ab221d5219
/ #
Code language: PHP (php)
이제 컨테이너 안에서 원하는 작업을 시도해볼 수 있습니다. 예를 들어, API 호출이 가능한지 curl
명령을 수행하여 확인해보거나 mysql
클라이언트를 설치해서 DB 접속 테스트를 진행해볼 수 있습니다. 혹은 프로세스가 정상적으로 원하는 프로퍼티를 사용중인지, 작업이 사용하고 있는 리소스가 어느 정도인지 등등의 확인도 가능하겠지요.
맺음말
위와 같은 작업을 가능하게 하기 위해서는 ECS에 적절한 설정이 진행되어야 합니다.
- ECS Service를 배포할 때에는 반드시
execute-command
옵션을enable
해야 합니다. - ECS Task의 IAM Role에는
ssmmessage
관련 권한이 제공되어야 합니다. - 사용하는 Fargate 버전이 1.4.0 이상이어야 합니다.
보다 자세한 내용은 다음 링크에서 확인하실 수 있습니다.
이제 Fargate에서 겪는 문제점을 내부에서 직접 진단해보시기 바랍니다.