[AWS][CDK] アプリケーションとインフラを一挙にコーディングできちゃうフレームワークがあるらしい

※この記事は販促的要素を含みます

AWSには[AWS CDK(Cloud Development Kit)](https://aws.amazon.com/jp/cdk/)と呼ばれるフレームワークが存在します。

これを使うことで、インフラまで含めた一気通貫の開発が非常にやりやすくなりました。これまでもIaCツールは存在していましたが、このCDKはよりプログラマティックにインフラを扱うことに長けています（プログラミング言語でインフラを記述するわけですから当然ちゃ当然ですが...）。

イケてる技術者になりたいならキャッチアップ必須(偏見)だと、個人的には感じています。特に、最近よく耳する「サーバーレス」はCDKとの相性が良いように思います。今AWSを使ってサーバーレス開発を勉強するなら、Serverless FrameworkではなくCDKを使ったほうが良いのではないかとすら思います。

この記事では CDK のステキなところをザクッと紹介しつつ、自サークルの同人誌の販促をしていきます。

## CDK のよさ

### 利点1: 言語とエディタによる型のサポートが超強力

※TypeScript と VSCode の利用を前提にしています

CloudFormation では「このリソース生成に必要なパラメータって、なんだっけ？」的なことがありがちです。書いたことがある方なら、この苦痛よくわかるのではないでしょうか。この手の不備が実際にデプロイしてみてから発覚したときの徒労感ときたら...。明らかに非効率ですよねこれ。

CDKの各種ライブラリは型定義が非常にしっかりしているので、リソース生成時に渡すパラメータの不備があればエディタが_「そのパラメータオブジェクトにはxxxプロパティが必須だよ」_ などとサジェストしてくれます。**CFn deployをしなくても、パラメータレベルの初歩的な間違いはエディタが勝手に教えてくれるのです** 。これが非常に良い。

CDK のベースは CloudFormation なので、パラメータの数が多かったり分かりづらかったりするのはある程度しょうがないですが、そこに対して調査の工数がかさむのはイヤですよね。この問題を、言語とエディタの機能がかなりサポートしてくれます。正直**他の環境は考えられない、というくらい便利**です。

これは初学者にとっても非常に優しい特徴で、私が CDK を積極的に学ぶ気になったのも、今まで挫折せずに学び続けていられるのも、ここらへんがしっかりしていることが非常に大きいです。

### 利点2: 抽象化されたリソース

要するに「それっぽいデフォルト値を持ったリソース」を生成してくれる、より高レベルで抽象化されたリソースクラスがあるということです。ちょっと試してみるだけなら、本当にすぐ使えちゃいます。リソースオブジェクトを適当にnewするだけですから。

このへんは「Serverless Framework ならシンプルな記述でサーバーレスインフラを定義できるから使いやすいよねー」っていうアレとほぼ同じニュアンスです。

また、各リソースオブジェクトが持つメソッドも、より概念が抽象化されています。
CDKでの例を示すと、「特定のS3バケットに対するDelete権限をLambdaに付与したい」場合のコードは以下のようなノリになります。


```typescript
// lib/core/core-stack.ts
// stackクラス内のリソース生成ロジックで記述

// this.inputBucket = new s3.Bucket(this, 'InputBucket', {...});

// Function の生成
const func = new lambda.Function(this, 'DeletionFunc', {
    functionName: functionName,
    code: lambda.Code.fromAsset('functions/delete-object', {
        exclude: ['*.ts'],
    }),
    handler: 'index.handler',
    runtime: lambda.Runtime.NODEJS_12_X,
});

// this.inputBucket(S3バケット) に対してこの関数からDelete操作できるように権限を付与
this.inputBucket.grantDelete(func);
```

`grantDelete` の部分で inputBucket が Function に対して自身へのDelete権限を付与しています。メソッドの見た目をしているので、何をやっているのかが直感的に理解しやすく、普通に CloudFormation の yaml を書くよりも読みやすく感じる方が多いのではないでしょうか。

このように、 CDK ではメソッドを利用することで生の yaml より格段にスッキリ記述できる例がいくつか存在します。このへんは使ってみないとわからない部分でもありますし、是非使ってみてください。

私のおすすめは Step Functions のステートマシン定義 (ASL) です。CDK で書くほうが格段にわかりやすいので、要チェックです。

### 利点3: ローカルでデバッグ & テストできる

利点1とも少々被りますが、非常に大きなメリットです。

プログラミング言語で書かれているので、当然デバッガの上で実行できます。何かしらエラーが起きた場合の調査や引き継いだコードの理解などなど、デバッガによるステップ実行が有用な場面はいくらでもあります。インフラ構築にもこれが使えるなんて、素敵だと思いませんか？

また、テストフレームワークの Jest を拡張する形で AWS リソースのアサーションが利用可能です。
構築内容のパラメータテストであれば、ユニットテスト感覚で簡単に書けてしまうのです。
CI/CD とも相性が良く、プルリクエスト駆動で開発を進めるフローにもマッチしやすいかと思います。

## サンプルコードの紹介

こちら。TypeScriptで書かれています。このコードで何を作っているのかは、READMEや構成図を見てください。

https://github.com/hassaku63/silverworks-osenchi

構成図

![構成図](https://github.com/hassaku63/silverworks-osenchi/blob/master/osenchi-diagram.png?raw=true)

主要なディレクトリの構成は次のようになっています。

```plain
.
├── bin  # CDK CLIが勝手に生成するディレクトリその1。スタック生成処理のエントリポイントにあたるコードがここにある
├── functions  # 自前で作った。Lambda functionのハンドラをここで実装している
│   ├── delete-object
│   └── detect-sentiment
├── lib  # CDK CLIが勝手に作るディレクトリその2。スタック中身（つまりリソース生成）のロジックをここで書いている
│   ├── common  # 自前で作った。いわゆるユーティリティ的なものの置き場
│   └── core    # 自前で作った。こっちがリソース生成の本体
└── test  # テスト
```

CDK的には lib と bin が重要です。とりあえずは **bin がスタック生成で、 lib がスタックの中身の生成** 、とだけ覚えておけばOKです。


## 宣伝

この度、[技術書典 応援祭](https://techbookfest.org/market)にてこういう本を出展しました。

![b5表紙_01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78417/a055fb9a-5326-327c-a492-e525e0b17896.jpeg)

TypeScript や CDKの始め方から、Step Functions や S3 などを使った簡単なシステム構築の方法を紹介しています。

次のような内容が学べるコンテンツを目指して制作しました。上記の「利点」で語ったようなこともバッチリ本に書いてあります。

- AWS CDK の基本を紹介
- AWS Step Functions を使ったサーバーレスワークフローの構築
- Amazon Comprehend を使った感情分析処理の実行
- AWS CDK プロジェクトの開発

ある程度AWSサービスに馴染みがあり、プログラミング言語に多少の心得がある人ならばおそらく難なく読みこなせる内容だと思います。

イントロ部分はある程度尺を確保して解説しているので、これに当てはまらない方にも読めるように一定の配慮はしたつもりです。もし質問などがあれば [@Silverworks](https://twitter.com/SilverworksClub) かサークルメンバーの[@hassaku](https://twitter.com/hassaku_63)まで。

BOOTHでも販売を開始しております。サークル初出展かつ（本の執筆的に）処女作なので至らない編集などあるかもしれませんが、ご興味あれば是非手にとっていただけると嬉しいです。

- 技術書典 応援祭 https://techbookfest.org/product/5655856821567488
- BOOTH https://silverworks.booth.pm/items/1881928