2019😺の18日目の記事です。今までCloudFormationテンプレートを直接YAMLで書いていましたが、作成するリソース数が多くなるにつれて記述量の多さに辛さを感じるようになってきました。CDKで作成してみることにしました。CDKのAPIにはCloudFormationの各リソースタイプ(VPC等)と1対1で対応している低レベルなものと、より高レベルなもの(例えば、VPCやサブネットを作成する際にインターネットゲートウェイやルートテーブル、ルートといった関連リソースを自動的に作成・関連付けしてくれる)があるようですが、利用するAZやサブネットの個数を柔軟にコントロールしたかったので、今回は低レベルAPIの方を試してみたいと思います。CDKを実行する環境を準備します。CDKの言語には、Pythonを選択します。aws-cdk今回確認に利用した環境は、以下の通りです。1.18.0AWSのクレデンシャルとアクセス権限を設定AWSのクレデンシャルを環境変数に設定しておきます。AWS_DEFAULT_REGION=ap-northeast-1IAMのアクセス権限には、以下のAWS管理ポリシーをアタッチしておきます。AmazonS3FullAccess123AWSCloudFormationFullAccessAmazonEC2FullAccessAmazonS3FullAccess作成するリソースの構成パブリックサブネット(/20)とプライベートサブネット(/20)をAZごとに1つずつ持つVPC(10.0.0.0/16)を作成します。Gatewayを配置します。CDKのモジュールをインストールします。今回はVPCとサブネットを作成しますので、コアモジュールとEC2モジュールをインストールします。Referenceを参照してください。雛形を作成した時点では、以下のような構成となっています。setup.pymy_network_stack.pyを開くと、以下のようなコードが記述されています。hereコメントにあるように、この中に作成するリソースのコードを記述していきます。作成するリソースの数が多いので、my_resourcesディレクトリを作成してそこに追加したモジュールを呼び出すようにします。モジュール追加後の構成は以下の通りです。setup.py追加したモジュールの内容は以下の通りです。internet_gatewaynetwork_stack.pyを以下のように編集して、追加したモジュールを呼び出します。準備ができましたので、アプリのルートディレクトリ(my-network)でcdkを実行してみます。diffを実行して作成・変更されるリソースの差分を確認してみます。deployを実行して実際にリソースを作成します。deployの実行完了後、AWSマネジメントコンソールでCloudFormationスタックを見ると、my-networkスタックでリソースが作成されていることが確認できました。CDKの低レベルAPIを試してみましたが、プログラミング言語のループ構造を利用して同じリソースを複数作成できることだけでも、YAMLで直接記述するのと比べてコード量を大幅に減らすことができ、非常に魅力的なものだと感じました。CloudFormationでリソースを作成したことがあればAPIは直感的に利用できるものとなっており、導入までの敷居は比較的低いのではないかと思います。今後は本番環境での利用も想定して使っていきたいと思います。Codeのフォーマッタを自分好みに設定してみる。Textを触ってみた。