고딩왕 코범석
AWS ECS 적용하기 본문
안녕하세요! 이번에는 ECS EC2 환경을 구축해보는 포스팅을 진행해보겠습니다. 순서는 아래와 같이 진행됩니다.
이미지 아키텍처 관련하여 이슈가 있습니다. ECR에 이미지를 푸시할 때 --platform arm64로 빌드 후 다시 푸시해주세요. 이 내용은 맨 밑에 '컨테이너 확인과 실수'에 작성되어있습니다.
- ECS 클러스터 생성
- 태스크 정의 생성
- 서비스 생성
- 컨테이너 확인과 실수
1. ECS 클러스터 생성
AWS 콘솔에서 'Elastic Container Service'를 검색하여 접속해줍니다.
ECS 콘솔에서 '클러스터 > 클러스터 생성'을 눌러줍니다.
클러스터 이름, 네트워킹, 인프라를 설정해야하는데요. 네트워킹 항목에서 저번 ECS 준비 포스팅에서 로드밸런서를 만들 때 설정했던 서브넷(가용 영역, 2a / 2b / 2c)를 선택해줍니다.
그리고 인프라에서는 Amazon EC2 인스턴스를 선택합니다. Fargate가 아닌 EC2 인스턴스를 선택하면 Auto Scailing Group을 추가해줘야 하는데요. 간단하게 최소를 1, 최대를 2로 잡습니다. 인스턴스 유형은 t2.micro를 사용하려 했으나, AWS 홈페이지에서 2022년 말까지는 월 750시간 동안 t4g.small이 무료로 제공됩니다. 군침도니까 t4g.small로 가겠습니다. t4g.small은 arm64 아키텍처이기 때문에 Amazon Linux 2 (arm64)를 선택해줍니다. 키 페어도 기존에 사용하고 있는 것으로 설정하면 됩니다.
모니터링과 태그는 스킵하겠습니다. 마지막으로 생성 버튼을 눌러줍니다.
생성이 완료되면 아래 이미지와 같이 생성했던 클러스터가 표기됩니다.
2. 태스크(작업) 정의 생성
이제 서비스에 의해 실행될 태스크(작업)을 정의해야합니다. 콘솔에서 '태스크 정의'로 들어가봅니다. 그리고 '새 태스크 정의 생성'을 눌러줍니다.
태스크 정의 패밀리 이름, 컨테이너 정보를 입력해줍니다. 컨테이너 정보 입력시에는 이미지 URI를 지정해줘야 하는데요. 이전 포스팅에서 만든 ECR에 접속해 이미지 URI를 복사한 후 기입해줍니다. 그리고 컨테이너 포트는 제 애플리케이션이 스프링으로 만들었기 때문에 8080 포트를 열어줍니다. 환경 변수는 별도로 설정하지 않고 다음 버튼을 눌러 검토 후 마무리합니다.
앱 환경은 EC2, 운영체제/아키텍처는 t4g.small과 같은 스펙으로 지정해줍니다. 태스크 크기에서의 cpu와 메모리는 각각 0.5로 잡겠습니다. 태스크 역할은 저번 포스팅에서 만들었던 'ecsFullAccessRole'을, 네트워크 모드는 awsvpc로 설정합니다. 나머지는 기입하지 않고 다음 버튼을 눌러주고, 검토 후 마무리합니다.
최종적으로 태스크 정의 콘솔에 ACTIVE 상태로 추가되었음을 확인할 수 있습니다.
3. 서비스 생성
이제 서비스를 생성해보겠습니다. '만들었던 클러스터 > 서비스 > 배포'를 눌러줍니다.
환경, 배포 구성, 로드밸런싱, 네트워킹을 하나씩 설정해보겠습니다. 환경에서는 컴퓨팅 구성에서 용량 공급자 전략, 사용자 지정 사용, 용량 공급자에서 이전 포스팅에서 만든 Auto Scailing Group을 선택해줍니다.
배포 구성에서는 서비스, 패밀리는 방금 만들었던 태스크 정의, 서비스 이름과 원하는 태스크 수를 기입해줍니다. 원하는 태스크 수는 우선 1로 설정했습니다. 그리고 배포 옵션은 롤링 업데이트와 최소 태스크 백분율, 최대 태스크 백분율을 각각 100, 200으로 설정했습니다. 이렇게 되면 나중에 애플리케이션을 배포할 때, 새로운 버전의 컨테이너가 먼저 생성되고 기존에 존재한 컨테이너는 다운됩니다.
다음은 로드밸런싱 설정입니다. 로드 밸런서 유형은 Application Load Balancer, '새 로드 밸런서 생성'을 선택하여 로드밸런서를 아래와 같이 생성해줍니다. 헬스 체크 경로는 제가 스프링부트 애플리케이션에서 actuator를 사용했기에 '/actuator/health'로 작성했습니다.
다음은 네트워크 설정입니다. vpc와 서브넷은 기본적으로 선택되어있을겁니다. 보안 그룹은 이전 포스팅에서 만든 로드밸런서와 EC2 보안그룹을 모두 선택해줍니다. 태그는 스킵하고 배포를 눌러줍니다.
4. 컨테이너 확인과 실수
작업 후 EC2에 접속해 'docker ps -a' 명령어를 통해 컨테이너를 확인했는데, 컨테이너가 반복적으로 'EXITED' 되었습니다. ECS 클러스터의 태스크를 확인해도 모두 중지되어있었습니다.
원인은 EC2의 CPU 아키텍처와 제가 배포한 도커 이미지의 아키텍처가 맞지 않아서인데요. t4g.small의 경우 arm64 아키텍처입니다. 'docker inspect <이미지 ID>' 명령어를 통해 확인하니 제 이미지의 아키텍처는 amd64였던 것입니다.
푸시 명령어를 아래와 같이 수정하여 ECR에 이미지를 다시 푸시해보겠습니다.
docker build --platform arm64 -t example-application .
ECR에 다시 들어가면 이미지 두 개가 존재할 것입니다.
확인 후 서비스를 위 과정과 동일하게 만들어줍니다. 서비스를 다시 만들 때는 이전에 만들었던 이름과 다르게 작성해주세요! 이전과 동일하게 작성하니 만들어지지 않았습니다.
다시 컨테이너에 접속하여 'docker ps -a' 명령어를 입력해보면 컨테이너가 Up상태일 것입니다.
그리고, 로드밸런서에 가서 DNS를 복사해 헬스 체크 경로로 작성했던 '/actuator/health'를 URI로 입력하면 정상적으로 Up으로 출력됩니다.
이렇게 해서 ECS EC2 구축을 마무리했습니다. 다음 포스팅에서는 Github Action을 이용해 이 과정을 자동화해보겠습니다.
'Infra > AWS' 카테고리의 다른 글
Github Actoins로 AWS ECS CI / CD 자동화하기 (0) | 2022.06.09 |
---|---|
AWS ECS 적용 전 준비사항 (1) | 2022.06.06 |
AWS VPC 환경 구축해보기 (0) | 2021.11.25 |