프라이빗 서브넷의 EC2 인스턴스에 CodeDeploy를 통한 Application 배포 환경을 만들려면 어떻게하면 되는지 알아 보겠습니다.
퍼블릭 IP를 사용하는 EC2 인스턴스에서는 필요 없는 과정이나, 프라이빗 서브넷의 EC2의 보안이나 비용적인 측면 장점을 활용하고 싶다면 꼭 알고 있어야 하는 방법 입니다.
CodeDeploy 배포를 위해서는 EC2 인스턴스가 VPC 엔드포인드를 통해 AWS CodeDeploy, S3, EC2 서비스에 접근할 수 있도록 환경을 구성해야 합니다. 이때 보안 그룹(Security Group) 및 엔드포인트 정책을 이해하고 바르게 설정할 줄 알아야 합니다.
1. 보안 그룹(Security Group) 설정
(1) VPC 엔드포인트를 위한 보안 그룹 생성/설정
- AWS 콘솔에서 VPC 서비스 → Endpoints로 이동
- 생성한 CodeDeploy, S3, EC2 엔드포인트 각각을 선택
- 하단의 보안 그룹에서 편집 버튼 클릭
- EC2 인스턴스가 접근할 수 있도록 인바운드 규칙 추가
- 유형(Type): HTTPS (TCP 443)
- 프로토콜(Protocol): TCP
- 포트 범위(Port Range): 443
- 소스(Source): EC2 인스턴스의 보안 그룹 (또는 특정 IP 대역)
- sg-xxxxxxxxxxxx (EC2가 속한 보안 그룹)
- 또는 10.0.0.0/16 (VPC 내부에서만 허용)
(2) 프라이빗 서브넷의 EC2 인스턴스를 위한 보안 그룹 생성/설정
- AWS 콘솔에서 EC2 서비스 → 인스턴스 → 해당 EC2 선택
- 보안 그룹 클릭 후 편집
- 아웃바운드 규칙에 추가
- 유형(Type): HTTPS (TCP 443)
- 프로토콜(Protocol): TCP
- 포트 범위(Port Range): 443
- 대상(Destination): VPC 엔드포인트의 보안 그룹 (sg-xxxxxxxxxxxx)
📌 설명:
- EC2 → VPC 엔드포인트: 아웃바운드에서 HTTPS 443을 허용
- VPC 엔드포인트 → EC2: 인바운드에서 HTTPS 443을 허용
2. VPC 엔드포인트 정책 설정
각 VPC 엔드포인트에는 접근 정책(Endpoint Policy) 을 적용하여 EC2 인스턴스에서 특정 AWS 서비스에 접근할 수 있도록 설정해야 합니다. 아래 그림과 같이 3가지 엔드포인트를 생성 합니다.
(1) CodeDeploy 엔드포인트 정책
- VPC 서비스 → Endpoints → CodeDeploy 엔드포인트 선택
- Policy 탭 클릭 → 편집 버튼 클릭
- 아래 JSON 정책을 입력 후 저장:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": "codedeploy:*", "Resource": "*" } ] } |
(2) S3 엔드포인트 정책
S3는 애플리케이션 패키지를 다운로드하는 데 사용되므로, S3 버킷에 대한 접근을 허용해야 합니다.
- VPC 서비스 → Endpoints → S3 엔드포인트 선택
- Policy 탭 클릭 → 편집 버튼 클릭
- 아래 JSON 정책 입력 후 저장:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": [ "s3:GetObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::YOUR_BUCKET_NAME", "arn:aws:s3:::YOUR_BUCKET_NAME/*" ] } ] } |
📌 YOUR_BUCKET_NAME을 실제 S3 버킷 이름으로 변경
(3) EC2 엔드포인트 정책
- VPC 서비스 → Endpoints → EC2 엔드포인트 선택
- Policy 탭 클릭 → 편집 버튼 클릭
- 아래 JSON 정책 입력 후 저장:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": "ec2:DescribeInstances", "Resource": "*" } ] } |
📌 이 정책은 CodeDeploy가 EC2 인스턴스 상태를 조회할 수 있도록 허용
3. 연결 확인
설정이 완료되면 EC2에서 VPC 엔드포인트를 통해 AWS 서비스에 정상적으로 접근할 수 있는지 확인해야 합니다.
(1) CodeDeploy 연결 확인
👉 CodeDeploy에 등록된 애플리케이션 목록이 출력되면 정상 연결됨.
또는 CLI가 설치되지 않은 경우에는 URL 호출을 통해 확인하면됨.
curl -v https://codedeploy.<region>.amazonaws.com
✔ 정상적인 경우 * Connected to codedeploy.<region>.amazonaws.com (XX.XX.XX.XX) port 443 * SSL connection using TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 🚨 비정상적인 경우 curl: (6) Could not resolve host: codedeploy.<region>.amazonaws.com 💡 VPC 엔드포인트가 올바르게 설정되지 않았거나 보안 그룹이 차단된 상태일 가능성 있음. |
(2) S3 연결 확인
👉 S3 버킷의 객체 목록이 표시되면 정상 연결됨.
또는 CLI가 설치되지 않은 경우에는 URL 호출을 통해 확인하면됨.
curl -I http://s3.<region>.amazonaws.com/YOUR_BUCKET_NAME
✔ 정상적인 경우 HTTP/1.1 403 Forbidden ✔ 또는, 만약 공개된 버킷이면: HTTP/1.1 200 OK 🚨 비정상적인 경우 curl: (6) Could not resolve host 💡 S3 VPC 엔드포인트 문제 가능성 높음 |
(3) EC2 연결 확인
👉 EC2 인스턴스 목록이 표시되면 정상 연결됨.
또는 CLI가 설치되지 않은 경우에는 URL 호출을 통해 확인하면됨
curl -v https://ec2.<region>.amazonaws.com
✔ 정상적인 경우 * Connected to ec2.<region>.amazonaws.com (XX.XX.XX.XX) port 443 * SSL connection using TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 🚨 비정상적인 경우 curl: (6) Could not resolve host: ec2.<region>.amazonaws.com
💡 VPC 엔드포인트가 없거나, 네트워크/보안 그룹 설정이 잘못됨. |
4. 추가 고려사항
✅ 인터넷 게이트웨이 없이도 AWS 서비스 연결 가능
✅ NAT 게이트웨이 없이도 엔드포인트를 통해 AWS 서비스와 통신 가능
✅ S3 엔드포인트는 반드시 Gateway 엔드포인트로 생성해야 함
✅ CodeDeploy 및 EC2 엔드포인트는 Interface 엔드포인트로 생성해야 함
이제 프라이빗 서브넷에서도 AWS CodeDeploy를 정상적으로 사용할 수 있습니다!