AWS CDKでネストされたスタックを作ってみる
どーも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