ECS를 이용한 Blue/Green 무중단 배포 구성하기 (5) - ECS를 이용한 컨테이너 배포
작성 일자 : 2024년 7월 14일
시리즈 순서
- 프로젝트 생성과 ECR 리포지토리
- VPC 생성 및 NAT Instance를 이용한 인터넷 연결
- Route 53 Hosted Zone 생성 및 ACM SSL 인증서 발급
- 애플리케이션 로드 밸런서(ALB) 생성
- ECS를 이용한 컨테이너 배포 (👈 지금 보고 있는 포스트)
- CodeDepoly를 이용한 Blue/Green 무중단 배포 테스트
- Github Actions를 이용한 배포 자동화 구축
1. ECS On-Demand 인스턴스의 Security Group 생성
1-1. On-Demand 인스턴스 기반의 ECS 클러스터
EC2 On-Demand 인스턴스 기반의 ECS 클러스터는 AWS의 Elastic Container Service(ECS)에서 Docker 컨테이너를 실행하고 관리하기 위해 EC2 인스턴스를 사용하는 방식입니다. ECS 클러스터를 생성하는 과정에서 이 인스턴스의 Security Group이 필요합니다.
1-2. Security Group 생성
- AWS Management Console에서 EC2 > Security Groups로 이동합니다.
- Create security group 버튼을 클릭합니다.
- 아래와 같이 설정한 후 Create security group을 클릭합니다.
- Basic details
- Security group name:
gerrymandering-ecsdeploy-ECS-EC2-SG
- Description:
security group for gerrymandering-ecsdeploy-ECS-EC2
- VPC:
ecsdeploy-vpc
- Security group name:
- Inbound rules
- Type:
SSH
- Protocol:
TCP
- Port range:
22
- Source:
My IP
- Type:
- Outbound rules
- Type:
All traffic
- Protocol:
All
- Port range:
All
- Destination:
Anywhere-IPv4
- Type:
2. ECS Service의 Security Group 생성
다음으로는 ECS 서비스를 위한 Security Group을 생성합니다.
2-1. Security Group 생성
- Create security group 버튼을 클릭합니다.
- 아래와 같이 설정한 후 Create security group을 클릭합니다.
- Basic details
- Security group name:
gerrymandering-ecsdeploy-ECS-SG
- Description:
security group for gerrymandering-ecsdeploy-ECS
- VPC:
ecsdeploy-vpc
- Security group name:
- Inbound rules
- Type:
Custom TCP
- Protocol:
TCP
- Port range:
8080
- Source (중요!):
gerrymandering-ecsdeploy-ALB-SG
(ALB의 Security Group)
- Type:
- Outbound rules
- Type:
All traffic
- Protocol:
All
- Port range:
All
- Destination:
Anywhere-IPv4
- Type:
3. ECSCodeDeployRole 생성
3-1. ECSCodeDeployRole이란?
ECSCodeDeployRole은 ECS 서비스를 CodeDeploy를 통해 배포할 때 사용하는 IAM 역할입니다. 이 역할은 CodeDeploy가 ECS 서비스를 배포할 때 필요한 권한을 부여합니다.
3-2. ECSCodeDeployRole 생성
- AWS Management Console에서 IAM > Roles로 이동합니다.
- Create role 버튼을 클릭합니다.
- Trusted entity type에서 AWS service를 선택하고 Use case에서 CodeDeploy를 검색한 후 선택합니다. 이후 하단의 CodeDeploy - ECS를 선택하고 Next 버튼을 클릭합니다.
- Permissions policies에서 AWSCodeDeployRoleForECS를 확인하고 Next 버튼을 클릭합니다.
- Role name을 ECSCodeDeployRole로 입력하고 Create role 버튼을 클릭합니다.
4. ECS Cluster 생성
4-1. ECS Cluster, Task Definition, Task, Service란?
- ECS Cluster
- 컨테이너를 실행할 수 있는 논리적인 그룹
- EC2 인스턴스나 Fargate로 구성될 수 있음
- 작업들이 배포되고 관리되는 환경
- Task Definition
- 컨테이너의 실행 사양을 정의한 문서
- 이미지, CPU 및 메모리 요구사항, 네트워크 및 IAM 역할 등을 포함
- 하나 이상의 컨테이너 정의를 포함할 수 있음
- Task
- Task Definition에 기반하여 실행되는 컨테이너 인스턴스
- 실제로 실행 중인 애플리케이션 인스턴스
- ECS가 관리하고 배포함
- Service
- 특정 수의 Task를 유지하고 관리하는 논리적 그룹
- Auto Scaling을 통해 가용성 및 복원력을 보장
- 지속적으로 실행되도록 보장 (예: 웹 서버를 항상 3개 유지)
4-2. ECS Cluster 생성
- AWS Management Console에서 ECS > Clusters로 이동합니다.
- Create Cluster 버튼을 클릭합니다.
- 아래와 같이 설정한 후 Create 버튼을 클릭합니다.
- Cluster configuration
- Cluster name:
ecsdeploy-ECS-Cluster
- Cluster name:
- Infrastructure
- Amazon ECS instances:
체크
- Auto Scaling group(ASG):
Create new ASG
- Provisioning model:
On-Demand
- Container instance Amazon Machine Image(AMI):
Amazon Linux 2 (kernel 5.10)
- EC2 instance type(중요!! 하단 4-3 참조):
t3.small
- EC2 instance role:
Create new role
- Desired capacity
- Minimum:
1
- Maximum:
1
- Minimum:
- SSH key pair:
gerrymandering-ecsdeploy
(이전에 생성한 키페어) - Root EBS volume size:
30
- Auto Scaling group(ASG):
- Amazon ECS instances:
- Network settings for Amazon EC2 instances
- VPC:
ecsdeploy-vpc
- Subnets(중요!!):
ecsdeploy-subnet-private1-ap-northeast-2a
ecsdeploy-subnet-private2-ap-northeast-2c
(Private subnet 두 개 선택) - Security group:
Use an existing security group
선택 - Security group name:
gerrymandering-ecsdeploy-ECS-EC2-SG
(위의 1번 과정에서 생성한 ECS On-Demand 인스턴스의 Security Group 선택) - Auto-assign public IP:
Turn off
- VPC:
- 생성된 클러스터에서 Container instances가 1 EC2로 제대로 붙어있는지 확인합니다. 0 EC2로 되어있는 경우, NAT Instance가 제대로 설정되지 않았을 수 있습니다. (참고)
4-3. EC2 instance type을 t3.small
로 선택하는 이유
Amazon ECS에서 무중단 배포(Blue-Green Deployment)를 위해 두 개의 컨테이너를 동시에 실행하려면 충분한 네트워크 인터페이스(ENI)가 필요합니다. 프리티어의 t2.micro
인스턴스는 최대 2개의 ENI를 지원하지만, 기본 ENI를 제외하면 실제로 사용할 수 있는 ENI는 1개에 불과하므로 두 개의 컨테이너를 동시에 실행할 수 없습니다. 따라서 최대 3개의 ENI를 지원하는 t3.small
인스턴스를 선택하여 두 개의 컨테이너를 동시에 실행할 수 있도록 합니다.
Reference
- StackOverflow - Amazon ECS on EC2 Server instance hitting RESOURCE:ENI error
- Amazon ECS API failure reasons - RESOURCE:ENI 파트
- Amazon EC2 > Instance Types > Network specifications 최대 ENI 갯수
5. ECS Task Definition 생성
- AWS Management Console에서 ECS > Task Definitions로 이동합니다.
- Create new task definition 버튼을 클릭합니다.
- 아래와 같이 설정한 후 Create 버튼을 클릭합니다.
- Task definition family:
ecsdeploy-ECS-TD
- Launch type:
Amazon EC2 instances
- Operating system/Architecture:
Linux/x86-64
(혹시 인스턴스 타입을 ARM 계열 - t4g 등으로 선택했다면,Linux/ARM64
선택) - Network mode:
awsvpc
- Task size
- CPU:
0.5 vCPU
- Memory:
0.5 GB
- CPU:
- Container details
- Name:
ecsdeploy-ECS-Container
- Image URI: ECR에서 생성한 리포지토리의 URI 붙여넣기 (이미지 참조)
- Essential container:
Yes
- Name:
- Port mappings
- Container port:
8080
- Protocol:
TCP
- App protocol:
HTTP
- Container port:
이후 나머지는 기본 설정
6. ECS Service 생성
- ECS > Task Definitions > ecsdeploy-ECS-TD(방금 생성한 TD) > Revision 1로 이동합니다.
- Deploy의 Create service 버튼을 클릭합니다.
- 아래와 같이 설정한 후 Create 버튼을 클릭합니다.
- Environment
- Existing cluster: 위에서 생성한
ecsdeploy-ECS-Cluster
- Compute options:
Launch type
- Launch type:
EC2
- Existing cluster: 위에서 생성한
- Deployment configuration
- Application type:
Service
- Service name:
ecsdeploy-ECS-Service
- Service type:
Replica
- Desired tasks:
1
- Deployment type:
Blue/green deployment(power by AWS CodeDeploy)
- Deployment configuration:
CodeDeployDefault.ECSAllAtOnce
(카나리 배포 등 다른 옵션 선택 가능) - Service role for CodeDeploy:
ECSCodeDeployRole
(3번 과정에서 생성한 역할 선택)
- Application type:
- Networking
- VPC:
ecsdeploy-vpc
- Subnets:
ecsdeploy-subnet-private1-ap-northeast-2a
ecsdeploy-subnet-private2-ap-northeast-2c
(Private subnet 두 개 선택) - Security groups:
gerrymandering-ecsdeploy-ECS-SG
(위의 2번 과정에서 생성한 ECS Service의 Security Group 선택)
- VPC:
- Load balancing
- Load balancer type:
Application Load Balancer
- Container:
ecsdeploy-ECS-Container
(위의 5번 과정에서 생성한 컨테이너 선택) - Application Load Balancer:
Use an existing load balancer
- Load balancer:
gerrymandering-ecsdeploy-ALB
(이전 포스트에서 생성한 ALB 선택) - Health check grace period:
120 seconds
(이 값은 Task가 시작된 후 ECS Service 스케줄러에서 Elastic Load Balancing 상태 확인을 무시하는 시간을 나타냅니다. 자신의 애플리케이션의 실행 시간의 두 배 이상으로 설정하는 것이 좋습니다.) - Production listener:
Use an existing listener
- Production listener:
443:HTTPS
- Load balancer type:
- Target groups
- Target group 1:
Use an existing target group
- Target group 1 name:
ecsdeploy-blue-TG
(이전 포스트에서 생성한 Target Group 선택) - Target group 2:
Use an existing target group
- Target group 2 name:
ecsdeploy-green-TG
(이전 포스트에서 생성한 Target Group 선택)
- Target group 1:
- Create 버튼을 클릭한 이후, CloudWatch > Log groups > /ecs/ecsdeploy-ECS-TD > Log streams에서 Log events를 확인할 수 있습니다.
- 정상적으로 배포되었는지 확인하기 위해 Route 53에 등록한 도메인에 접속합니다. 그러면 아래와 같이 배포된 애플리케이션의 모습을 확인할 수 있습니다.
다음 글: CodeDepoly를 이용한 Blue/Green 무중단 배포 테스트