ECS를 이용한 Blue/Green 무중단 배포 구성하기 (2) - VPC 생성 및 NAT Instance를 이용한 인터넷 연결
작성 일자 : 2024년 06월 2일
시리즈 순서
- 프로젝트 생성과 ECR 리포지토리
- VPC 생성 및 NAT Instance를 이용한 인터넷 연결(👈 지금 보고 있는 포스트)
- Route 53 Hosted Zone 생성 및 ACM SSL 인증서 발급
- 애플리케이션 로드 밸런서(ALB) 생성
- ECS를 이용한 컨테이너 배포
- CodeDepoly를 이용한 Blue/Green 무중단 배포 테스트
- Github Actions를 이용한 배포 자동화 구축
1. VPC 생성하기
VPC를 생성하기에 앞서, VPC라는 것이 무엇인지와 왜 VPC를 생성해야 하는지에 대해 알아보겠습니다.
1-1. VPC란?
VPC(Virtual Private Cloud)는 사용자가 정의한 가상 네트워크에서 AWS 리소스를 시작할 수 있는 논리적으로 격리된 AWS 클라우드 섹션입니다. VPC를 사용하면 사용자는 리소스 배치, 연결, 보안 등 가상 네트워킹 환경을 제어할 수 있습니다.
1-2. Default VPC와 Custom VPC
AWS 계정을 생성하면 Default VPC가 자동으로 생성됩니다. Default VPC는 AWS에서 제공하는 기본 네트워크 환경으로, 사용자가 별도로 VPC를 생성하지 않아도 기본적인 네트워크 환경을 사용할 수 있습니다.
Default VPC는 사용 편의성을 제공하지만 빠른 배포를 위해 존재하는 것이므로, 프로덕션 환경에서는 Custom VPC를 사용하는 것이 좋습니다. Custom VPC는 사용자가 직접 네트워크 환경을 구성할 수 있으며, 보안, 제어, 유연성 등에서 Default VPC보다 더 장점이 많습니다.
예를 들어서, Default VPC는 각 가용 영역(AZ)에 퍼블릭 서브넷만을 제공하므로, 데이터베이스와 같이 외부 접근이 제한되어야 하는 리소스를 생성하기에는 부적합합니다. 퍼블릭 서브넷에 위치한 리소스는 인터넷 게이트웨이를 통해 직접 외부와 통신할 수 있어, 보안상 위험이 따릅니다.
이러한 이유로 프로덕션 환경에서는 Custom VPC를 사용하는 것이 좋습니다. Custom VPC를 이용하면 퍼블릭 서브넷과 프라이빗 서브넷을 분리하여 구성할 수 있습니다. 퍼블릭 서브넷에는 로드 밸런서와 같은 인터넷과 통신이 필요한 리소스를 배치하고, 프라이빗 서브넷에는 데이터베이스와 같이 외부 접근이 제한되어야 하는 리소스를 배치함으로써 보안을 강화할 수 있습니다.
1-3. VPC 생성하기
- AWS Management Console에서 VPC 서비스로 이동합니다.
- VPC 대시보드에서 Create VPC 버튼을 클릭합니다.
- 아래와 같이 VPC 설정을 진행합니다.
- Resources to create:
VPC and more
- Name tag auto-generation:
Auto-generate
체크 및Name tag
에 생성할 VPC의 이름을 입력 - Number of Availability Zones(AZs):
2
- Customize AZs: 각 가용영역 마다 제공하는 인스턴스 유형이 다르므로, 프로젝트에 맞는 가용지역을 선택합니다.
- Number of public subnets:
2
- Number of private subnets:
2
- NAT gateway($):
None
(해당 포스트에서는 NAT Instance를 사용할 것이므로 None을 선택합니다. 대신 NAT Gateway를 사용할 수 있으며, 이 경우 추가 비용이 발생합니다.) - VPC endpoints:
None
설정을 완료하면 위와 같은 Preview를 확인할 수 있습니다. Create VPC 버튼을 클릭하여 VPC를 생성합니다.
2. NAT Instance 생성하기
2-1. NAT이란?
NAT(Network Address Translation)은 Private IP 주소를 Public IP 주소로 변환하는 기술입니다. NAT을 사용할 경우, 주소로 변환하여 Private 네트워크에서 인터넷에 접속할 수 있습니다.
2-2. NAT Instance와 NAT Gateway
NAT Gateway
NAT Gateway는 AWS에서 관리하는 서비스로, 사용자가 관리할 필요가 없습니다. 이는 고가용성과 확장성을 자동으로 제공하며, AWS에서 패치와 업데이트를 관리합니다. NAT Gateway는 일반적으로 높은 처리량과 낮은 지연 시간을 제공하며, 설정이 간단하고 사용하기 쉽습니다. 다만, NAT Gateway 서비스는 사용하는 시간과 데이터 양에 따라 비용이 발생하며, 이는 NAT Instance를 사용할 때보다 비용이 더 클 수 있습니다.
NAT Instance
NAT Instance는 사용자가 EC2 Instance를 직접 관리하는 방식입니다. 사용자는 NAT Instance를 생성하고, 필요에 따라 유지보수를 직접 관리해야 합니다. 이는 고가용성을 구현하기 위해 여러 NAT Instance를 수동으로 설정하여 관리해야 하는 경우가 있습니다. NAT Instance는 사용자의 필요에 따라 더 세밀하게 설정을 조정할 수 있다는 장점이 있지만, 관리와 유지보수에 추가적인 노력이 필요합니다. 비용 면에서는 NAT Gateway보다 저렴할 수 있지만, 성능과 관리 측면에서는 NAT Gateway가 더 우세합니다.
이번 포스트에서는 NAT Instance를 생성하여 사용하겠습니다.
2-3. ECS에서 NAT이 필요한 이유
ECS 서비스 자체는 VPC 내에 있지 않고 공용 인터넷을 통해 접근할 수 있는 AWS 관리형 서비스입니다. 때문에 EC2 인스턴스를 생성해서 ECS(EC2 Launch Type)의 컨테이너 인스턴스로 등록해야 하는 경우에, EC2 인스턴스 자신은 자신을 등록하고, 업데이트된 상태를 전송하고, 작업을 할당 받는 등의 작업을 수행하기 위해 ECS API 엔드포인트와 통신 할 수 있어야 합니다.
혹시라도 EC2 Launch Type의 ECS Cluster를 생성하고 EC2 인스턴스가 ECS에 등록되지 않는다면, NAT이 제대로 설정되지 않았을 가능성이 높습니다.
2-4. NAT Instance의 Security Group 설정
NAT Instance를 생성하기 전에, NAT Instance의 Security Group을 설정하도록 하겠습니다.
- AWS Management Console에서 EC2 서비스로 이동합니다.
- Security Groups 메뉴로 이동합니다.
- Create security group 버튼을 클릭하고 아래와 같이 설정합니다.
- Basic details
- Security group name:
gerrymandering-ecsdeploy-nat-EC2-SG
(예시) - Description:
security group for gerrymandering-ecsdeploy-nat-EC2
(예시) - VPC: 위에서 생성한 VPC 선택
- Security group name:
- Inbound rules
- HTTP/HTTPS:
subnet-private1
,subnet-private2
의 IPv4 CIDR에서의 트래픽을 허용 (VPC>Subnets에서 CIDR 확인 가능) - SSH: 자신의 IP 주소에서의 트래픽을 허용
- HTTP/HTTPS:
- Outbound rules
- HTTP/HTTPS:
0.0.0.0/0
- 모든 IPv4 주소로의 트래픽을 허용
- HTTP/HTTPS:
- Create security group 버튼을 클릭하여 Security Group을 생성합니다.
2-5. NAT Instance 생성하기
- EC2 대시보드에서 Launch Instances 버튼을 클릭합니다.
- 아래와 같이 인스턴스 설정을 진행합니다.
- Name:
gerrymandering-ecsdeploy-nat-EC2
(예시) - Amazon Machine Image(AMI):
Amazon Linux 2023 AMI
- Architecture:
64-bit(x86)
- Instance type:
t2.micro
- Key pair (login): 생성한 키페어 선택
- Network settings
- VPC: 위에서 생성한 VPC 선택 (예시:
ecsdeploy-vpc
) - Subnet:
subnet-public1
선택 - Auto-assign Public IP:
Enable
- Firewall (security group): 위에서 생성한 Security Group 선택 (예시:
gerrymandering-ecsdeploy-nat-EC2-SG
)
- VPC: 위에서 생성한 VPC 선택 (예시:
- Configure storage: 기본 설정 그대로 진행 (1 x 8GiB)
- Launch instance 버튼을 클릭하여 NAT Instance를 생성합니다.
2-6. NAT Instance 설정하기
- 생성한 NAT Instance에 SSH로 접속합니다.
- 아래의 명령어를 입력하여 iptables를 활성화합니다.
sudo yum install iptables-services -y
sudo systemctl enable iptables
sudo systemctl start iptables
- 재부팅 후에도 IP 포워딩이 유지되도록
sysctl
설정을 변경하겠습니다. vi 에디터를 사용하여 아래의 파일을 생성합니다.
sudo vi /etc/sysctl.d/custom-ip-forwarding.conf
- 아래의 내용을 입력하고 저장합니다.
net.ipv4.ip_forward = 1
- 아래의 명령어를 입력하여 설정을 적용합니다.
sudo sysctl -p /etc/sysctl.d/custom-ip-forwarding.conf
- NAT을 구성하기 이전에
netstat
명령어를 사용하여 기본 네트워크 인터페이스의 이름을 기록해놓겠습니다.
netstat -i
위의 명령어를 실행하면 아래와 같은 결과가 나옵니다.
Kernel Interface table
Iface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
enX0 9001 19177 0 0 0 5563 0 0 0 BMRU
lo 65536 12 0 0 0 12 0 0 0 LRU
enX0
라는 인테페이스의 이름을 기록해놓습니다. 아래와 같이 다른 인터페이스가 나오면 해당 인터페이스의 이름을 기록해놓습니다.
Iface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
ens5 9001 14036 0 0 0 2116 0 0 0 BMRU
lo 65536 12 0 0 0 12 0 0 0 LRU
- 아래의 명령어를 입력하여 NAT을 구성합니다.
sudo /sbin/iptables -t nat -A POSTROUTING -o enX0 -j MASQUERADE
sudo /sbin/iptables -F FORWARD
sudo service iptables save
위의 명령어에서 enX0
는 앞서 기록해놓은 인터페이스의 이름을 입력합니다.
2-7. NAT Instance의 source/destination 검사 중지하기
모든 EC2 Instance는 기본적으로 source/destination 검사가 활성화되어 있습니다. source/destination 검사란, 해당 인스턴스가 반드시 송수신 하는 모든 트래픽의 출발지와 목적지가 되어야 한다는 것을 의미합니다. NAT Instance는 이러한 제약을 받으면 안되므로 source/destination 검사를 중지해야 합니다.
- AWS의 EC2 서비스로 이동하여 Instances를 클릭합니다.
- 생성한 NAT Instance를 선택하고, Actions 버튼을 클릭한 후 Networking > Change source/destination check를 클릭합니다.
- Source / destination checking 에서 Stop을 클릭하여 source/destination 검사를 중지합니다.
- Save 버튼을 클릭하여 변경사항을 저장합니다.
2-8. Private Subnet Route Table 설정하기
위의 과정들을 통해서 NAT Instance를 생성하고 설정했습니다. 이제 Private Subnet의 라우팅 테이블을 수정하여 Private Subnet의 인스턴스들이 NAT Instance를 통해 인터넷에 접속할 수 있도록 설정하겠습니다.
- AWS의 VPC 서비스로 이동하여 Route Tables를 클릭합니다.
- 위에서
ecsdeploy-vpc
VPC를 생성할 때 생성한 Private Subnet 중 하나의 Route Table을 선택합니다. (예시:ecsdeploy-rtb-private1-ap-northeast-2a
)
- Routes>Edit routes 버튼을 클릭, Edit routes 페이지에서 Add route 버튼을 눌러 아래와 같은 설정을 추가합니다.
- Destination:
0.0.0.0/0
- Target:
Instance
를 선택하고, 위에서 생성한 NAT Instance를 선택 (예시:gerrymandering-ecsdeploy-nat-EC2
)
- Save changes 버튼을 클릭하여 변경사항을 저장합니다.
- 다시 Route Tables 페이지로 돌아와서, 다른 Private Subnet의 Route Table을 선택하여 위의 과정을 반복합니다. (예시:
ecsdeploy-rtb-private2-ap-northeast-2c
)
다음 글: Route 53 Hosted Zone 생성 및 ACM SSL 인증서 발급
ECS를 이용한 Blue/Green 무중단 배포 구성하기 (3) - Route 53 Hosted Zone 생성 및 ACM SSL 인증서 발급
ECS를 이용한 Blue:Green 무중단 배포 구성하기 (3) - Route 53 Hosted Zone 생성 및 ACM SSL 인증서 발급 작성 일자 : 2024년 6월 23일 본 포스팅에서 다루는 내용프로젝트 생성과 ECR 리포지토리VPC 생성 및 N
gerrymandering.tistory.com