1. Amazon VPC の作成
- 作成者: moritalous
- 作成日: 2023/08/14
VPCを作成
VPCを作成します。
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
// import * as sqs from 'aws-cdk-lib/aws-sqs';
import * as ec2 from 'aws-cdk-lib/aws-ec2';
export class HandsonCdkStack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
// The code that defines your stack goes here
// example resource
// const queue = new sqs.Queue(this, 'HandsonCdkQueue', {
// visibilityTimeout: cdk.Duration.seconds(300)
// });
const vpc = new ec2.Vpc(this, 'VPC', {})
}
}
リソースごとにaws-cdk-lib
(モジュール)が用意されています。
VPCリソースはaws_ec2モジュールです。
new ec2.Vpc(scope, id, props)
でVPCを定義します。CDKで作成するリソースの引数は共通です。
scope
コンストラクトの親または所有者。通常は、現在のオブジェクトを表すスコープをthisを渡す必要があります。
id
このスコープ内で一意である必要がある識別子。識別子は、現在の構成内で定義されているすべてのものの名前空間として機能します。これは、リソース名や AWS CloudFormation 論理 ID などの一意の識別子を生成するために使用されます。
props
言語に応じて、構造の初期構成を定義するプロパティまたはキーワード引数のセット。ほとんどの場合、構成要素は適切なデフォルトを提供し、すべての props 要素がオプションの場合は、 propsパラメーターを完全に省略できます。
ここまで記述できたらソースを保存し、以下のコマンドを実行します。
cdk synth > template.yaml
cdk synth
コマンドはCDKの定義からCloudFormationのテンプレートを生成し出力します。
VPC以外にも様々なリソースが定義されます。
cat template.yaml | grep Type
Type: AWS::EC2::VPC
Type: AWS::EC2::Subnet
Type: AWS::EC2::RouteTable
Type: AWS::EC2::SubnetRouteTableAssociation
Type: AWS::EC2::Route
Type: AWS::EC2::EIP
Type: AWS::EC2::NatGateway
Type: AWS::EC2::Subnet
Type: AWS::EC2::RouteTable
Type: AWS::EC2::SubnetRouteTableAssociation
Type: AWS::EC2::Route
Type: AWS::EC2::EIP
Type: AWS::EC2::NatGateway
Type: AWS::EC2::Subnet
Type: AWS::EC2::RouteTable
Type: AWS::EC2::SubnetRouteTableAssociation
Type: AWS::EC2::Route
Type: AWS::EC2::Subnet
Type: AWS::EC2::RouteTable
Type: AWS::EC2::SubnetRouteTableAssociation
Type: AWS::EC2::Route
Type: AWS::EC2::InternetGateway
Type: AWS::EC2::VPCGatewayAttachment
Type: Custom::VpcRestrictDefaultSG
Type: AWS::IAM::Role
Type: AWS::Lambda::Function
Type: AWS::CDK::Metadata
Type: AWS::SSM::Parameter::Value<String>
Constructs
CDKにはConstructs(コンストラクト)という概念があり、ec2.Vpc
はL2 constructsに当たるものです。
- L1 constructs
AWS CloudFormationで利用可能なすべてのリソースを直接表現します。これらはCfnXyzという名前で、Xyzはリソースの名前です(例:CfnVPC)。Cfnリソースを使用する場合、すべてのリソースプロパティを明示的に設定する必要があります。
- L2 constructs
L1 constructsは、定型文やリソース間の結合ロジックをすべて自分で記述する必要があります。L2 constructsは便利なデフォルト値を提供し、それらが表すAWSリソースの詳細を知る必要性を減らします。
また、リソースをより簡単に扱うための便利なメソッドも提供します。(例えば、s3.BucketクラスはAmazon S3バケットを表し、バケットにライフサイクルルールを追加するbucket.addLifeCycleRule()のようなプロパティやメソッドが追加されています。)
デフォルト値からの変更
AWSが推奨する値がデフォルト値として指定された状態でリソースが作成されるため、すべての設定項目を把握していなくてもリソースの作成が行なえます。もちろん、デフォルトから変更することも可能です。
例えばNatGatewayを作成したくない場合はこのように指定します。
const vpc = new ec2.Vpc(this, 'VPC', {
natGateways: 0
})
この状態で再度CloudFormationテンプレートを生成します。
cdk synth > template_2.yaml
cat template_2.yaml | grep Type
Type: AWS::EC2::VPC
Type: AWS::EC2::Subnet
Type: AWS::EC2::RouteTable
Type: AWS::EC2::SubnetRouteTableAssociation
Type: AWS::EC2::Route
- Type: AWS::EC2::EIP
- Type: AWS::EC2::NatGateway
Type: AWS::EC2::Subnet
Type: AWS::EC2::RouteTable
Type: AWS::EC2::SubnetRouteTableAssociation
Type: AWS::EC2::Route
- Type: AWS::EC2::EIP
- Type: AWS::EC2::NatGateway
Type: AWS::EC2::Subnet
Type: AWS::EC2::RouteTable
Type: AWS::EC2::SubnetRouteTableAssociation
- Type: AWS::EC2::Route
Type: AWS::EC2::Subnet
Type: AWS::EC2::RouteTable
Type: AWS::EC2::SubnetRouteTableAssociation
- Type: AWS::EC2::Route
Type: AWS::EC2::InternetGateway
Type: AWS::EC2::VPCGatewayAttachment
Type: Custom::VpcRestrictDefaultSG
Type: AWS::IAM::Role
Type: AWS::Lambda::Function
Type: AWS::CDK::Metadata
Type: AWS::SSM::Parameter::Value<String>
NatGatewayが作成されなくなっていることがわかります。また、NatGatewayに関連するEIPやRouteも作成されなくなっています。