AWS CDK のローカル開発環境を作ろう！のメモ


# はじめに

[AWS CDK のローカル開発環境を作ろう！](https://aws.amazon.com/jp/builders-flash/202411/create-cdk-local-dev-environment/)のWebサイトで`AWS CDK`を使ったローカル開発環境の整備を行った際の個人的なメモです。

`快適な開発環境を整えよう` までは終了し、`CDKプロジェクトを作成する` ところからのメモになる

# AWS CDKとは

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

# **覚えておくべき CDK コマンド一覧**

## **🛠 プロジェクトの新規作成**
| コマンド | 説明 |
|----------|------|
| `npx cdk init app --language=<LANG>` | **新規プロジェクトの作成** (`<LANG>` に `typescript` などを指定) |
| `npx cdk bootstrap` | **AWS 環境をブートストラップ** (必要なリソースを作成) |
| `npx cdk list` | **CDK アプリに含まれるスタック一覧を表示** |

---

## **🚀 デプロイ関連**
| コマンド | 説明 |
|----------|------|
| `npx cdk synth` | **CloudFormation テンプレートを合成** |
| `npx cdk deploy` | **CDK スタックをデプロイ** |
| `npx cdk deploy --hotswap` | **デプロイ時間を短縮** (コード変更のみ更新) |
| `npx cdk watch` | **ファイルを変更すると自動デプロイ** |

---

## **🔄 差分の確認**
| コマンド | 説明 |
|----------|------|
| `npx cdk diff` | **現在の CloudFormation スタックとの差分を確認** |

---

## **🗑 作成したリソースを削除**
| コマンド | 説明 |
|----------|------|
| `npx cdk destroy` | **デプロイしたリソースを削除** |



# 1. CDKプロジェクトを作成

```
npx cdk init app --language=typescript
```

node_modulesがインストールされるが、そのディレクトリを省くと下記のようなファイル群が用意される。

```
tree -I "node_modules"
.
├── README.md
├── bin
│   └── hello-cdk.ts
├── cdk.json
├── jest.config.js
├── lib
│   └── hello-cdk-stack.ts
├── package-lock.json
├── package.json
├── test
│   └── hello-cdk.test.ts
└── tsconfig.json

4 directories, 9 files
```

AWS 環境を ブートストラップ する。この操作によって、「CDKToolkit」のスタックが作成され、CDK 専用の Amazon S3 バケットや IAM ロールなどの AWS CDK の動作に必要なリソースが用意されます。

```
npx cdk bootstrap
```

### 作成されたリソースの確認方法
[Amazon ECR](https://us-east-1.console.aws.amazon.com/ecr)リポジトリ
```sh 
aws ecr describe-repositories
```

[CloudFormation](https://us-east-1.console.aws.amazon.com/cloudformation) スタック

```sh 
aws cloudformation list-stacks --stack-status-filter CREATE_COMPLETE UPDATE_COMPLETE
```

[S3](https://us-east-1.console.aws.amazon.com/s3) バケット

```sh 
aws s3 ls
```

[IMS](https://us-east-1.console.aws.amazon.com/iam) ロール
```sh 
aws iam list-roles | grep "cdk-hnb659fds"
```

[SSM](https://us-east-1.console.aws.amazon.com/systems-manager/parameters) パラメータ
```sh 
aws ssm get-parameter --name /cdk-bootstrap/hnb659fds/version
```

### CDK アプリに含まれるスタックを確認

```terminal
$ npx cdk list
HelloCdkStack
```


# 2. Lambda関数を作成してHTTPSでアクセスする

`lib/hello-cdk-stack.ts` を変更してLambda関数を作成する

```javascript
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
// Import the Lambda module
import * as lambda from 'aws-cdk-lib/aws-lambda';

export class HelloCdkStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // Define the Lambda function resource
    const myFunction = new lambda.Function(this, "HelloWorldFunction", {
      runtime: lambda.Runtime.NODEJS_20_X, // Provide any supported Node.js runtime
      handler: "index.handler",
      code: lambda.Code.fromInline(`
        exports.handler = async function(event) {
          return {
            statusCode: 200,
            body: JSON.stringify('Hello World!'),
          };
        };
      `),
    });

    // リソース管理のためにタグを付ける
    cdk.Tags.of(myFunction).add('WPS', 'cdktest_rairaii');

    // HTTPSでアクセス可能にする
    // Define the Lambda function URL resource
    const myFunctionUrl = myFunction.addFunctionUrl({
      authType: lambda.FunctionUrlAuthType.NONE,
    });

    // Define a CloudFormation output for your URL
    new cdk.CfnOutput(this, "myFunctionUrlOutput", {
      value: myFunctionUrl.url,
    })
    // ここまで HTTPSでアクセス可能にする
  }
}
```

# 3. AWSにデプロイ

CloudFormation テンプレートを合成する

```
npx cdk synth
```

デプロイを実行する。`npx cdk synth`を実行していない場合は自動実行される。

```
npx cdk deploy
```

# 4. Lambda関数の動作確認

`curl`コマンドで動作確認をする

```sh
curl https://<Lambda関数のURL>/
"Hello CDK!"%      
```

# 5. 作成したリソースを削除

今回作成したリソースを削除する

```sh
npx cdk destroy
```
```sh:削除されるリソース
Are you sure you want to delete: HelloCdkStack (y/n)? y
HelloCdkStack: destroying... [1/1]
HelloCdkStack |   0 | 12:45:59 PM | DELETE_IN_PROGRESS   | AWS::CloudFormation::Stack | HelloCdkStack User Initiated
HelloCdkStack |   0 | 12:46:00 PM | DELETE_IN_PROGRESS   | AWS::Lambda::Url        | HelloWorldFunction/FunctionUrl (HelloWorldFunctionFunctionUrl4150BDAD) 
HelloCdkStack |   0 | 12:46:00 PM | DELETE_IN_PROGRESS   | AWS::Lambda::Permission | HelloWorldFunction/invoke-function-url (HelloWorldFunctioninvokefunctionurlA2CB1A84) 
HelloCdkStack |   0 | 12:46:00 PM | DELETE_IN_PROGRESS   | AWS::CDK::Metadata      | CDKMetadata/Default (CDKMetadata) 
HelloCdkStack |   1 | 12:46:01 PM | DELETE_COMPLETE      | AWS::Lambda::Permission | HelloWorldFunction/invoke-function-url (HelloWorldFunctioninvokefunctionurlA2CB1A84) 
HelloCdkStack |   2 | 12:46:02 PM | DELETE_COMPLETE      | AWS::CDK::Metadata      | CDKMetadata/Default (CDKMetadata) 
HelloCdkStack |   3 | 12:46:02 PM | DELETE_COMPLETE      | AWS::Lambda::Url        | HelloWorldFunction/FunctionUrl (HelloWorldFunctionFunctionUrl4150BDAD) 
HelloCdkStack |   3 | 12:46:02 PM | DELETE_IN_PROGRESS   | AWS::Lambda::Function   | HelloWorldFunction (HelloWorldFunctionB2AB6E79) 
HelloCdkStack |   4 | 12:46:06 PM | DELETE_COMPLETE      | AWS::Lambda::Function   | HelloWorldFunction (HelloWorldFunctionB2AB6E79) 
HelloCdkStack |   4 | 12:46:06 PM | DELETE_IN_PROGRESS   | AWS::IAM::Role          | HelloWorldFunction/ServiceRole (HelloWorldFunctionServiceRole8E0BD458) 
```

# CDKのためのリソース削除方法

現時点では不明であり手作業での削除になりそう