【AWS CDK (Python)】 よく使うCDKコマンド

## はじめに
本記事は、私自身の備忘録を兼ねてAWS CDKをこれから始める方の一助になればと思い、AWS CDKの使い方等をまとめたものです。
今回は、よく使うAWS CDKのコマンドの使い方を確認しています。
なお、本記事は私自身の経験を基に記載していますが、間違いがあったらすみません。

## 環境
本記事は以下の環境を使用して記載しています。
* AWS Cloud9
* AWS CDK：2.80.0
* Python： 3.10.11
* Node.js： 16.20.0

また、以下の記事に基づいてAWS CDKの環境を作成しています。
* [【AWS CDK/Python】 AWS CDKの始め方](https://qiita.com/takataka987/items/4448dbf06d8c70173305)

## よく使うCDKコマンド
以下のコマンドをそれぞれ確認していきます。
* [cdk list (ls)](#cdk-list-ls)
* [cdk diff](#cdk-diff)
* [cdk synthesize (synth)](#cdk-synthesize-synth)
* [cdk deploy](#cdk-deploy)
* [cdk destroy](#cdk-destroy)


### cdk list (ls)
`cdk list`は、アプリケーション内のスタックをリスト表示します。
以下は、アプリケーション内に2つのスタックがある例です。
```console
(.venv) user_name:~/environment/cdk-app (master) $ cdk list
CdkAppStack-dev
CdkAppStack-prod
```

以下のようにワイルドカード(*)を使用することでフィルタすることもできます。
```console
(.venv) user_name:~/environment/cdk-app (master) $ cdk list CdkAppStack-p*
CdkAppStack-prod
```

### cdk diff
`cdk diff`は、既にデプロイされているスタックと比較し変更点を表示します。リソースの追加や削除だけでなく、リソース内の設定変更も変更箇所がある場合は表示してくれます。
以下は、既にデプロイしているS3バケットに対してバージョニングを有効にするように変更し、さらにS3バケットをもう一つ新たに作成する場合の例です。
```console
(.venv) user_name:~/environment/cdk-app (master) $ cdk diff
Stack CdkAppStack-dev
Resources
[~] AWS::S3::Bucket MyS3Bucket-dev MyS3BucketdevXXXXXXXX 
 └─ [+] VersioningConfiguration
     └─ {"Status":"Enabled"}

Stack CdkAppStack-prod
Resources
[+] AWS::S3::Bucket MyS3Bucket-prod MyS3BucketprodXXXXXXXX 
```

以下のようにスタック名を指定することで、任意のスタックの変更点だけを表示することもできます。
```console
(.venv) user_name:~/environment/cdk-app (master) $ cdk diff CdkAppStack-dev
Stack CdkAppStack-dev
Resources
[~] AWS::S3::Bucket MyS3Bucket-dev MyS3BucketdevXXXXXXXX 
 └─ [+] VersioningConfiguration
     └─ {"Status":"Enabled"}
```

### cdk synthesize (synth)
`cdk synthesize`は、スタックのCloudFormation Templateを作成します。
```console
(.venv) user_name:~/environment/cdk-app (master) $ cdk synthesize
Successfully synthesized to /home/ec2-user/environment/cdk-app/cdk.out
Supply a stack id (CdkAppStack-dev, CdkAppStack-prod) to display its template.
```

`作業ディレクトリ/cdk.out`を確認するとCloudFormation Templateが作成されていることが分かります。デプロイする内容をCloudFormation Templateで確認したい場合は便利ですね。
```JSON:cdk.out/CdkAppStack-dev.template.json
{
 "Resources": {
  "MyS3BucketdevXXXXXXXX": {
   "Type": "AWS::S3::Bucket",
   "Properties": {
    "BucketName": "cdk-test-bucket-dev",
    "VersioningConfiguration": {
     "Status": "Enabled"
    }
   },
   "UpdateReplacePolicy": "Delete",
   "DeletionPolicy": "Delete",
   "Metadata": {
    "aws:cdk:path": "CdkAppStack-dev/MyS3Bucket-dev/Resource"
   }
  },
(以下省略)
```

### cdk deploy
`cdk deploy`は、実際にリソースをデプロイします。実際のCloudFormationの処理としては、変更セットの作成⇒変更セットの実行 という流れになっているようです。
```console
(.venv) user_name:~/environment/cdk-app (master) $ cdk deploy

✨  Synthesis time: 16.1s

(中略)
CdkAppStack-dev: deploying... [1/1]
CdkAppStack-dev: creating CloudFormation changeset...

 ✅  CdkAppStack-dev

✨  Deployment time: 36.6s

Stack ARN:
(中略)

✨  Total time: 52.7s
```

アプリケーション内にスタックが複数ある場合は、`--all`（全てのスタックをデプロイ）か`スタック名`（任意のスタックのみをデプロイ）を付けないとエラーになります。
なお、スタック名指定してデプロイする場合、指定したスタックの依存関係にあるスタックもデプロイされます。
```console
(.venv) user_name:~/environment/cdk-app (master) $ cdk deploy --all
(.venv) user_name:~/environment/cdk-app (master) $ cdk deploy CdkAppStack-dev
```

スタック内でIAMロールの作成などセキュリティに関するリソースがある場合は、スタック毎に確認を求められます。いちいち確認するのが面倒な場合は、`--require-approval never`を付けると確認をスキップできます。
```console
(.venv) user_name:~/environment/cdk-app (master) $ cdk deploy --require-approval never
```

`cdk deploy`に`--no-execute`を付けて実行するとデプロイせずにCloudFormationの変更セットだけ作成してくれます。デプロイする前に変更セットを確認することで、リソースの置換（再作成）などサービスに影響のあるデプロイの発生を事前に確認することができます。サービス中のシステムでデプロイする際は、いきなりデプロイせずに変更セットを確認した方が安心ですね。
```console
(.venv) user_name:~/environment/cdk-app (master) $ cdk deploy --no-execute
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3445559/b195e405-4ddc-622c-8528-634936fc7156.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3445559/4bc02a6c-ce17-3ff3-da3b-9a5c4138b1c9.png)

### cdk destroy
`cdk destroy`は、既にデプロイしたリソースを削除します。
```console
(.venv) user_name:~/environment/cdk-app (master) $ cdk destroy
Are you sure you want to delete: CdkAppStack-dev (y/n)? y
CdkAppStack-dev: destroying... [1/1]

 ✅  CdkAppStack-dev: destroyed
```

アプリケーション内にスタックが複数ある場合は、`--all`（全てのスタックを削除）か`スタック名`（任意のスタックのみを削除）を付けないとエラーになります。
なお、スタック名指定して削除する場合、指定したスタックに依存関係のあるスタックも削除されるのでご注意を。
```console
(.venv) user_name:~/environment/cdk-app (master) $ cdk destroy --all
(.venv) user_name:~/environment/cdk-app (master) $ cdk destroy CdkAppStack-dev
```

## まとめ
AWS CDKのよく使うコマンドを確認しました。他にも`cdk init`や`cdk bootstrap`などのコマンドがありますが、頻繁に使用するコマンドではないと思いますので、省略しました。
最後まで読んでいただいてありがとうございます。
少しでも参考になれば幸いです。
#### 参考文献
* [AWS Cloud Development Kit (AWS CDK) v2デベロッパーガイド](https://docs.aws.amazon.com/ja_jp/cdk/v2/guide/home.html)