AWS CDKでネストされたスタックを作ってみる

2020.11.25

どーもsutoです。

今回はネストされたCloudFormationスタックをAWS CDKを使って作成してみようと思います。

前提条件

  • ローカルPCにDCK CLIがインストールされている(未実施の方は以下のリンクを参考)

  • 検証環境

  • OS:Mac

  • 使用言語:Python3.7.3
  • CDK CLI:1.74.0

  • 「nest」というプロジェクト名でCDK環境を作っておきます

mkdir nest && cd nest
cdk init nest_stack --language python
source .venv/bin/activate
(.venv) ~ nest %
  • 今回は検証として「VPCを作成するスタック」と「S3バケットを作成するスタック」の2つをネストされたスタックとして作成してみます。

実際にやってみた

手順1:必要なモジュールのインストール

  • setup.pyで必要なモジュールをインストールするように以下を部分を編集します。
    install_requires=[
        "aws-cdk.core==1.74.0",
        "aws-cdk.aws-ec2",
        "aws_cdk.aws_s3",
        "aws_cdk.aws_cloudformation",
    ],
  • setup.pyを保存したらモジュールのインストールを行います。
pip install -r requirements.txt

手順2:コードを記述

  • ここから「nest」フォルダ内のnest_stack.py に以下のように追記して保存します。
from aws_cdk import (
    core,
    aws_ec2 as ec2,
    aws_s3 as s3,
    aws_cloudformation as cfn,
    )

class NestStack(core.Stack):

    def __init__(self, scope: core.Construct, construct_id: str, **kwargs) -> None:
        super().__init__(scope, construct_id, **kwargs)
    
        # The code that defines your stack goes here
        VPCStack01(self, "VPCStack01")
        S3Stack02(self, "S3Stack02")

class VPCStack01(cfn.NestedStack):

    def __init__(self, scope: core.Construct, id: str, **kwargs) -> None:
        super().__init__(scope, id, **kwargs)
    
        # 変数の宣言
        vpc_cidr = '10.1.0.0/16'
        subnet_mask = 24
        # 新規VPC作成
        vpc = ec2.Vpc(
            self,
            id="Sage-vpc",
            cidr=vpc_cidr,
            nat_gateways=0,
            subnet_configuration=[
                ec2.SubnetConfiguration(
                    cidr_mask=subnet_mask, name='public', subnet_type=ec2.SubnetType.PUBLIC,
                ),
                ec2.SubnetConfiguration(
                    cidr_mask=subnet_mask, name='private', subnet_type=ec2.SubnetType.ISOLATED,
                ),
            ],
        )

class S3Stack02(cfn.NestedStack):

    def __init__(self, scope: core.Construct, id: str, **kwargs) -> None:
        super().__init__(scope, id, **kwargs)
    
        s3.Bucket(self, "TestChildBucket", bucket_name="cdktest-child-bucket")
  • NestStackがCloudFormationの親スタックとなり、その関数内で順番に実行されるVPCStack01およびS3Stack02がネストされたスタックとなります。
    • ポイントとしてネストされたスタックはcore.Stackではなく、CloudFormationのcfn.NestedStackを使います。

手順3:デプロイと確認

  • ではデプロイを実行して実際にスタックが作成されるか見てみましょう。
(.venv) ~ nest % cdk deploy nest

無事スタックCOMPLETEしました。リソース作成結果も問題なさそうです。

まとめ

ネストされたスタックを作成する場合でも、従来のCloudFormationのコードよりも記述が少なく容易に実現できることが実感できました。

今後もCDKをPythonで使いこなしていけるように、また良いTipsがあれば記事にできるように精進したいと思います。

参考

https://docs.aws.amazon.com/cdk/api/latest/docs/@aws-cdk_aws-cloudformation.NestedStack.html