AWS CDK Intro Workshopをリベンジしてみた

# はじめに

以前、AWS CDK イントロワークショップをやった内容を記事にしました。

https://qiita.com/a_b_/items/176c472b3859f4cd56d1

その際は一部のみ日本語に訳されておりすべてはできませんでした。

ですがいつのまにか、全部翻訳されていたので改めて行ってみました。

https://dev.classmethod.jp/articles/aws-cdk-workshop-jp-202211/

https://cdkworkshop.com/ja/

ほぼワークショップの通りで可能ですが、何点か個人的に気になった点を記載していきます。

# 環境

前回と同じで、Cloud9を用いました。

- Cloud9
    - デフォルトVPC
    - コンソールと同じ権限を持つ一時クレデンシャル
        - AWS Managed Temporary Credentialsを利用
        - CodeCommitなど利用するのでそれらの権限が必要
    - インスタンスタイプはメモリが2GB以上
        - dk diffでそこそこメモリが必要そう
    - Node.jsはインストール済み
    - AWS CDKもインストール済み

# 気づいた点

前回と同様、TypeScriptで行いました。

## 「cdk deploy」ページ

`cdk bootstrap`は以前行いましたが、アップデートありましたので再実行しました
また（以前から？）、CloudFormationのリソースがツリー表示に変わっていました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/f3feb3c9-3527-2154-3639-48b3a85b3db5.png)


## 「リソースの定義」ページ

記載のコードでは、DynamoDBはプロビジョンドモードで作成され、常時課金されます。

ワークショップをすぐに終わらせリソースを削除するのであれば大した額にはならないですが、数日にわたって行う場合は以下の行を加えてオンデマンドモードにした方がいいかと思います。
```diff:hitcounter.ts
    const table = new dynamodb.Table(this, 'Hits', {
        partitionKey: { name: 'path', type: dynamodb.AttributeType.STRING },
+       billingMode: dynamodb.BillingMode.PAY_PER_REQUEST
    });
```
コードは以下を参考にしました。

https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_dynamodb.BillingMode.html

:::note warn

ただしこの後に行うバリデーションテストのときに「キャパシティに設定する値をチェックする」ということを行いますので、その際は外す必要があります。
:::


## 「HitCounter のテスト」ページ
説明ではDynamoDBのUIが古いUIのままでした。今は以下のようなUIになっています。（忘れていたので若干迷いました）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/0610d8e8-4f29-3700-82bb-8be38d17643e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/fa9da459-171b-b7ad-f52d-3c16763a5651.png)


## 「クリーンアップ」ページ

> hitcounter.ts を編集して、テーブルに RemovalPolicy プロパティを追加してください。

説明では、追加した後デプロイせずに`cdk destroy`を実行していますが、これでは削除されません。
追加した設定を反映させるために一度`cdk deploy`を行う必要があります。



## 「アドバンスドトピック > コンストラクトのテスト > アサーションテスト」ページ

ここでは以下のテストを作成します。（あらかじめ知っておいた方がわかりやすいと思います。）

- DynamoDBが作成されるか
- Lambdaが作成されるか
    - 環境変数に期待通りの文字列が設定されているか
- DynamoDBが暗号化されているか

また（細かいことですが）、説明のフォルダ名は`tests`ですが、実フォルダ名は`test`になっています。



## 「アドバンスドトピック > コンストラクトのテスト > バリデーションテスト」ページ

ここでは以下のテストを作成します。（先と同様、あらかじめ知っておいた方がわかりやすいと思います。）

- DynamoDBの`readCapacity`を設定したときにバリデーションエラーにならないか

:::note warn
DynamoDBを作成する際にオンデマンドモードで作成した場合は、コメントアウトしておく必要があります。

```diff:hitcounter.ts
    const table = new dynamodb.Table(this, 'Hits', {
        partitionKey: { name: 'path', type: dynamodb.AttributeType.STRING },
+       // billingMode: dynamodb.BillingMode.PAY_PER_REQUEST
        encryption: dynamodb.TableEncryption.AWS_MANAGED,
+       readCapacity: props.readCapacity ?? 5
    });
```
ここではバリデーションテストの方法を確認するためで、この設定でデプロイすることはしないので、確認後は（`readCapacity`を削除して）また戻しておくとよいかと思います。
:::


## 「CDKパイプライン > パイプライン入門」ページ

ここから確認できるよう、公式がGit Hubにコードをアップしています。

> 完了していないか、またはこの部分のみ検証する場合は、こちら のコードを利用すれば、テストを追加した直後のプロジェクトの状態に設定することができます。

上記リポジトリからCloud9上に持ってくるには、以下の方法で行いました。

```bash
# 他のサンプル等もまとめて
git clone https://github.com/aws-samples/aws-cdk-intro-workshop.git

# ワークショップのディレクトリを作成
mkdir cdk-workshop && cd cdk-workshop
cdk init sample-app --language typescript

# ワークショップのコードは以下にあるので、上書きコピーします
cp -r ../aws-cdk-intro-workshop/code/typescript/tests-workshop/* .

# 必要に応じて、ワークショップ途中で行うインストールを実行します
# npm install cdk-dynamo-table-viewer@0.2.0
```

## 「CDKパイプライン > パイプライン入門 > リポジトリの作成」ページ

Cloud9であれば、CodeCommitと簡単に連携できます。

HTTPS(GRC)をコピーして、`git remote`の際に指定するだけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/5417089b-5d8b-7a97-f5eb-99e5f923aafe.png)

```bash
git remote add origin [HTTPS(GRC)]

# 認証情報は問われません
git push --set-upstream origin master
```

> ステージングされていないことや、コミットされていない内容があれば、`git commit -am "SOME_COMMIT_MESSAGE_HERE"` で適用できます。 このコマンドで全てのファイルをステージ又はコミットしてくれるので、準備が完了です。

amオプションでは一度もaddしていないファイルは対象外になるようで、新規に作成した`lib/pipeline-stack.ts`はコミットされませんでした。
`git add -A && git commit -m "init"`でコミットを行いました。

## 「CDKパイプライン > パイプライン入門 > パイプラインの作成」ページ

> 新しいパッケージを使うため、最初に npm install aws-cdk-lib/pipelines を実行します。

特に入れなくても問題なかったです。

## 「CDKパイプライン > パイプライン入門 > アプリケーションの追加」ページ

> cdk_wolibrkshop フォルダに新規に pipeline-stage.ts というファイルを以下の内容で作成します。

作成するフォルダは`lib`以下ですので、`lib/pipeline-stage.ts`になります。
また新しいファイルなのでコミットのコマンドも`git add -A && git commit -m "Add deploy stage to pipeline" && git push`になります。

## 「CDKパイプライン > パイプライン入門 > パイプラインの改善」ページ

> まずは、clib/cdk-workshop-stack.ts を編集して、スタックのプロパティとして公開するようにします。

これも誤記かと、`lib/cdk-workshop-stack.ts`でした。

またテストのデプロイが行われると、定義したテストが実行され、その結果がテーブルに反映されていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/46bd7014-215a-ebb7-f63b-e3372581f443.png)


# 片付け
パイプラインで2つ、その前の段階で1つ、CFnスタックが作られていますので、削除していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/4fcd5095-d32b-9485-e799-fa2eb9b92011.png)

cdk destroyだと、1つのスタックしか消してくれませんでした。
```
$ cdk destroy
Are you sure you want to delete: CdkWorkshopPipelineStack (y/n)? 
```

また、DynamoDBの設定を変えていない場合は作られたままですので、コンソールから消します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/55b61db3-c2f8-af69-02cf-762cae85bc20.png)


ロググループで`CdkWorkshopStack`がつくものも消していきました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/1e1b2338-cd9f-d9cd-16d2-67d0217f66ae.png)


# おわりに

前回できなかったテストやパイプラインまで、とりあえずやることができました。
最近SAMばかり使っているので、「プログラム的にインフラ定義」に思考が追い付かないのを感じました。
CDKで管理する際は、まずこれからやり直すのがいいかな、と思います。