AWS CDKでリソース作成 第1回: VPC編

こんにちは。 エキサイト株式会社で内定者アルバイトをしています。

今回からは、実際のリソースの作成を行いたいと思います。初回は、VPCです。

VPCとは?

VPCはVirtual Private Cloudの略で、仮想ネットワーク上でAWSリソースをを起動できるようにするサービスです。VPCはネットワーク空間であり、この上でEC2やRDSなどのリソースを稼働させることができます。

独自のIPアドレスの範囲の選択、サブネットの作成、ルートテーブルやネットワークゲートウェイの設定など、仮想ネットワーク環境を完全に制御でき、オンプレミス環境でのネットワーク構築よりも遥かに容易にネットワークを立ち上げることができます。

コード

今回作成するVPCに紐づけるサブネットは以下のようになっています。

Availability Zone
Private サブネット1 ap-northeast-1a
Private サブネット2 ap-northeast-1c
Public サブネット1 ap-northeast-1a
Public サブネット2 ap-northeast-1c

また、2つのPublic サブネットにはNATゲートウェイを設置します(NATゲートウェイには料金の問題がありますが、今回はCDKの調査も兼ねて設置します)

package com.myorg;

import software.amazon.awscdk.CfnTag;
import software.amazon.awscdk.services.ec2.CfnInternetGateway;
import software.amazon.awscdk.services.ec2.CfnVPCGatewayAttachment;
import software.amazon.awscdk.services.ec2.PrivateSubnet;
import software.amazon.awscdk.services.ec2.PublicSubnet;
import software.amazon.awscdk.services.ec2.Vpc;
import software.constructs.Construct;
import software.amazon.awscdk.Stack;
import software.amazon.awscdk.StackProps;

import java.util.List;

public class MyProjectStack extends Stack {
    public MyProjectStack(final Construct scope, final String id) {
        this(scope, id, null);
    }

    public MyProjectStack(final Construct scope, final String id, final StackProps props) {
        super(scope, id, props);

        // ①
        Vpc vpc = Vpc.Builder.create(this, "SampleVPC")
                .vpcName("sample-vpc")
                .cidr("cidr")
                .subnetConfiguration(List.of())
                .build();

        // ②
        // Availability zone: ap-northeast-1a
        PrivateSubnet privateSubnetA = PrivateSubnet.Builder.create(this, "PrivateSubnetA")
                .availabilityZone("ap-northeast-1a")
                .vpcId(vpc.getVpcId())
                .cidrBlock("cidr")
                .build();

        // ③
        PublicSubnet publicSubnetA = PublicSubnet.Builder.create(this, "PublicSubnetA")
                .availabilityZone("ap-northeast-1a")
                .vpcId(vpc.getVpcId())
                .cidrBlock("cidr")
                .build();

        // Availability zone: ap-northeast-1c
        PrivateSubnet privateSubnetB = PrivateSubnet.Builder.create(this, "PrivateSubnetB")
                .availabilityZone("ap-northeast-1c")
                .vpcId(vpc.getVpcId())
                .cidrBlock("cidr")
                .build();

        PublicSubnet publicSubnetB = PublicSubnet.Builder.create(this, "PublicSubnetB")
                .availabilityZone("ap-northeast-1c")
                .vpcId(vpc.getVpcId())
                .cidrBlock("cidr")
                .build();

        // ④
        // NAT gatewayの追加
        publicSubnetA.addNatGateway();
        publicSubnetB.addNatGateway();

        // ⑤
        // Internet Gateway
        CfnInternetGateway internetGateway = CfnInternetGateway.Builder.create(this, "InternetGateway")
                .tags(List.of(CfnTag.builder()
                        .key("Name")
                        .value("sample-internet-gateway")
                        .build()))
                .build();

        // Internet gatewayをVPCにattachする
        CfnVPCGatewayAttachment.Builder.create(this, "VpcGateAwayAttachment")
                .vpcId(vpc.getVpcId())
                .internetGatewayId(internetGateway.getAttrInternetGatewayId())
                .build();
    }
}

CIDRについてはご自身が使用したいものを入れてください。

以下、コードに関する簡単な説明です。

まず、①の部分でVPCを作成しています。subnetConfiguration()maxAzs()と同時に指定することでmaxAzs分のサブネットを自動で生成してくれます。ただし、今回はサブネットもこちら側で作成するために(勝手にサブネットを生成させないために)、空のリストを渡しています。

②、③の部分では、実際にサブネットを作成しています。②ではPrivate サブネットを③ではPublic サブネットを作成しています。それぞれavailability zoneとCIDRの設定を行なっています。

④でNATゲートウェイを追加しています。

⑤では、インターネットゲートウェイVPCに接続しています。インターネットゲートウェイはL1コンストラクトしか存在しないため、ここだけはL1コンストラクトを用いています(恐らく、VpcがL2コンストラクトであり、前述のsubnetConfiguration()でサブネットを生成すると自動でインターネットゲートウェイを設置してくれるため、開発チームが「通常は必要ない」と判断したからかと思います。)

デプロイ

ここまで書いたら、あとはデプロイをするだけです!

いつものように

cdk deploy

を実行してデプロイしましょう。CloudFormationテンプレートの確認とエラー検出のためにcdk synthを先に実行しても良いでしょう。

マネジメントコンソールで確認し、VPCとサブネットが4つ作成されていたら成功です。

終わりに

今回は、AWS CDKを用いてVPCを作成しました。

ささっと作りたいのであれば、subnetConfiguration()メソッドを使ってサブネットを作成することができますが、より詳細に設定したい場合にはサブネットを別で作成して、あとでVPCに紐づけると良いようです。

では、また次回。

次の記事 tech.excite.co.jp

参考文献