CDK を使って AWS を構築しながらアプリケーション開発


## [AWS CDK](https://d1.awsstatic.com/webinars/jp/pdf/services/20200303_BlackBelt_CDK.pdf) とは

AWS CDK は Python や TypeScript など一般のプログラミング言語で記述でき、ほとんどの AWSサービス をカバーしている CloudFormation の拡張機能です。CloudFormation よりも一般に少ないコード量で記述ができます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59081/6b314a7a-078d-ec7e-a11a-432a5367294c.png" width=600px>

## 事前準備

#### 前提

- cdk version 2.39.0
- npm version 8.18.0

#### AWS CDK CLI のインストール

```bash
npm install -g aws-cdk
cdk --version
```

#### AWSアカウントのブートストラップ

CDK はデプロイ中、 S3 にファイルアップロードをするためブートストラップという作業します。この作業は 初回のみ です。

```bash
# Get the account ID
aws sts get-caller-identity

# Bootstrap the account
cdk bootstrap aws://ACCOUNT-NUMBER/REGION
```

:::note
異なるアカウントとリージョンを使用したい場合は、必ずそれぞれをブートストラップしてください。
:::

https://aws.amazon.com/jp/getting-started/guides/setup-cdk/module-two/

## CDK で 実装 ( AWS リソースの定義)

TypeScript で進めます。次のコマンドで空プロジェクトを作成します。

```bash
mkdir hogehoge && cd hogehoge
cdk init app --language=typescript

# CDKがデプロイのために使用するS3バケットを作成(対象アカウント、リージョンにつき1回だけ実施)
cdk bootstrap
```

```bash
.
├── README.md
├── bin
│   └── hogehoge.ts # 最初に読まれるファイル。環境変数やタグはここで定義
├── cdk.json
├── jest.config.js
├── lib
│   └── hogehoge-stack.ts # ここでさまざまな AWS リソースを定義していく
├── node_modules
├── package-lock.json
├── package.json
├── test
│   └── hogehoge.test.ts
└── tsconfig.json
```

#### 実装する上での参考資料

空プロジェクトが作れたら、いざ、実装！ なのですが、どうしたら良いか 分からないという方、ご安心を！
AWS が公式にサンプルコードを公開しています。ほぼコピペで AWS を定義できてしまいます。

https://github.com/aws-samples/aws-cdk-examples/tree/master/typescript

例えば、。

- S3の静的ホスティングを構築したい場合
  - [static-site](https://github.com/aws-samples/aws-cdk-examples/tree/master/typescript/static-site)
- API Gateway + Lambda + DynamoDB でサーバレスアプリケーション環境を構築したい場合
  - [api-cors-lambda-crud-dynamodb](https://github.com/aws-samples/aws-cdk-examples/tree/master/typescript/api-cors-lambda-crud-dynamodb)

みたいな感じです。

#### CloudFormataion テンプレートの出力

定義したリソースは、次のコマンドで CloudFormation テンプレートを出力できます。実行結果は `cdk.out/HogeHogeStack.template.json` に出力されます。

```bash
cdk synth
```

CDK では、下記の環境変数を参照することで AWS アカウント ID と リージョン を取得できます。

- `CDK_DEFAULT_ACCOUNT`
- `CDK_DEFAULT_REGION`

--profile オプションで AWSプロファイル を指定すれば切り替えることができます。

## AWS にデプロイ

作成した CDK は AWS にデプロイしてみましょう。全部が完成していなくても少しずつデプロイしながら実装してみましょう。

```bash
cdk deploy --require-approval never --hotswap
```

`--require-approval` 承認が必要な場合の変更レベルで never を指定すれば承認不要になります。
`--hotswap` CloudFormation を介さずに直接 AWSリソース が更新される。AWSリソースに変更がなく、ソースコードのみに変更がある場合は、このオプションを付けることで **ソースコードのみをAWSに反映できます**。便利です。（Lambda 関数、Step Functions ステート マシン、および Amazon ECS コンテナ イメージをサポートしています。）

https://docs.aws.amazon.com/cdk/v2/guide/cli.html

## アプリケーション開発

ローカルでソースコードを変更したら 次のコマンドで AWS に自動デプロイが可能です。watch しておくと CloudWatch ログの内容がリアルタイムに出力されるため、こちらも開発する上でとても便利です。

```bash
cdk watch
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59081/3d24a187-ee6c-994b-720a-7164fce7a517.png" width=500px>

#### cdk.json

watch 対象は cdk.json で定義されています。例えば、js ファイルを watch 対象にする場合はデフォルトだと js が exclude されているため、削除すれば良いです。

```diff:cdk.json
{
  "app": "npx ts-node --prefer-ts-exts bin/hogehoge.ts",
  "watch": {
    "include": [
      "**"
    ],
    "exclude": [
      "README.md",
      "cdk*.json",
      "**/*.d.ts",
-     "**/*.js",
      "tsconfig.json",
      "package*.json",
      "yarn.lock",
      "node_modules",
      "test"
    ]
  },
:
```