インフラ設計者がAWS CDKに入門してみる①～準備編～

# AWS CDK とは

AWS CDKとは、AWSが提供するAWSリソースをコードで定義するための[キット](https://aws.amazon.com/jp/cdk/)です。


# やりたいこと

AWS CDK初心者が、検証環境を簡単にデプロイするためにCDKでテンプレート化しておきたい。
特にNetwork周りの部分で簡素化できればいいなと思ってCDKにチャレンジしてみました。

出来るものは以下のリソースです。東京リージョンです。
* VPC
* 9サブネット（パブリック3つ、プライベート6つ）az-a,c,dでマルチAZ構成
* InternetGateway
* RouteTable（パブリック、プライベート1つずつ）


# 前提

* AWS自体はリソースをある程度理解している
* アプリ開発（コード開発）経験はほぼない
* 業務ではAWS開発は基本CLIかマネジメントコンソール操作

構築環境は以下の通り。
* Windows 11 Home
* VSCode
* WSL2上のUbuntu22.04
* nodejs v18.12.1
* AWS CLI v2.7.4
* AWS CDK v2.56.1
* TypeScript


# やってみる

基本的にはAWSが提供する[Workshop](https://catalog.us-east-1.prod.workshops.aws/workshops/99731164-1d19-4d2e-9319-727a130e2d57/ja-JP)に沿って準備を進めます。
AWS CLIとNode.jsがインストールされている状態から始めます。Node.jsのインストールは公式に沿ってください。ここでは省略します。

## CDKインストール

```bash
npm install -g cdk@2.56.1
cdk --version
```
2.54.0 (build 9f41881)と表示されればOKです。


## ディレクトリ作成とcdk init
ディレクトリの名前は任意に変更してください。

```bash
$ mkdir aws-1vpc-3private-subnet && cd aws-1vpc-3private-subnet
$ cdk init --language typescript
```

Gitの初期化などの警告は出ますが無視してください。
以下の出力が出れば初期化完了です。

```bash
Applying project template app for typescript
Initializing a new git repository...
Executing npm install...
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN tst@0.1.0 No repository field.
npm WARN tst@0.1.0 No license field.

# Useful commands

 * `npm run build`   compile typescript to js
 * `npm run watch`   watch for changes and compile
 * `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
```

依存パッケージをインストールしておきます。

```bash
$ npm i
```

別ターミナルでnpmの変更監視をしておきます。（新規のターミナルで上記のディレクトリに移動してコマンドを実行）

```bash
npm run watch
```

変更の都度以下の出力があればコードに異常はありません。

```bash
Starting compilation in watch mode...
Found 0 errors. Watching for file changes.
```

`cdk init`を実行すると、ディレクトリ内に必要なリソースがダウンロードされます。
デフォルトでテンプレートはappという空のアプリが作成されます。SQSキューとSNSトピックを含むsample-appというテンプレートを指定する場合は、`cdk init sample-app`で指定します。

ディレクトリ内に以下のようなリソースが作成されているかと思います。
簡単に説明すると、
| ファイル名 | 説明 |
|:--|:--|
| lib/cdk-workshop-stack.ts | CDKアプリケーションのメインスタックが定義されます。基本的にこのファイルを編集していきます。 |
| bin/cdk-workshop.ts | CDKアプリケーションのエントリポイントです。lib/cdk-workshop-stack.ts で定義されたスタックをロードします。 |
| package.json | npmモジュールのマニフェストです。アプリの名前、バージョン、依存関係、"watch" や "build" 用のビルドスクリプトなどの情報が含まれます。 |
| cdk.json | アプリの実行方法をツールキットに指示させるためのファイルです。 |
| tsconfig.json | プロジェクトのTypeScript設定です。 |
| node_modules | npmによって管理され、プロジェクトのすべての依存関係が含まれます。`npm install @aws-cdk/aws-ec2`等でインストールされたものもこちらに入ります。  |


## cdk synth

ひとまずcdkがどんなものかを把握するために、CloudFormationテンプレートを出力してみます。

```bash
cdk synth
```

CloudFormationテンプレートが出力されると思います。基本的にはIAMなどの基本リソースが定義されています。（sample-appを利用する場合は、SQSキューやSNSトピックが含まれています。）


## cdk bootstrap、cdk deploy

実際にリソースを作成してみます。
`cdk bootstrap`を実行すると、実際にAWS環境にbootstrapスタックという、デプロイプロセスで使われるCloudformationテンプレートとアセットを保存するために使用されるS3バケットが作成されます。
ここで、S3バケット名を指定したい場合は以下のようなコマンドを実行します。
```bash
cdk bootstrap \
 --bootstrap-bucket-name backet_name \
 --toolkit-stack-name toolkit_name
```

最後に`cdk deploy`を実行すると、実際にCloudFormationのスタックが作成され、AWSリソースが作成されます。
コンソールにリソースの作成状況が表示されるので、どんなリソースが作成されるか観察するのも面白いです。


ここまでで、CDKを利用する準備は整いました！
次回以降で実際にNetworkリソース等を準備していきたいと思います。