「AWS CDK」のセットアップ&操作方法(Mac)

## 「AWS CDK」とは？

「AWS Cloud Development Kit」の略であり、OSSのインフラ構成ツールです。
PythonやTypeScriptなどの言語でCloudFormationのコードを記述するイメージです。

TerraformやServerless Frameworkと異なり、AWSの公式ツールのため、マルチクラウドでないならCDKを選択するのはありだと思います。

v1.0.0がリリースされたのが2019/07/12であり、新しいツールです。
https://github.com/aws/aws-cdk/releases

## 環境

- OS：macOS Catalina 10.15
- CDK：1.19.0 (build 5597bbe)
- Node.js：v12.14.0
- npm：6.13.4

## 前提条件

- Node.jsとnpmをインストールしている

## セットアップ

### CDKのインストール

npmでグローバルにインストールします。

```shell-session
$ npm install -g aws-cdk
```

ローカルにインストールして `npx cdk` で実行する方法も考えられますが、フォルダが空でないと `cdk init` できないのでオススメしません。

```shell-session
$ npx cdk init app --language=typescript
`cdk init` cannot be run in a non-empty directory!
```

### CDKのバージョン確認

CDKのバージョンを確認します。

```shell-session
$ cdk --version
1.19.0 (build 5597bbe)
```

もし `bash: cdk: command not found` と出力される場合、CDKをグローバルにインストールしていない可能性があります。
`npm install` 時に `-g` オプションを付けたか確認してください。

## 操作方法

### CDKテンプレートの適用

`cdk init` を実行すると、使えるテンプレートの一覧が出力されます。

```
$ cdk init
Available templates:
* app: Template for a CDK Application
   └─ cdk init app --language=[csharp|fsharp|java|javascript|python|typescript]
* lib: Template for a CDK Construct Library
   └─ cdk init lib --language=typescript
* sample-app: Example CDK Application with some constructs
   └─ cdk init sample-app --language=[csharp|fsharp|java|javascript|python|typescript]
```

私はTypeScriptで通常のCDKアプリを作成したいため、以下のコマンドを実行しました。

```shell-session
$ cdk init app --language=typescript
Applying project template app for typescript
Executing npm install...
npm WARN deprecated core-js@2.6.11: core-js@<3 is no longer maintained and not recommended for usage due to the number of issues. Please, upgrade your dependencies to the actual version of core-js@3.
npm WARN deprecated left-pad@1.3.0: use String.prototype.padStart()
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN cdk_sample@0.1.0 No repository field.
npm WARN cdk_sample@0.1.0 No license field.

# Welcome to your CDK TypeScript project!

This is a blank project for TypeScript development with CDK.

The `cdk.json` file tells the CDK Toolkit how to execute your app.

## Useful commands

 * `npm run build`   compile typescript to js
 * `npm run watch`   watch for changes and compile
 * `npm run test`    perform the jest unit tests
 * `cdk deploy`      deploy this stack to your default AWS account/region
 * `cdk diff`        compare deployed stack with current state
 * `cdk synth`       emits the synthesized CloudFormation template
```

`ls` で一通りファイルが生成されたことを確認します。

```shell-session
$ ls -a
.  ..  .git  .gitignore  .npmignore  README.md  bin  cdk.context.json  cdk.json  jest.config.js  lib  node_modules  package-lock.json  package.json  test  tsconfig.json
```

自動生成された `README.md` に記載されている通り、 `cdk deploy` を実行するだけでデプロイされます。

### モジュールのインストール

デフォルトでは `@aws-cdk/core` のみインストールされるため、必要に応じてモジュールをインストールします。

```shell-session
$ npm install @aws-cdk/aws-iam
$ npm install @aws-cdk/aws-lambda
$ npm install @aws-cdk/aws-ecs
$ npm install @aws-cdk/aws-rds
$ npm install @aws-cdk/aws-logs
$ npm install @aws-cdk/aws-events
$ npm install @aws-cdk/aws-events-targets
```

## おわりに

これでCDKを使えるようになりました。
使い慣れている言語でAWSのインフラコードをガンガン書いていきましょう！

## 参考リンク

- [aws/aws-cdk: The AWS Cloud Development Kit is a framework for defining cloud infrastructure in code](https://github.com/aws/aws-cdk)
- [AWS クラウド開発キット – アマゾン ウェブ サービス](https://aws.amazon.com/jp/cdk/)