MENU

【初心者むけ】AWS CDKでVPCを作成する

1. はじめに

お世話になります、株式会社エイトハンドレッド・テクノロジー本部の志賀と申します。

1-1. 本記事の目的

本記事ではこちらの記事の内容をeight-hundred-800-dev.hatenablog.com

AWS CDK(AWS CDKとは)で作成いたします。 AWS CDKでリソースを作成する際の簡易さや、CloudFormationでリソースを構築する場合との差異を見ていきます。

なお、AWS CDKの環境構築およびデプロイの方法については以下の公式ドキュメントをご参照ください。

【参考】 AWS CDKの開始方法

【参考】 AWS CDKはじめてのアプリ

2. 構成図

構成図は以下の通りです。

3. CDKソース

CDKのバージョンは以下の通りです。Python3.9で開発しています。

$ cdk --version
2.101.1 (build 16ddad1)

$ python -V
Python 3.9.10

3-1. プログラムの全体図

from aws_cdk import (
    core,
    aws_ec2 as ec2,
)
import os
from aws_cdk.core import Stack,CfnOutput

class NetworkStack(Stack): 
    def __init__(
        self, 
        scope: core.App, 
        name: str,
        **kwargs
    ) -> None:
        super().__init__(scope, name, **kwargs)
        
        resource_name:str = 'ForCdkCoding'

        # create VPC
        vpc = ec2.Vpc(
            self,
            vpc_name=f"Vpc{resource_name}",
            id="vpc",
            cidr="172.16.0.0/16",
            max_azs=2,
            nat_gateways=0, 
            enable_dns_hostnames=True,
            enable_dns_support=True,
            # Create Private Subnet
            subnet_configuration=[
                ec2.SubnetConfiguration(
                    name=f"PriSubnet{resource_name}",
                    subnet_type=ec2.SubnetType.ISOLATED,
                    cidr_mask=24
                )
                ,
                ec2.SubnetConfiguration(
                    name=f"PubSubnet{resource_name}",
                    cidr_mask=24,
                    map_public_ip_on_launch=False,
                    subnet_type=ec2.SubnetType.PUBLIC
                )
                ,
            ]
        )

3-2. VPC

コードの詳細についてみていきます。各種オプションの説明は、以下の公式ドキュメントより引用しております。

【参考】API Reference VPC

【参考】API Reference Subnet

  • CidrBlock
cidr="172.16.0.0/16"

cidrパラメタでCIDR範囲を定義します。サブネットマスクの最少サイズは/28, 最大サイズは/16と定義されています。

  • max_azs
max_azs=2

このリージョンで使用するアベイラビリティーゾーンの最大数を定義します。

  • nat_gateways
nat_gateways=0

作成する NAT ゲートウェイの数を指定します。指定無しの場合、 アベイラビリティーゾーンごとに 1 つの NAT ゲートウェイが立ち上がってしまうので、不要な場合は明示的に”0”を指定してください。

  • enable_dns_hostnames, enable_dns_support
enable_dns_support=True,
enable_dns_hostnames=True,

enable_dns_supportがTrueの場合、VPC 内のリソースがDNS により名前解決されます。

enable_dns_hostnamesがTrueならVPC 内で起動されたインスタンスがパブリック DNS ホスト名を取得します。

enable_dns_hostnamesをTrueとする場合、enable_dns_supportもTrueである必要があります。

3-3. Subnet

  • Public
cidr_mask=24,
map_public_ip_on_launch=True,
subnet_type=ec2.SubnetType.PUBLIC

cidr_maskパラメタでは、このサブネットのサブネットマスクのプレフィックス長を指定します。

subnet_typeパラメタでは、そのサブネットがインターネットに接続されるか否かを指定します。

属性がPUBLICの場合、パブリック IP を使用して起動される限り、インターネットに接続でき、インターネットからも接続できます。

map_public_ip_on_launchパラメタがTrueの場合、起動時にパブリック IP をインスタンスに紐づけます。

  • Private
cidr_mask=24,
subnet_type=ec2.SubnetType.ISOLATED

ISOLATEDでは、トラフィックをインターネットにルーティングせず、同じ VPC 内の他のインスタンスからのみ接続することができます。

ここで注意ですが、Subnetを定義するソース部分では、サブネットごとのCIDR範囲を指定していません。 これは後述の通り、AWS CDKが自動的にサブネットのCIDR範囲を決定してくれるためです。

4. CloudFormationとCDKの差異

AWS CDKのプログラムソースで確認した通り、VPCとSubnetの設定しか行っておりません。 それはAWS CDKがInternetGatewayやルートテーブルを自動的に作成してくれるためです。 デプロイ後にリソースが自動的に作成されていることを確認できます。

4-1. サブネットのCIDR範囲

サブネットのCIDR範囲が自動的に決定していることがわかります。

4-2. InternetGateway

InternetGatewayも自動的に作成されていることがわかります。

4-3. Routetable

Routetableも自動的に作成されていることがわかります。

5. まとめ

これまで見てきたように、CloudFormationでインフラを記述するよりも少ないコードで、AWS CDKは表現できることがわかります。

5-1. 高レベル抽象化

これはAWS CDKでは、さまざまな抽象化レベルでリソースの記述が可能なためです。 この抽象化はレイヤと呼ばれ、3つの異なるレベルから成り立っています。 それぞれのレイヤには特徴があります。特徴について、公式ドキュメントを参考に以下に記載します。 ちなみに今回は以下に示す、L2レイヤを使用してリソースを定義しました。

【参考】コンストラクト

  • レイヤ1(L1)

    AWS CloudFormation仕様で定義されているリソースを直接表します.

CloudFormationと同じ仕様でリソースを定義可能なレイヤです。

  • レイヤ2(L2)

    「精選された」構成は、その基盤となるL1構成と比較して、より人間工学に基づいた開発者体験を提供するように慎重に開発されています。L2 コンストラクトは、適切なデフォルト、ベストプラクティスのセキュリティポリシー、およびより人間工学に基づいた開発者エクスペリエンスを提供します。

開発者が細やかな設定を意識せず、より少ないコードでリソースを定義できるレイヤです。

  • レイヤ3(L3):

    構成またはパターンは、AWS特定のユースケースに合わせてリソースのコレクション全体を定義します。ビルドパイプライン、Amazon ECS アプリケーション、その他多くの種類の一般的なデプロイシナリオのいずれかを構築するのに役立ちます。

単一のリソースではなく、よく使われるリソースの組み合わせを提供してくれるレイヤです。

5-2. デメリット

簡単によりシンプルにリソースを定義してくれる一方で、デメリットもあるため注意が必要です。 例えば、

  • L2レイヤで対応していないリソースがある

    • 現在も活発に開発が進められており、今後対応される可能性があります。
    • 【参考】AWS CDK Github
  • 思わぬリソースや意図しない設定で構築される可能性がある

    • 今回のケースでは、サブネットが配置されるAZは自動的に決定されましたが、配置AZが必須要件の場合はL1でリソースを作成する必要があります。

さいごに

本記事がAWS CDKを知る、触ってみる機会につながりましたら幸いです。

リファレンス

※1 AWS CDKとは

https://aws.amazon.com/jp/cdk/

※2 CDKリファレンス

https://docs.aws.amazon.com/cdk/api/v2/python/aws_cdk.aws_ec2/Vpc.html https://docs.aws.amazon.com/cdk/api/v2/python/aws_cdk.aws_ec2/SubnetType.html

※3 CDK デベロッパーガイド

https://docs.aws.amazon.com/ja_jp/cdk/v2/guide/constructs.html

※4 AWS CDKのGithub

https://github.com/aws/aws-cdk