【CDK入門】CDK に初めて触ろうとしている人に向けて、必要な概念をざっくり解説 & おすすめドキュメントまとめ

# 0. 記事を書いたきっかけ
アプリ開発者からAWSを勉強して、AWS CDKを書き始めて8ヶ月ほど経ちました。
それまでに得た知見をもとに社内でCDK勉強会を開催したところ、分かりやすかったという反応をいただけて嬉しかったので外部公開用に記事としてまとめました。
8か月ほど前のRuby on Railsエンジニアの自分に向けてわかりやすく解説しようとする記事になります。
似たような立場のCDKの初学者の方の参考になりましたら幸いです。


# 1. CDKとは
IaCを実現するツールです
IaCとは**Infrastructure as Code**の略で、要するに「インフラのリソースをコードで管理しようぜ」ってことです。

https://aws.amazon.com/jp/what-is/iac/

よく比較されるIaCツールを並べてみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480176/75784405-21a4-b0ad-669c-70e8366d18e4.png)

CDKは、Terraformや、CloudFormationのようにAWS リソースをコードで表現することができます。
Terraformが独自言語のHCL、CloudFormationがYAMLやJSONなどでインフラリソースを表現するのに対して、CDKでは使い慣れたプログラミング言語でリソースを表現することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480176/299ac214-a70d-3603-082b-f023d271b4d0.png)


大まかな挙動としては下の図のような流れでデプロイを実施しています
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480176/a8dee0fe-e03b-0a75-fdf9-0c2cd3715612.png)
1. 開発者は今回の場合だとTypeScriptを用いて、必要なインフラリソースを実装します
1. ターミナルでcdk deployコマンドを実行します
1. CDKがローカル内でテンプレートを生成して、CloudFormationに反映させます
1. CloudFormationがAPIを呼び出して実際のリソースをデプロイします


ですので、端的にいうと
### 「CDKとはプログラミング言語で、CloudFormationテンプレートを生成できるツール」
とも言えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480176/bbaf400b-c3cb-416f-5e84-3233bcddf4a4.png)



# 2. CDKの使用前に知っておいたほうが良い概念
これは最初にわかっておきたかったな〜って概念は以下の4つになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480176/e3e15c89-4373-d763-ed1f-79b380f54460.png)


### (1).使用するプログラミング言語について
一番メジャーなのはTypeScriptです。

公式のワークショップがとてつもなく素晴らしい理由の一つとして、「TypeScriptの基礎からスタートしている」という点が挙げられます。

https://catalog.workshops.aws/typescript-and-cdk-for-beginner/ja-JP/

公式のハンズオンとかワークショップとかってとっつきにくいな〜と思う方もいらっしゃると思うのですが、このワークショップは本当におすすめなので、ぜひ一度試していただきたいです


### (2). オブジェクト指向について
インフラ出身者にとっては壁になることが多いようです。私は元々アプリ側だったのでむしろ親しみやすかったです。

CDKはCloudFormationのようなThe仕様書って感じではなく、アプリ開発に近い感覚でインフラを組んでいくので、その経験が浅い方はオブジェクト指向の概念についてなんとなく理解していた方が扱いやすいと思います。


### (3). CloudFormationの概念

### テンプレートとは
CloudFormationテンプレートとは、AWS上に構築するインフラストラクチャを説明するJsonまたはYAML言語でフォーマットされたテキストファイルのことを言います。マネジメントコンソールで言うと、下の部分です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480176/523e9891-95e7-674a-0e11-5de0e1164256.png)


### スタックとは
CloudFormationスタックとは、上記のテンプレートによってプロビジョニングされるリソースの集合体を指します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480176/9dc95a8a-8a0f-3638-f975-a675a333909c.png)


このイメージを持っていただけると、さまざまなドキュメントなどが読みやすくなると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480176/f2aa4d79-4d2a-c470-243d-f4b098210cea.png)


### (4). CDKコンストラクトの概念
先ほどまではCloudFormationの話でしたが、ここからはCDKの話です
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480176/8e748886-938a-1678-963b-8d5e2c7c86c1.png)

コンストラクトとは、
CDKの基本的な構築単位です！ブロックのような感じ。
1つのコンストラクトに1つまたは複数のリソースを表現します。
アプリ開発で言うと「クラス」の概念が近いと思います

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480176/00d76e0a-9b87-5d8a-666a-a7bc8c7a09ca.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480176/cf060e54-b0a3-8922-53d8-f3d38fdbd6ef.png)



ここで注意してほしいのは、**TypeScriptのクラスのconstructorとは別物の概念**ですので注意してください！
TypeScriptのconstructorは、クラスのインスタンスが作成されるときに自動的に呼び出される特別なメソッドですが混在しないように気をつけてください。私はCDKきっかけでTypeScriptを書き始めた人だったのでここで結構混乱してました笑

https://recursionist.io/learn/languages/typescript/oop/class

CDKコンストラクトについてディレクトリ構造の例もみておくと、概要が掴みやすいかなと思います。（構造についてはあくまで一例です）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480176/0c02b321-9d24-eeea-8ef5-bdea1cc7cd30.png)

画像では、aurora-cluster.tsファイルにて、AuroraClusterというコンストラクトを定義して、Auroraやそれに使用するセキュリティグループなどを定義しています。
ecr.tsや、fargate.tsといったファイルにも同様にコンストラクトを定義していて、最終的にそれらのコンストラクトをcdk-templates-stack.tsというスタックのファイルでimportしてスタックを構築しています。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480176/5f02c1b5-050b-6d79-66cf-7f8acdb9aaa6.png)

<br>

ここから少しややこしくなるかもですが、
**CDKでは、コンストラクトの書き方について抽象度を変えながら実装**することができます。
これをレイヤーという表現をします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480176/dae41609-2e7d-f712-b470-afcf0e7604be.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480176/a223085e-0f5d-3b82-77ad-e5b7556e73b3.png)

私の観測範囲ではありますが、CDKで開発されるほとんどのリソースはL2で定義されています。
私の場合は、
L3でパターンごとごっそり定義して良さそうなら、L3の書き方を採用して、
それ以外はL2でリソースごとにいい感じに実装して、
L2でカバーできない分をL1で書く
という形の実装をしています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480176/f4ab84ee-b9c6-ef3c-7c19-f0b933ed5ace.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480176/e5acb4a9-3c7b-2faf-c856-fbd7d06df238.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480176/ee46ea25-8141-2aa3-ba75-e095938a67f2.png)

<br>

以上のように、
ほぼほぼコンストラクトの説明になりましたが、
- 使用するプログラミング言語
- オブジェクト指向
- CloudFormationの概念をざっくり
- CDKコンストラクトの概念をざっくり

これらの概念を理解しておくと、CDKのスタートラインとして十分なのかなと思います。

# 3. CDK開発で付き合うことの多いドキュメント類まとめ
### APIリファレンス

https://docs.aws.amazon.com/cdk/api/v2/docs/aws-construct-library.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480176/28d76285-baf3-76e6-cb70-c313d4183d01.png)

なかなかとっつき辛いですが、ほぼ全ての回答がこのドキュメントに書かれています。

こちらの記事がわかりやすかったので、参考にしながらちょっとずつ慣れていくと良いと思います。

https://zenn.dev/proyogram/articles/937b43d370fbc7


### BLEA

ざっくり言うと、公式が出してくれているCDKのサンプル集です。

https://github.com/aws-samples/baseline-environment-on-aws

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480176/b3880ee8-6dfc-8c87-7167-0d7ca18c5617.png)

さまざまなユースケースごとがサンプルとして載っており、ディレクトリ構造やスタック設計や、そもそもの記述方法などとても参考になります


### Kenji KonoさんのSpeakerDeck

日本人にとってのCDK神コンテンツです。
BLEAの開発チームの方で、よくCDK界隈で登壇をされています。

https://speakerdeck.com/konokenj


とにかくわかりやすいです。最新情報もすぐにキャッチしてくれてわかりやすくしてくれるので頻繁に読みに行ってます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480176/ead6f1eb-3641-3fb1-ebb9-4d22d2f98024.png)

### その他
重複する部分もありますが、こちらの記事は良質なリンク集なのでシェアさせていただきます

https://qiita.com/Figure_Skate_IT/items/83a395d26567f01b3ae2

# 4. 公式ワークショップをやってみましょう

ここまで読んでいただければある程度ワークショップがとっつきやすくなっているのではないかと思います。（元からかなりわかりやすい）

ワークショップに対するクラメソさんの記事も一度読んでみるとより、その良さが伝わるのかなと思います。

https://dev.classmethod.jp/articles/aws-cdk-typescript-beginner-workshop/


プログラミングの経験がなくても本当に１から教えてくれるワークショップなので是非チャレンジしてみください

https://catalog.workshops.aws/typescript-and-cdk-for-beginner/ja-JP/


# 5. まとめ
CDKはIaCツールの一つで、「プログラミング言語で、CloudFormationテンプレートを生成できるツール」と言える

使用するプログラミング言語
オブジェクト指向
CloudFormationの概念をざっくり
CDKコンストラクトの概念をざっくり
の概念を理解しておくと良い

ワークショップが良いのでぜひチャレンジしてください

<br>

以上となります。まだ経験として1年もない初学者の書いた記事なので誤りなどがありましたらコメントで教えていただきますと大変助かります！

追記：社内勉強会資料についてSpeakerDeckに追加しました

https://speakerdeck.com/hosomatu/chu-xue-zhe-xiang-ke-cdkmian-qiang-hui-wai-bu-gong-kai-yong