2021年4月29日木曜日

CDK(TypeScript)で自分好みのVPCを作りたい

 

cdk で下記のようすると、1行でベストプラクティスのvpcを作ってくれます。

this.vpc = new ec2.Vpc(this, "TheVpc", cidr="10.0.0.0/16");

PublicSubnet,PrivateSubnet,IGW,Natgatewayなどが作られますが、

ちょっと検証したいだけの場合は、大げさすぎます。

NatGatewayは料金が高いし、あまり、使いたくありません。

自分好みのVPCを作りたい場合は、subnetConfigurationを空にします。

this.vpc = new ec2.Vpc(this, 'TheVPC', {
cidr: "10.0.0.0/16",
defaultInstanceTenancy: ec2.DefaultInstanceTenancy.DEFAULT,
enableDnsSupport: true,
enableDnsHostnames: true,
subnetConfiguration: []
});

PublicSubnet、PrivateSubnet、IGWだけにして、他のスタックでVpcID, SubnetIDを使用できるようにしたいと思ったら、

最終的に、以下のようになりました。

import * as ec2 from '@aws-cdk/aws-ec2';
import * as cdk from '@aws-cdk/core';

export class VpcStack extends cdk.Stack {
    vpc: ec2.IVpc;
    pubSubnet: ec2.ISubnet[] = new Array(2);
    priSubnet: ec2.ISubnet[] = new Array(2);

    constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
        super(scope, id, props);

        // resources

        const internetGateway = new ec2.CfnInternetGateway(this, "InternetGateway", {})

        this.vpc = new ec2.Vpc(this, 'TheVPC', {
            cidr: "10.0.0.0/16",
            defaultInstanceTenancy: ec2.DefaultInstanceTenancy.DEFAULT,
            enableDnsSupport: true,
            enableDnsHostnames: true,
            subnetConfiguration: []
        });

        const pub1 = new ec2.Subnet(this, "PublicSubnet1a", {
            availabilityZone: "us-east-1a",
            vpcId: this.vpc.vpcId,
            cidrBlock: "10.0.0.0/24"
        });
        pub1.addRoute("PubSubnetRoute", {
            routerType: ec2.RouterType.GATEWAY,
            routerId: internetGateway.ref
        });
        this.pubSubnet[0] = pub1

        const pub2 = new ec2.Subnet(this, "PublicSubnet1c", {
            availabilityZone: "us-east-1c",
            vpcId: this.vpc.vpcId,
            cidrBlock: "10.0.1.0/24"
        });
        pub2.addRoute("PubSubnetRoute", {
            routerType: ec2.RouterType.GATEWAY,
            routerId: internetGateway.ref
        });
        this.pubSubnet[1] = pub2

        this.priSubnet[0] =  new ec2.Subnet(this, "PrivateSubnet1a", {
            availabilityZone: "us-east-1a",
            vpcId: this.vpc.vpcId,
            cidrBlock: "10.0.10.0/24"
        });

        this.priSubnet[1] = new ec2.Subnet(this, "PrivateSubnet1c", {
            availabilityZone: "us-east-1c",
            vpcId: this.vpc.vpcId,
            cidrBlock: "10.0.11.0/24"
        });

        new ec2.CfnVPCGatewayAttachment(this, "gateway", {
            vpcId: this.vpc.vpcId,
            internetGatewayId: internetGateway.ref
        });

        // outputs

        new cdk.CfnOutput(this, 'VpcId', {
            description: 'vpc id',
            value: this.vpc.vpcId,
            exportName: `${this.stackName}-vpcId`
        });

        new cdk.CfnOutput(this, 'PublicSubnetId1', {
            description: 'public subnet id (a)',
            value: this.pubSubnet[0].subnetId,
            exportName: `${this.stackName}-publicSubnetId1`
        });

        new cdk.CfnOutput(this, 'PublicSubnetId2', {
            description: 'public subnet id (c)',
            value: this.pubSubnet[1].subnetId,
            exportName: `${this.stackName}-publicSubnetId2`
        });

        new cdk.CfnOutput(this, 'PrivateSubnetId1', {
            description: 'private subnet id (a)',
            value: this.priSubnet[0].subnetId,
            exportName: `${this.stackName}-privateSubnetId1`
        });

        new cdk.CfnOutput(this, 'PrivateSubnetId2', {
            description: 'private subnet id (c)',
            value: this.priSubnet[1].subnetId,
            exportName: `${this.stackName}-privateSubnetId2`
        });
    }
}


low-levelのCfnVPCを使う方法は、下記ページが詳しいです。


Constructの種類(high-level, low-level,pattern)については、下記ページが詳しいです。