AWS CDK さわってみた、たのしかったのだけど

AWS CDK Workshop をやってみたので、 普段使っている従来の CloudFormation や、ちょっと触っていた SAM と比べてどうか、という視点で感想を書きます。

AWS CDK とは

プログラミング言語を使って抽象化された CloudFormation を書けるフレームワークです。生の CloudFormation に比べて抽象化されており、ループや条件分岐などのプログラミング言語のテクニックを使えるため冗長な記述を減らすことができたり、まとまった単位でモジュールとして切り離して再利用できるなどのメリットがあります。

2020/01 現在使える言語は

があります。

専用の CLI を使い、 cdk synth による 生 CloudFormation テンプレート書き出しや、cdk deploy による一発デプロイなどができます。CDK 独自の概念というかリソース体系があるので、以下の記事の前半を読んでおくとわかりやすいかと思います。 https://dev.classmethod.jp/cloud/aws/aws-cdk-construct-explanation/

CDK で扱うリソースの単位は、Construct と呼ばれています。このリソースを new したりパラメータ渡して呼び出したりして AWS を宣言的に操作します。 https://docs.aws.amazon.com/cdk/api/latest/docs/aws-construct-library.html

ワークショップ所感

TypeScript でやってみました。 やっていて楽しかったので基本的にはポジティブな印象です。とはいっても万能では無いのでつらつらっと思ったこと書きます。

まぁまぁの数のファイルがある

CDK ワークショップをやった時点では次のようなディレクトリ構成になります。 git 管理されているものだけ載せています。

├── bin
│   └── cdk-workshop.ts
├── cdk.context.json
├── cdk.json
├── jest.config.js
├── lambda
│   ├── hello.js
│   └── hitcounter.js
├── lib
│   ├── hitcounter.ts
│   └── cdk-workshop-stack.ts
├── package.json
├── package-lock.json
├── README.md
├── test
│   └── cdk-workshop.test.ts
└── tsconfig.json

フレームワーク、といわれるものとしては普通というか少ないほうですが、当然生 CloudFormation や SAM と比べると多いです。小さい環境なら awscli と YAML ファイルのみで CloudFormation を管理する場合もあるかもしれませんし、こういう構成を複雑と捉える人もいるかもしれません。 ただし、この中でワークショップ中で実際に直接コード編集を行ったのは、 lambda 以下と lib 以下で、そして npm を介しての package*.json 変更があったくらいでした。 書く量は非常に少ないです。

言語固有の問題は起きる

これは単に自分が抜けているという例なのですが…

  • パラメータの型が合わない、と怒られて npm 側の aws-cdk-* バージョンを見るとずれていた
  • 別マシンで作業を引き継いで、 git 上コード差分が無いのに cdk diff が出てしまった、よく見たら自動ビルドが走っておらず .ts のビルドがされてなかった

など、プログラミング言語のプラクティスが使えるということはプログラミング言語のよくある問題も起き得る、ということを当たり前ながら実感しました。

SAM を完全に内包するものではない

CDK は AWS リソース全般をカバーするようなフレームワークなので、たとえば sam local ~ 便利コマンドや sam log のような機能は CDK CLI にはありません。 lambda の動作テストや log tail のようなことは CDK の外側になるので、この辺もうまくカバーされるか他のツールと連携しやすいといいなと思いました。

結局 CloudFormation デプロイ

CloudFormation からデプロイするので、反映までの速度はそれなりです。 lambda のコードちょっと変えるだけでも ts ビルド、CloudFormation changeset 作成して apply なのでサクサクと反映できるわけではありません。そもそも直接実行環境にデプロイして力技でデバッグしていくのではなく、ちゃんとロジック部分を分離しテスタブルに作っとけよと暗に言われた気がしました。

全体的に

楽しいフレームワークです。ただし既存の CloudFormation で作成されたサービス中の環境を置き換えるには難易度が高そうです。これから作成するものには使って損はなさそうです。ワークショップの内容以外にも、現在実用している CloudFormation テンプレートと同じことをさせてみてどうなるかをもう少し検証してみます。