こんにちは。 エキサイト株式会社で内定者アルバイトをしています。
今回からは、実際のリソースの作成を行いたいと思います。初回は、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つ作成されていたら成功です。
終わりに
ささっと作りたいのであれば、subnetConfiguration()
メソッドを使ってサブネットを作成することができますが、より詳細に設定したい場合にはサブネットを別で作成して、あとでVPCに紐づけると良いようです。
では、また次回。
次の記事 tech.excite.co.jp