[超初心者]AWS CDKのL1,L2,L3とCFnで作成されるVPCについて眺めてみた。
まずは先にわかった事まとめ
【L1コンストラクト】
・L1で作成した時にCFnで指定必須であるプロパティを明示的に設定しなかった場合エディタ上ではリンターが注意してくれたりはしない。cdk synth時もエラーが起きたりはしない。Deployすると失敗した際のエラーが表示される。
・L1では論理名は第二引数と一致。
【L2コンストラクト】
・L2以上で作成されるリソース(ここではVPC)はAWSが「こうであるべき」と考えるオススメの設定が反映される。例えば「EnableDnsHostnames」はデフォルトはfalseだがtrueになる等。(EnableDnsSupport: trueやInstanceTenancy: defaultというのはデフォルト値と同じはずだが、何故かsynthの時は明示的に指定された事になる。)
・L2の論理名は第二引数+ランダム文字列(synthを二回連続で叩いてみたが論理名は同じだった。)
【L3コンストラクト】
・L3をL2と比較したが特筆すべき発見はなし。
それぞれデプロイしてみる
CloudFormation
エディタ上(.yml)
※以下条件がある為CidrBlockのみ明示的に指定。
AWSTemplateFormatVersion: 2010-09-09
Resources:
VPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock: 10.0.0.0/16
マネコンで確認
ec2.CfnVPC(L1)
エディタ上(.ts)
以下のようにCidrBlockを指定しないでもエディタ上では赤い波線が出たりはしない。
import { Duration, Stack, StackProps } from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as ec2 from 'aws-cdk-lib/aws-ec2';
export class CdkSampleStack extends Stack {
constructor(scope: Construct, id: string, props?: StackProps) {
super(scope, id, props);
const vpc = new ec2.CfnVPC(this, 'Vpc', {});
}
}
cdk synthで表示されるVPC部分
ここでもエラーは出ない。
当然L1なのでCidrBlockのデフォルト値を足してくれてる訳でもない。
論理名は第二引数の'Vpc'と一致。
Vpc:
Type: AWS::EC2::VPC
Metadata:
aws:cdk:path: CdkSampleStack/Vpc
cdk deployすると
11:44:53 PM | CREATE_FAILED | AWS::EC2::VPC | Vpc
Resource handler returned message: "Either CIDR Block or IPv4 IPAM Pool and IPv4 Netmask Length must be provided" (RequestToken: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx, HandlerErrorCode: InvalidRequ
est)
ここで怒られた。
cidrBlockを追加
import { Duration, Stack, StackProps } from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as ec2 from 'aws-cdk-lib/aws-ec2';
export class CdkSampleStack extends Stack {
constructor(scope: Construct, id: string, props?: StackProps) {
super(scope, id, props);
const vpc = new ec2.CfnVPC(this, 'Vpc', {
cidrBlock: '10.0.0.0/16'
});
}
}
cdk synthで表示されるVPC部分
Vpc:
Type: AWS::EC2::VPC
Properties:
CidrBlock: 10.0.0.0/16
Metadata:
aws:cdk:path: CdkSampleStack/Vpc
マネコンで確認
今度はcdk deploy成功。
✅ CdkSampleStack
✨ Deployment time: 23.57s
CloudFormationと同じ結果ですね。
ec2.Vpc(L2)
エディタ上(.ts)
import { Duration, Stack, StackProps } from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as ec2 from 'aws-cdk-lib/aws-ec2';
export class CdkSampleStack extends Stack {
constructor(scope: Construct, id: string, props?: StackProps) {
super(scope, id, props);
const vpc = new ec2.Vpc(this, 'Vpc', {});
}
}
cdk synthで表示されるVPC部分
L2なのでCDKのこれがオススメという意志が反映される訳らしい。
Vpc8378EB38:
Type: AWS::EC2::VPC
Properties:
CidrBlock: 10.0.0.0/16
EnableDnsHostnames: true
EnableDnsSupport: true
InstanceTenancy: default
Tags:
- Key: Name
Value: CdkSampleStack/Vpc
Metadata:
aws:cdk:path: CdkSampleStack/Vpc/Resource
・「EnableDnsSupport」はデフォルトでtrue。
・「InstanceTenancy」デフォルトで"default"
のはずだけど明示する意味ある?
「EnableDnsHostnames: true」だけtrueにするとエラーが起きるなんて事はない認識。
と思ったので
追加確認
AWSTemplateFormatVersion: 2010-09-09
Resources:
VPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock: 10.0.0.0/16
EnableDnsHostnames: true
結果普通に「CREATE_COMPLETE」しました。
二回連続でcdk synthしてみた
論理名は変わらない訳ね。
Vpc8378EB38:
Type: AWS::EC2::VPC
Properties:
CidrBlock: 10.0.0.0/16
EnableDnsHostnames: true
EnableDnsSupport: true
InstanceTenancy: default
Tags:
- Key: Name
Value: CdkSampleStack/Vpc
Metadata:
aws:cdk:path: CdkSampleStack/Vpc/Resource
マネコンで確認
ちゃんとDNS ホスト名が有効になっていますね。
ecs_patterns.ApplicationLoadBalancedFargateService(L3)
エディタ上(.ts)
以下のように「taskImageOptions」の中の「image」は必須の為指定。
Error: You must specify one of: taskDefinition or image
at new ApplicationLoadBalancedFargateService
import { Duration, Stack, StackProps } from 'aws-cdk-lib';
import { Construct } from 'constructs';
import { aws_ecs as ecs } from 'aws-cdk-lib';
import { aws_ecs_patterns as ecs_patterns } from 'aws-cdk-lib';
export class CdkSampleStack extends Stack {
constructor(scope: Construct, id: string, props?: StackProps) {
super(scope, id, props);
const service = new ecs_patterns.ApplicationLoadBalancedFargateService(this, 'Service', {
taskImageOptions: {
image: ecs.ContainerImage.fromRegistry('public.ecr.aws/nginx/nginx:latest'),
},
});
}}
cdk synthで表示されるVPC部分
EcsDefaultClusterMnL3mNNYNVpc7788A521:
Type: AWS::EC2::VPC
Properties:
CidrBlock: 10.0.0.0/16
EnableDnsHostnames: true
EnableDnsSupport: true
InstanceTenancy: default
Tags:
- Key: Name
Value: CdkSampleStack/EcsDefaultClusterMnL3mNNYN/Vpc
Metadata:
aws:cdk:path: CdkSampleStack/EcsDefaultClusterMnL3mNNYN/Vpc/Resource
マネコンで確認
L2と同じでした。
以上でした
これはわからないで発言していますが、別の想定のL2、L3のものだとまたVPCの設定が変わるものもあるかもしれません。疑問を解決しながら少しずつ勉強していきたいと思います。
認識違いの部分があれば是非是非ご教示いただければ嬉しいです。
有難う御座いました。
Discussion