[AWS] - Amazon ECS - 클러스터 & 태스크 정의 생성

 

Amazon ECS - 클러스터 & 태스크 정의 생성

클러스터 생성 태스크 정의 생성 서비스 생성 https://docs.aws.amazon.com/ko_kr/AmazonECS/latest/developerguide/Welcome.html Amazon Elastic Container Service란 무엇입니까? - Amazon Elastic Container S..

xodwkx2.tistory.com

 

이렇게 ECS 클러스터에 사용될 EC2 인스턴스까지 생성이 완료가 됐어요. 이 "ECS Optimized" Amazon Linux 2에 대해 조금만 더 알아보자면 이 AMI에는 AWS CLI는 설치가 되어있지 않지만 도커가 설치되어있어요. 그리고 docker ps로 현재 실행 중인 프로세스를 확인해보면 amazon/amazon-ecs-agent:latest라는 이미지로 만든 컨테이너가 돌아가고 있는 것을 확인할 수 있는데요

Amazon ECS - ECS Optimized Instance / ecs-agent

앞으로 다뤄볼 일이 있을까? 싶지만 클러스터 생성 시 옵션 중 하나였던 외부 인스턴스를 사용하려 할 때도 On-premises 서버나 VM에 이 ecs-agent와 SSM Agent를 설치해서 사용해요. 이 ECS Agent를 통해서 인스턴스는 클러스터에 연결될 수 있는데 EC2 인스턴스에 대해 배울 때 user-data를 사용했던 기억을 더듬어서 /var/lib/cloud/instance 폴더를 확인해보니 여러 가지 파일들을 확인할 수 있었는데 그중에서 user-data.txt에 아래와 같은 내용이 들어있는 것을 확인했어요. 

echo ECS_CLUSTER=XodwkEC2basedCluster >> /etc/ecs/ecs.config;

그리고 마지막으로 ecs-agent 컨테이너의 로그를 확인해볼 수 있는데 docker logs container_id를 통해서 초기에 어떤 작업을 수행하고 어떤 로그를 남겼는지 확인할 수 있어요.

 

자세한 내용은 컨테이너 에이전트를 확인해주세요. 

 

이제 ECR에 저장해 놓은 이미지를 활용해서 클러스터에 컨테이너를 올리려고 하는데 어떻게 올려야 할까요? 인스턴스에 접속해서 docker run... 이런 방법은 당연히 아니에요. 클러스터 상세 페이지에서 인스턴스 옆에 Services와 Tasks 탭이 있던 거 혹시 기억나시나요? 

Amazon ECS - Cluster Details / Services, Tasks, etc.

당장 여기에서 Deploy 버튼을 누르고 서비스나 타스크를 생성하려고 해도 할 수가 없어요. 왜냐하면 중간에 Task definition을 골라야 하는데 아무것도 고를 게 없기 때문이에요. 서비스나 타스크를 생성하기 위해서는 Task definition을 주면서 '이대로 해'라고 해야 하기 때문에 작업 정의 - Task Definition을 먼저 작성해보도록 할게요.

 

먼저 ECS > Task definition으로 가서 Create new task definition 버튼을 눌러주세요.

Amazon ECS - Create new task definition

 

Task definition family name을 정해주세요. 왜 패밀리라고 하는지는 뒤에서 보여드릴게요.

Amazon ECS - Task definition family name

 

다음으로 이 Task definition에서 어떤 이미지를 가지고 컨테이너를 만들 것인지, 컨테이너의 어떤 포트를 호스트와 연결할 건지 정해주세요. 그리고 다음. 호오옥 시라도 보면서 따라 하신다면 잠시 멈춰주세요. 한 번 쭉 읽고 하셔도 늦지 않아요.

Amazon ECS - Task Definition / Container details

 

마지막으로 환경 설정을 마치면 필요한 설정은 모두 끝내게 돼요. App environment는 처음에 AWS Fargate로 되어있는데 선택 취소 후 Amazon EC2 instances만 선택해주세요. 그리고 Task의 사이즈를 정해야 하는데 t2.micro는 1 vCPU에 1 GiB 메모리 크기를 가지는 인스턴스예요. 적당히 2개의 인스턴스 정도 들어갈 수 있게 메모리만 0.4 GB로 정해주었어요. Task role은 다음 기회에 보기로 하고 네트워크 모드는 브릿지로 선택 후 다음. 을 눌러주시기 전에 아래 안내 문구를 봐주세요. 브리지 모드를 사용하면 기본적으로 호스트 포트가 동적으로 매핑된다고 포트를 고정으로 박아놓고 사용하고 싶다면 뒤로 가서 호스트 포트를 지정하라고 하는데 저 걸 안 읽었어요.

Amazon ECS - Task definition / app environment settings

스토리지, 모니터링, 로깅, 태그 모두 기본으로 놓고 다음을 눌러주세요.

Amazon ECS - Task definition / etc.

리뷰 후 만들기 눌러주시면 ECS 클러스터에 컨테이너를 띄울 수 있는 기본 재료인 작업 정의서가 만들어져요. 이 작업 정의서를 선택하고 우측 상단에 보시면  Deploy라는 드롭다운 버튼이 있어요. 이 걸 누른 후 서비스 버튼을 눌러주세요.

Amazon ECS - Create service with.taskDefinition

Applicaiton type을 서비스로 했어요. 박스 안에 Task와 Service의 차이를 가장 간단하게 잘 설명한 글이 있네요.

한 번 Task definition을 만들고 다음에 다시 똑같은 이름으로 만들었더니 이렇게 revition 2라고 묶어주었어요. 처음 Task definition family라고 한 건 이렇게 여러 revision으로 묶여서 비슷한 내용의 Task definition이 만들어지기 때문에 그랬나 봐요. 원하는 task 수를 1개로 정하고 나머지는 변경 없이 바로 Deploy 했어요.

Aamzon ECS - Deployment configuration

 

어.. 안 돼요. 80포트로 접근해도 안 열리고 3000번 포트로 접근해도 안 열려요. 인스턴스는 살아있고 ECS Cluster 정보에도 서비스는 정상적으로 task가 생성되고 서비스 중이라고 확인은 되는데 안 열려요. 

서비스에 접근이 안될 때 확인해봐야 하는 건? VPC NACL, SG. 이 두 가지만 먼저 확인해봤지만 80 포트도 열려있고 사용 중인 공인 아이피에 대해서는 all traffic allow 정책도 있어요. 이제 확인해봐야 하는 건 SSH 접속 후 인스턴스 안에서도 응답 값을 제대로 안 주는지 확인해야겠어요. 

쉘 접속 후 49153이라는 전혀 엉뚱한 포트와 매핑이 된 걸 확인하고 위에서 이야기 한 그 브리지 모드 사용 시 기본적으로 호스트 포트가 동적으로 매핑된다는 걸 읽었어요. 그래서 전혀 생뚱맞고 계획에는 없었지만 Task definition 수정 후 Rolling update 하는 것까지 해봐요.

 

Amazon ECS - TD-showmehost / Create new revision

먼저 showmehost Task definition 페이지에서 Create new revisioin버튼을 누르고 비어있던 Host port 부분을 80으로 변경하고 TaskDefinition-showmehost의 새로운 3번째 개정판 작업 정의를 만들었어요. 

Amazon ECS - Create new revision / Container details

이제 Deploy Configuration을 새로 만든 revision:3으로 변경해주면 돼요

Amazon ECS - showmehost / Deployments

Cluster > services > 서비스_이름 > Deployments로 가서 우측 상단에 Edit 버튼을 클릭해주세요.

 

그리고 Task definition family의 revision을 2->3으로 변경해주세요. Desired tasks의 수는 1이에요.

Amazon ECS - Edit Deployment configuration

마지막으로 업데이트 버튼을 누르고 나면 아래와 같이 Deployments 현황이 변경되는 것을 볼 수 있어요.

Amazon ECS - showmehost rolling update

 

그리고 마지막으로 80포트로 접속하면

롤링 업데이트로 컨테이너가 변경이 되면서 host 이름도 변경이 된 게 보이네요.