自分がほぼインフラ一本でやってきて、開発経験が乏しかったことから
開発初心者がCDKを使ってAWSリソースを構築するために行ったことや手順を纏めてみました。
※バージョンによってはこの通り動かないこともあると思いますのでご了承ください
私は2019年12月時点の最新版のバージョンを利用しています
コーディング環境
環境用意は下記の記事を参照
WindowsにCDK環境構築する手順(Python)
https://qiita.com/toma_shohei/items/985916e1a95ec4c38121
まず概要をつかむ
■概要理解資料
https://pages.awscloud.com/rs/112-TZM-766/images/B-3.pdf
◾️WorkShopやってみる
・Workshop(英語)
https://cdkworkshop.com/30-python.html
・Workshop(日本語:ダウンロード版)
http://bit.ly/cdkworkshopjp
CDK(Python)コーディング準備
・VisualStudio Codeを開きディレクトリを開くから作業ディレクトリを指定
・cdk初期化ファイルの配置
ターミナルから下記のコマンドを実行
cdk init app --language=python
※このコマンドで必要なディレクトリなどが作成されるが、合わせてソースなどが初期化される
・requirements.txt編集(扱うリソースをinstall)
=======
aws-cdk.core
aws-cdk.aws-autoscaling
aws-cdk.aws-ec2
aws-cdk.aws-elasticloadbalancingv2
aws-cdk.aws-rds
aws-cdk.aws-ssm
aws-cdk.aws-route53
aws-cdk.aws-autoscaling-common
====================
pip install -r requirements.txt
ここまでできたらコーディング開始。
フォルダ構成
cdk init した段階で以下のようなフォルダ構成が勝手に出来上がります。
https://cdkworkshop.com/30-python/20-create-project/300-structure.html
自分はpyyaml導入してパラメータをコードから分離しています。
フォルダ構成は下記の様なイメージになります。
・フォルダ構成イメージ
CDK-WORKSHOP
□┣config
□┃┣prd
□┃┃┣ec2.yaml
□┃┃┣vpc.yaml
□┃┃┣・・・
□┃┗stg
□┃□┣ec2.yaml
□┃□┣vpc.yaml
□┃□┣・・・
□┣cdk-workshop_stack.py
□┣・・・
※CDKのTOP直下にconfigというフォルダを切っている。
その配下に環境別(prd、stgなど)のフォルダを切り、
その配下にリソース別(ec2やvpcなど)にパラメータを記述している。(cdk.jsonで読み込むディレクトリを切り替える)
cdk-workshop_stack.pyに全リソース構築するコードを記載(config配下のパラメータを読み取る)。
複数リージョンへの構築は同一フォルダではできなかったのでフォルダを分けること。下記のようなやり方はpyyamlを利用しているとできない(バグと思われるが必ず出力がJSONになってしまう)
https://dev.classmethod.jp/cloud/aws-cdk-multi-account-region/
暫定対応(今後修正予定、現状では解決手段不明)
!Refをパラメータに書くときは「\!Ref」とし、
出力されたyamlを一括変換「\!Ref」⇒「!Ref」する。
※!GetAttも同様
※pyyamlでyaml.safe_loadを利用しているが「!」をエスケープする方法がわからない
yamlに書かずに.py上に"!Ref " + yamlから読み込んだ文字 とすると 文字列全体に" "がかかり、!Refまで文字列扱いされてしまう
CloudFormation実行
・CloudFormationテンプレート出力
cdk synth --version-reporting false --path-metadata false > C:\Users\test\Desktop\test.txt
・上記暫定対応実施
・CloudFormationデプロイコマンド(チェンジセット作成まで)
aws cloudformation deploy --stack-name testStack --template-file C:\Users\test\Desktop\test.txt --no-fail-on-empty-changeset --no-execute-changeset
・変更セット確認⇒実行
マネジメントコンソールからCloudFormationを開くと
作成したスタックの変更セットを確認し、問題なければ実行を押す
よく見るドキュメント
・AWS CDK Python Reference
https://docs.aws.amazon.com/cdk/api/latest/python/index.html
・Python examples
https://github.com/aws-samples/aws-cdk-examples
課題
・High-level constructsの利用
手動で構築済の既存のリソース上に新たに構築するリソースをコードで構築していく運用(?)のため
Low-level constructs(CfnXXXという名前のライブラリ)しか利用できていない
※本来ならコード量を少なくするため、High-level constructsを使いたいが、
High-level constructsで作ったリソース上にしか作れないようになっている?(⇒これは調査中)
・テストコードがかけていない
そもそも何を確認すれば良いのかが未検討
所感
・IaCでの構築について
品質は間違いなく上がります。(ある程度の規模の構築案件なら必ずミスする自分がミスしなかった)
検証環境作ったら本番環境はほぼコピペで作成できるので再現性はかなり高いです。
・CDKの特徴
TerraformでもAWS構築経験はありますが、CDKの方がはまりポイントが少ない印象です。
後発のツールであるため、バージョンアップの間隔が短く(毎日のようにコミットされている)、
最新版が後方互換しない場合があるので、リスクはありますが現状はそれで悩まされたことは少ししかないです。