AWS-CICD

(VPC Endpoints)NAT를 사용하지 않고 프라이빗 서브넷의 EC2 인스턴스에 CodeDeploy 배포 하기

backend 따라쟁이 2025. 3. 11. 23:45

프라이빗 서브넷의 EC2 인스턴스에 CodeDeploy를 통한 Application 배포 환경을 만들려면 어떻게하면 되는지 알아 보겠습니다.

퍼블릭 IP를 사용하는 EC2 인스턴스에서는 필요 없는 과정이나, 프라이빗 서브넷의 EC2의  보안이나 비용적인 측면 장점을 활용하고 싶다면 꼭 알고 있어야 하는 방법 입니다.

CodeDeploy 배포를 위해서는 EC2 인스턴스가 VPC 엔드포인드를 통해 AWS CodeDeploy, S3, EC2 서비스에 접근할 수 있도록 환경을 구성해야 합니다. 이때 보안 그룹(Security Group) 및 엔드포인트 정책을 이해하고 바르게 설정할 줄 알아야 합니다.  


1. 보안 그룹(Security Group) 설정

(1) VPC 엔드포인트를 위한 보안 그룹 생성/설정

  1. AWS 콘솔에서 VPC 서비스 → Endpoints로 이동
  2. 생성한 CodeDeploy, S3, EC2 엔드포인트 각각을 선택
  3. 하단의 보안 그룹에서 편집 버튼 클릭
  4. EC2 인스턴스가 접근할 수 있도록 인바운드 규칙 추가
    • 유형(Type): HTTPS (TCP 443)
    • 프로토콜(Protocol): TCP
    • 포트 범위(Port Range): 443
    • 소스(Source): EC2 인스턴스의 보안 그룹 (또는 특정 IP 대역)
      • sg-xxxxxxxxxxxx (EC2가 속한 보안 그룹)
      • 또는 10.0.0.0/16 (VPC 내부에서만 허용)

(그림) VPC엔드포인드 보안그룹 설정 예시


(2) 프라이빗 서브넷의 EC2 인스턴스를 위한 보안 그룹 생성/설정

  1. AWS 콘솔에서 EC2 서비스 → 인스턴스 → 해당 EC2 선택
  2. 보안 그룹 클릭 후 편집
  3. 아웃바운드 규칙에 추가
    • 유형(Type): HTTPS (TCP 443)
    • 프로토콜(Protocol): TCP
    • 포트 범위(Port Range): 443
    • 대상(Destination): VPC 엔드포인트의 보안 그룹 (sg-xxxxxxxxxxxx)

(그림) EC2 인스턴스의 보안그룹 아웃바운드 규칙 설정 예시

📌 설명:

  • EC2 → VPC 엔드포인트: 아웃바운드에서 HTTPS 443을 허용
  • VPC 엔드포인트 → EC2: 인바운드에서 HTTPS 443을 허용

2. VPC 엔드포인트 정책 설정

각 VPC 엔드포인트에는 접근 정책(Endpoint Policy) 을 적용하여 EC2 인스턴스에서 특정 AWS 서비스에 접근할 수 있도록 설정해야 합니다. 아래 그림과 같이 3가지 엔드포인트를 생성 합니다.

(그림) 3가지 VPC 엔드포인트 생성 예(CodeDeploy, S3, EC2 서비스 접근)

(1) CodeDeploy 엔드포인트 정책

  1. VPC 서비스 → Endpoints → CodeDeploy 엔드포인트 선택
  2. Policy 탭 클릭 → 편집 버튼 클릭
  3. 아래 JSON 정책을 입력 후 저장: 
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "codedeploy:*",
            "Resource": "*"
        }
    ]
}

(2) S3 엔드포인트 정책

S3는 애플리케이션 패키지를 다운로드하는 데 사용되므로, S3 버킷에 대한 접근을 허용해야 합니다.

  1. VPC 서비스 → Endpoints → S3 엔드포인트 선택
  2. Policy 탭 클릭 → 편집 버튼 클릭
  3. 아래 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 엔드포인트 정책

  1. VPC 서비스 → Endpoints → EC2 엔드포인트 선택
  2. Policy 탭 클릭 → 편집 버튼 클릭
  3. 아래 JSON 정책 입력 후 저장:
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "ec2:DescribeInstances",
            "Resource": "*"
        }
    ]
}

📌 이 정책은 CodeDeploy가 EC2 인스턴스 상태를 조회할 수 있도록 허용


3. 연결 확인

설정이 완료되면 EC2에서 VPC 엔드포인트를 통해 AWS 서비스에 정상적으로 접근할 수 있는지 확인해야 합니다.

(1) CodeDeploy 연결 확인

aws codedeploy list-applications --region <region>

👉 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 연결 확인

aws s3 ls s3://YOUR_BUCKET_NAME --region <region>

👉 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 연결 확인

aws ec2 describe-instances --region <region>

👉 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를 정상적으로 사용할 수 있습니다!