🎱

[超初心者]AWS CDKのL1,L2,L3とCFnで作成されるVPCについて眺めてみた。

2023/08/29に公開

まずは先にわかった事まとめ

【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