AWS CDK에서 VPC(Virtual Private Cloud)를 설계하는 것은 가장 강력한 기능 중 하나이다. 기존에는 서브넷, 라우팅 테이블, 인터넷 게이트웨이(IGW), NAT 게이트웨이를 하나하나 연결해야 했지만 CDK의 L2 객체인 Vpc를 사용하면 선언적 코드 몇 줄로 모든 인프라가 자동으로 구축된다.
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() {
}
}
프라이빗 서브넷의 리소스가 인터넷에 연결되도록 돕는다.
다음은 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;
}
}
위의 Java 코드 Vpc.Builder는 실제 배포 시 다음과 같은 리소스들을 자동으로 생성하고 연결한다.
natGateways(0)를 설정하고 PRIVATE_ISOLATED 서브넷만 사용하거나, natGateways(1)로 최소화하여 비용을 아낀다.maxAzs(3)이상을 설정하여 데이터 센터 장애에 대비한다.cidrMask를 적절히 설정하여 가용 IP 개수를 관리한다.VPC는 인프라의 뼈대이다. 이렇게 만든 VPC 객체를 다른 스택이나 컨스트럭트에 넘겨 그 내부에서 EC2나 RDS를 안전한 서브넷에 배치할 수 있게 된다.