AWS CDK: VPC 설계

김기현·2026년 2월 1일

AWS

목록 보기
36/44

AWS CDK에서 VPC(Virtual Private Cloud)를 설계하는 것은 가장 강력한 기능 중 하나이다. 기존에는 서브넷, 라우팅 테이블, 인터넷 게이트웨이(IGW), NAT 게이트웨이를 하나하나 연결해야 했지만 CDK의 L2 객체인 Vpc를 사용하면 선언적 코드 몇 줄로 모든 인프라가 자동으로 구축된다.


1. VPC 설계의 핵심 개념

SubnetConfiguration (서브넷 설정)

VPC 내부의 네트워크 구역을 정의한다. CDK는 SubnetType을 통해 서브넷의 성격을 결정하며 이에 필요한 라우팅 설정을 자동으로 수행한다.

package software.amazon.awscdk.services.ec2;

@Jsii(
    module = .Module.class,
    fqn = "aws-cdk-lib.aws_ec2.SubnetConfiguration"
)
@Proxy(Jsii$Proxy.class)
public interface SubnetConfiguration extends JsiiSerializable {
    @NotNull String getName();

    @NotNull SubnetType getSubnetType();

    default @Nullable Number getCidrMask() {
        return null;
    }

    default @Nullable Boolean getMapPublicIpOnLaunch() {
        return null;
    }

    default @Nullable Boolean getReserved() {
        return null;
    }

    static Builder builder() {
        return new Builder();
    }
    
    // 중략
}
package software.amazon.awscdk.services.ec2;

@Jsii(
    module = .Module.class,
    fqn = "aws-cdk-lib.aws_ec2.SubnetType"
)
public enum SubnetType {
    PRIVATE_ISOLATED,
    PRIVATE_WITH_EGRESS,
    /** @deprecated */
    @Deprecated
    PRIVATE_WITH_NAT,
    PUBLIC;

    private SubnetType() {
    }
}
  • PUBLIC: 인터넷 게이트웨이(IGW)와 연결되어 외부 인바운드/아웃바운드가 가능하다.
  • PRIVATE_WITH_EGRESS: 외부에서 직접 접속은 불가능하지만, NAT 게이트웨이를 통해 외부로 나갈 수 있다. (람다, EC2 등 위치)
  • PRIVATE_ISOLATED: 외부와 완전히 차단된 내부망이다. (DB, 캐시 리소스 위치)

NAT Gateways(네트워크 주소 변환)

프라이빗 서브넷의 리소스가 인터넷에 연결되도록 돕는다.

  • 과도한 비용 위험: NAT 게이트웨이는 시간당 비용과 데이터 처리 비용이 발생하므로, 환경(개발과 운영)에 따라 개수를 적절하게 조절해야 한다.

2. Java로 구현한 VPC 설계 예제

다음은 2개의 가용 영역(AZ)을 사용하고, 퍼블릿/프라이빗 서브넷과 NAT 게이트웨이를 구성하는 코드이다.

public class NetworkConstruct extends Construct {
    private final Vpc vpc;

    public NetworkConstruct(final Construct scope, final String id) {
        super(scope, id);

        this.vpc = Vpc.Builder.create(this, "MainVpc")
                .maxAzs(2) // 가용 영역(AZ)을 2개 사용 (고가용성)
                .ipAddresses(IpAddresses.cidr("10.0.0.0/16")) // VPC 전체 CIDR 블록
                
                // 서브넷 구성 정의
                .subnetConfiguration(List.of(
                        SubnetConfiguration.builder()
                                .name("Public")
                                .subnetType(SubnetType.PUBLIC)
                                .cidrMask(24) // 10.0.x.0/24
                                .build(),
                        SubnetConfiguration.builder()
                                .name("Private")
                                .subnetType(SubnetType.PRIVATE_WITH_EGRESS)
                                .cidrMask(24)
                                .build(),
                        SubnetConfiguration.builder()
                                .name("Database")
                                .subnetType(SubnetType.PRIVATE_ISOLATED)
                                .cidrMask(24)
                                .build()
                ))
                
                // NAT Gateway 개수 설정
                // 각 AZ마다 생성하려면 .natGateways(2)
                // 비용 절감을 위해 하나만 생성하려면 .natGateways(1)
                .natGateways(1) 
                .build();
    }

    public Vpc getVpc() {
        return this.vpc;
    }
}

3. 코드 한 줄이 만드는 변화: 추상화

위의 Java 코드 Vpc.Builder는 실제 배포 시 다음과 같은 리소스들을 자동으로 생성하고 연결한다.

  1. VPC 자체: CIDR 설정 및 생성
  2. Internet Gateway: 퍼블릿 서브넷 통신용 IGW 생성 및 VPC 연결
  3. Subnets: 설정한 대로 총 6개(3개의 타입 x 2개의 AZ)의 서브넷 생성
  4. Route Tables: 각 서브넷 타입에 맞는 라우팅 테이블 생성
    • Public → IGW 라우팅 등록
    • Private → NAT Gatway 라우팅 등록
  5. NAT Gateway & Elasric IP: 프라이빗 통신을 위한 고정 IP 할당 및 NAT 게이트웨이 생성

4. 설계 팁

  • 비용 최적화: 개발 환경에서는 natGateways(0)를 설정하고 PRIVATE_ISOLATED 서브넷만 사용하거나, natGateways(1)로 최소화하여 비용을 아낀다.
  • 고가용성: 운영 환경에서는 maxAzs(3)이상을 설정하여 데이터 센터 장애에 대비한다.
  • CIDR 관리: cidrMask를 적절히 설정하여 가용 IP 개수를 관리한다.
    • 24비트는 약 251개의 가용 IP를 제공한다.

VPC는 인프라의 뼈대이다. 이렇게 만든 VPC 객체를 다른 스택이나 컨스트럭트에 넘겨 그 내부에서 EC2나 RDS를 안전한 서브넷에 배치할 수 있게 된다.

profile
백엔드 개발자를 목표로 공부하는 대학생

0개의 댓글