AWS CDKを導入して脱YAMLテンプレートを試みる

これは 😺TECHSCORE Advent Calendar 2019😺の18日目の記事です。

今までCloudFormationテンプレートを直接YAMLで書いていましたが、作成するリソース数が多くなるにつれて記述量の多さに辛さを感じるようになってきました。
そんな折AWS CDKのことを知り、試しに簡単な構成をAWS CDKで作成してみることにしました。

利用するAWS CDKのAPIについて

Developer GuideAPI Referenceを見ると、AWS CDKのAPIにはCloudFormationの各リソースタイプ(VPC等)と1対1で対応している低レベルなものと、より高レベルなもの(例えば、VPCやサブネットを作成する際にインターネットゲートウェイやルートテーブル、ルートといった関連リソースを自動的に作成・関連付けしてくれる)があるようですが、利用するAZやサブネットの個数を柔軟にコントロールしたかったので、今回は低レベルAPIの方を試してみたいと思います。

必要なソフトウェアをインストール

Getting Started With the AWS CDKに従って、AWS CDKを実行する環境を準備します。
AWS CDKの言語には、Pythonを選択します。

今回確認に利用した環境は、以下の通りです。

OS: Amazon Linux release 2 (Karoo)
node: v10.17.0
npm: 6.11.3
Python: 3.7.4
pip: 19.0.3
cdk: 1.18.0

AWSのクレデンシャルとアクセス権限を設定

AWSのクレデンシャルを環境変数に設定しておきます。

IAMのアクセス権限には、以下のAWS管理ポリシーをアタッチしておきます。

作成するリソースの構成

パブリックサブネット(/20)とプライベートサブネット(/20)をAZごとに1つずつ持つVPC(10.0.0.0/16)を作成します。
パブリックサブネットにはNAT Gatewayを配置します。

AWS CDKアプリの雛形を作成

Getting Started With the AWS CDKにあるようにアプリの雛形を作成し、AWS CDKのモジュールをインストールします。
今回はVPCとサブネットを作成しますので、コアモジュールとEC2モジュールをインストールします。
その他のモジュールについてはAWS CDK Python Referenceを参照してください。

作成するAWSリソースのコードを追加

雛形を作成した時点では、以下のような構成となっています。

my_network_stack.py
を開くと、以下のようなコードが記述されています。

コメントにあるように、この中に作成するリソースのコードを記述していきます。
作成するリソースの数が多いので、my_resourcesディレクトリを作成してそこに追加したモジュールを呼び出すようにします。

モジュール追加後の構成は以下の通りです。

追加したモジュールの内容は以下の通りです。

availability_zone.py(アベイラビリティーゾーンの定義)※東京リージョンに限定

nat_gateway.py(NAT Gateway)

route.py(ルートテーブル、ルート)

subnet.py(サブネット)

vpc.py(VPC、インターネットゲートウェイ)

network_stack.py
を以下のように編集して、追加したモジュールを呼び出します。

AWS CDKの実行

準備ができましたので、アプリのルートディレクトリ(my-network)でcdkを実行してみます。
まずは、
cdk diff
を実行して作成・変更されるリソースの差分を確認してみます。

定義したリソースが追加の対象となっていることが確認できましたので、
cdk deploy
を実行して実際にリソースを作成します。

cdk deploy
の実行完了後、AWSマネジメントコンソールでCloudFormationスタックを見ると、my-networkスタックでリソースが作成されていることが確認できました。

最後に

今回はAWS CDKの低レベルAPIを試してみましたが、プログラミング言語のループ構造を利用して同じリソースを複数作成できることだけでも、YAMLで直接記述するのと比べてコード量を大幅に減らすことができ、非常に魅力的なものだと感じました。
CloudFormationでリソースを作成したことがあればAPIは直感的に利用できるものとなっており、導入までの敷居は比較的低いのではないかと思います。
今後は本番環境での利用も想定して使っていきたいと思います。

Comments are closed, but you can leave a trackback: Trackback URL.