만자의 개발일지

[AWS] AWS Fargate for ECS 시작하기 본문

AWS

[AWS] AWS Fargate for ECS 시작하기

박만자 2022. 2. 24. 11:01

​AWS Fargate for ECS

AWS Fargate란 서버를 관리하지 않고도 컨테이너를 배포하고 관리할 수 있는 서버리스 컴퓨팅 엔진입니다.

기존의 ECS는 Instance 유형을 직접 설정하고, Task Life Cycle을 관리하고, Cluster를 관리해야 됬지만 AWS Fargate를 사용하면 이 모든 배포 및 관리 과정을 AWS가 관리하고, 사용자는 어플리케이션 개발에 집중할 수 있게 됩니다.

 

AWS Fargate는 서버리스 이기에 사용한 리소스에 대한 비용만 지불하면 되며, 자세한 비용은 아래 사이트를 참고하시길 바랍니다.

https://aws.amazon.com/ko/fargate/pricing/

 

서버리스 컴퓨팅 엔진 - AWS Fargate 요금 - Amazon Web Services

월 CPU 요금 총 vCPU 요금 = (태스크 수) x (vCPU 수) x (CPU-초당 요금) x (일별 CPU 지속 시간(초)) x (일 수) 총 vCPU 요금 = 10 x 1 x 0.0000254167 x 3600 x 30 = 27.45 USD 월 Windows OS 요금 총 메모리 요금 = (태스크 수) x

aws.amazon.com

 

이제 AWS Fargate 기반으로 ECS를 사용해볼건데요, ECS에서 AWS Fargate를 사용하는 두 가지 방법이 있습니다.

  1. 시작하기 기능(ECS Wizard)
  2. VPC위에 직접 Fargate기반 ECS Cluster를 구성하는 방법

AWS에 미숙하신 분이라면 1번 방법을 추천드리고 AWS에 익숙하신 분이라면 2번 방법을 추천드립니다.

 

 

시작하기(ECS Wizard)

먼저 AWS 콘솔에 접속한 후 ECS 콘솔로 들어가 줍니다.

 

그 다음 가운데에 보이는 Get started 버튼을 눌러 ECS Wizard를 시작합니다.

 

첫 번째 단계에서는 Container definition과 Task definition을 지정해 줄 수 있는데요, Container definition은 sample-app, nginx, tomcat-webserver, custom 이렇게 네 가지 종류가 있습니다. 이번에는 sample-app 으로 진행하도록 하겠습니다. Task definition은 기본값을 사용하도록 하겠습니다. Next 버튼을 눌러 다음 단계로 넘어갑니다.

 

두 번째 단계에서는 Service를 설정할 수 있습니다. Load balancer type은 ALB로 설정해 주시고 Next를 눌러 다음단계로 넘어갑니다.

 

세 번째 단계에서는 Cluster를 설정할 수 있습니다. VPC와 서브넷은 자동으로 생성되며 Cluster 명을 지정해준 후 Next를 눌러 다음으로 넘어갑니다.

 

네 번째 단계는 리뷰입니다. 각 단계에서 설정한 값을 확인할 수 있습니다.

 

하단에 Create 버튼을 누르면 ECS 리소스들을 자동으로 생성해줍니다. 시간은 최대 10분까지 소요될 수 있습니다.

 

잘 진행되는 것을 보실 수 있습니다.

 

생성이 완료되면 모든 항목이 complete로 표시되고 View service 버튼이 활성화 됩니다.

 

로드밸런서 콘솔로 들어가시면 ALB가 하나 생성되있는 것을 보실 수 있는데요, 해당 DNS name을 복사해 브라우저로 접속해 보면

 

다음과 같이 컨테이너가 잘 동작하는 것을 보실 수 있습니다.

 

 

AWS Fargate기반 ECS Cluster 구성

ECS Wizard를 이용하여 ECS를 사용해보았는데요, 이번에는 직접 ECS를 구성해 보도록 하겠습니다.

Cluster 생성

먼저 ECS를 사용하기 위해서는 Cluster가 필요합니다. Create Cluster 버튼을 눌러 Cluster를 생성해 보도록 하겠습니다.

첫 번째 단계에서 3가지 Cluster 템플릿을 지정해 줄 수 있는데요, 각각의 템플릿은 Cluster 필요에 따라 VPC, 서브넷, 리눅스나 윈도우 인스턴스를 포함합니다. Cluster는 물리적인 컴퓨팅 자원이 아니라 논리적인 개념에 가깝기 때문에 Cluster 이외의 요소가 필수적인 것은 아닙니다. 따라서 Networking only 템플릿을 선택해 비어있는 Cluster를 생성해 주도록 하겠습니다. Next step 버튼을 눌러 다음 단계로 넘어갑니다.

 

두 번째 단계에서는 Cluster명과 VPC 생성 여부를 지정해 줄 수 있습니다. 앞서 말했듯이 빈 Cluster를 생성할 것이고 VPC는 Service 생성 단계에서 지정해줄 것이기 때문에 별다른 VPC 생성은 비활성화 하도록 합니다.

Create 버튼을 눌러 Cluster를 생성해 줍니다.

 

빈 Cluster가 잘 생성된 것을 보실 수 있습니다. Cluster를 확인해보면 Task와 Service를 관리할 수 있는 메뉴들로 구성되 있는 것을 보실 수 있습니다.

 

ECS를 Fargate기반으로 사용하는 경우 Container Instance없이 컨테이너를 실행할 수 있습니다. 컨테이너를 실행하기 위해서는 도커 이미지와 Task Definition을 생성해야 합니다.

 

Task Definition 생성

Task Definition 콘솔로 들어간 다음 Create new Task Definition 버튼을 눌러 Task Definition을 생성해 보도록 하겠습니다.

 

Task Definition은 Fargate, EC2, EXTERNAL 3가지 방식을 지원합니다. EXTERNAL로 지정하면 온프레미스 서버에 ECS를 사용할 수 있습니다. 우리는 Fargate기반 ECS를 구성하는 것이 목적이기 때문에 Fargate를 선택해줍니다. Next step 버튼을 눌러 다음 단계로 넘어갑니다.

 

Task Definition명과 Task role을 지정할 수 있습니다. Task role은 Task에 IAM 권한을 부여할 때 사용하는 기능이기에 여기서는 권한을 별도로 필요로하지 않으니 지정하지 않도록 하겠습니다. 운영체제는 Linux를 사용하도록 하겠습니다. 

Fargate의 경우 네트워크 모드가 awsvpc로 고정입니다. awsvpc의 경우 동적 포트 매핑을 지원하지 않습니다. 고로 ECS로 어플리케이션을 띄우기 위해서는 어플리케이션 컨테이너의 포트를 기본값인 80번 포트를 사용해야합니다.

밑으로 내려보시면 Task execution role과 Task size를 지정해 줄 수 있습니다. Task execution role은 Fargate가 사용자를 대신해서 컨테이너를 관리하기 위한 role입니다. ECR에서 이미지를 받아오거나, CloudWatch에 로그를 기록하려면 권한이 필요한데 이 때 사용되는 role이 Task execution role입니다. ecsTaskExecutionRole에는 이 두가지 권한이 부여되어있습니다. 때문에 Task execution role을 ecsTaskExecutionRole로 지정해준 후 Task Size는 가장 작은 사이즈로 지정해 주도록 하겠습니다.

 

Docker Hub에서 Apache 이미지를 받아 사용할 것이기 때문에 컨테이너명은 httpd, 이미지는 httpd:2.4로 지정합니다.

그 다음 포트 매핑을 80 포트로 지정해줍니다. 이 밖에 다양한 컨테이너 설정들이 있지만 이번에는 모두 기본값으로 사용하도록 하겠습니다. Add 버튼을 눌러 컨테이너를 추가합니다.

 

하단의 Create 버튼을 눌러 Task Definition을 생성해 줍니다.

Task Definition이 잘 생성된 것을 보실 수 있습니다.

 

ECS는 컨테이너 오케스트레이션 서비스입니다. 컨테이너 오케스트레이션의 특징중 하나는 Task가 Cluster에 속한 Instance 중에 어디에서 실행될지 미리 알 수 없다는 점입니다. Instance와 Task는 모두 동적으로 생성되거나 삭제되며,

Task가 실행되는 Instance는 컨테이너 오케스트레이션 스케줄러에 의해 자동으로 정해집니다. 이렇게 동적으로 실행되는 서비스의 위치를 파악하는 기능을 서비스 디스커버리라고 합니다. 이는 ECS에도 적용되는 개념입니다. 따라서 다수의 Task를 실행하는 서비스를 외부에 노출해야되는 경우 로드 밸런서로 이 서비스 디스커버리 기능을 대체할 수 있습니다.

 

로드 밸런서 생성

로드 밸런서를 생성하기 위해 로드 밸런서 콘솔로 이동해 줍니다. 그 다음 Create Load Balancer 버튼을 눌러줍니다.

 

로드 밸런서 타입에는 총 3가지 타입이 있습니다. 여기서는 ALB(Application Load Balancer)를 사용하도록 하겠습니다.

 

로드 밸런서명을 지정해줍니다. Sheme은 외부에서 로드 밸런서로 접근해야 하기에 Internet-facing으로 지정해 줍니다.

 

Network mapping에서 VPC를 지정해줍니다.

 

 그 다음 ALB의 보안그룹을 지정해줍니다. 보안 그룹은 80번 포트로 외부에서 접근할 것이기에 Inbound rule에서 80번 포트를 허용해 주었습니다.

 

그 다음 타겟 그룹을 하나 만들어 지정해줍니다.  ECS를 생성하면 타겟 그룹을 다시 생성하기 때문에 여기서 지정해준 타겟 그룹은 사용하지 않을 것입니다. 단지 ALB를 생성하기 위해서는 타겟 그룹을 반드시 지정해줘야 하기에 만들어 지정해준 것입니다.

 

모든 설정을 완료했다면 Create load balancer 버튼을 눌러 ALB를 생성해 줍니다.

 

ALB가 잘 생성된 것을 보실 수 있습니다.

 

그 다음 자동으로 생성된 리스너를 삭제해 줍니다.

 

그 다음 타겟 그룹 목록으로 이동해 아까 생성한 ALB와 연동된 타겟 그룹을 삭제해 줍니다. ALB를 ECS와 연동해서 사용하는 경우 ECS가 직접 타겟 그룹을 관리하기 때문에 ALB 생성시 자동으로 생성된 리스너와 타겟 그룹을 사용하지 않습니다.

로드 밸런서 설정까지 마쳤으니 이제 Service를 생성해 보도록 하겠습니다

 

Service 생성

위에서 만든 Cluster로 들어간 후 Services 항목에 들어가 Create 버튼을 눌러줍니다.

 

첫 번째 단계에서는 Service와 관련된 옵션들을 지정해줍니다. 

Launch type은 Fargate로 지정해주시고 Task Definition은 아까 위에서 만든 ecs_fargate_demo_httpd를 사용하도록 하겠습니다. 그 다음 Service명을 지정해주시고 Task 개수는 가용성을 위해 2이상으로 지정해줍니다.

 

그 다음 배포 타입을 설정해 줄 수 있는데요, 롤링 배포와 블루/그린 배포 두 가지가 있습니다. ECS는 기본적으로 롤링배포를 지원하고 블루/그린 배포의 경우 AWS CodeDeploy를 사용하여 Service의 배포를 제어할 수 있습니다.

롤링 배포로 선택해 주신후 Next step을 눌러 다음 단계로 넘어갑니다.

 

두 번째 단계에서는 네트워크 관련 옵션을 지정해 줄 수 있습니다. VPC와 서브넷을 지정해주신후 보안 그룹은 기본값을 사용하고 Public IP 자동 할당은 활성화 해주도록 합니다.

 

그 다음 로드 밸런서 설정으로 넘어가서 ALB를 선택해 주신후 Add to load balancer 버튼을 눌러 리스너 포트를 80으로만 설정해주시고 나머지는 기본값을 사용하도록 하겠습니다.

 

Route 53에도 서비스 디스커버리를 대체할 수 있는 기능이 있습니다. 하지만 이번에는 Route 53은 사용하지 않을 것이므로 Route 53의 서비스 디스커버리 기능은 비활성화 해주도록 하겠습니다. Next step 버튼을 눌러 다음 단계로 넘어갑니다.

 

세 번째 단계는 Auto Scaling 설정입니다. 이번에는 사용하지 않을 것이므로 Next step 버튼을 눌러 다음 단계로 넘어갑니다.

 

네 번째 단계는 리뷰 단계입니다. 각 단계의 설정을 확인하고 Creaet Service 버튼을 눌러 Service를 생성해 줍니다.

 

Service를 생성하고 나면 다음과 같이 Service의 상태를 확인할 수 있습니다. Tasks 항목으로 들어가 Task 상태가 RUNNING이 될 때까지 기다려 줍니다.

 

모든 Task 항목이 RUNNING 상태로 되었다면 아까 생성했던 ALB의 DNS name을 복사해 브라우저로 접속해봅니다.

 

잘 작동하는 것을 보아 두개의 컨테이너에서 Apache가 잘 돌아가는 것을 확인할 수 있습니다.

 

이처럼 Fargate를 사용하면 Instance를 직접 관리해야하는 번거로움을 덜 수 있고, 일반적으로 호스트 Instance의 네트워크 환경을 공유하는 컨테이너들과 달리 각각이 독립적인 네트워크 환경을 가지고 실행되는 특수한 컨테이너이기 때문에 좀 더 유연한 환경을 구성할 수 있는 장점이 있습니다.

 

참고

 

 

'AWS' 카테고리의 다른 글

[AWS] Transit Gateway란  (1) 2022.05.12
[AWS] VPC Peering 이란  (0) 2022.03.14
[AWS] AWS ECS란  (0) 2022.02.23
[AWS] API Gateway란  (0) 2022.02.21
[AWS] AWS Lambda란  (0) 2022.02.18
Comments