cdkでSystems ManagerのParameter Storeにパラメータを作成する


## 関連資料
* [What is the AWS CDK? - AWS Cloud Development Kit (AWS CDK) v2](https://docs.aws.amazon.com/cdk/v2/guide/home.html)
* [Your first AWS CDK app - AWS Cloud Development Kit (AWS CDK) v2](https://docs.aws.amazon.com/cdk/v2/guide/hello_world.html)
* [Bootstrapping - AWS Cloud Development Kit (AWS CDK) v2](https://docs.aws.amazon.com/cdk/v2/guide/bootstrapping.html)
* [aws-cdk-lib.aws_ssm module · AWS CDK](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ssm-readme.html)

## 前提
* aws cli, [rainコマンド](https://github.com/aws-cloudformation/rain)がインストールされている
* aws profileの設定が完了し、aws sts get-caller-identityで自分のアカウントが表示される

こんな感じで確認はできる

```bash
$ aws sts get-caller-identity --profile sampleprofile
# {
#     "UserId": "XXXXXXXXXXXXXXXXXXXX",
#     "Account": "123456789012",
#     "Arn": "arn:aws:iam::123456789012:user/sample"
# }
```

## cdkのインストール

```bash
# cdkとtypescriptをインストール
$ npm install -g aws-cdk typescript
# added 1 package, and changed 1 package in 5s

# cdkのバージョン確認
$ cdk --version
# 2.144.0 (build 5fb15bc)
```

## Bootstrapping: AWSアカウント上に初期設定する
* 初めてCDK使う場合は、bootstrapingと呼ばれる初期設定が必要。
* CDKToolkitというCFnスタックがデプロイされることになる。このCFnスタックでCDKのリソースを管理するためのリソースが作成される。

```bash
$ aws_account_id=$(aws sts get-caller-identity --query Account --output text)
$ region=ap-northeast-1

$ cdk bootstrap aws://${aws_account_id}/${region}
# CloudFormationスタックが作成される

# スタックの存在を確認
$ rain ls CDKToolkit
# Stack CDKToolkit: UPDATE_COMPLETE
# ...

```

## リポジトリ内でcdkの初期設定ファイルを生成する

```bash
$ mkdir sample-cdk-ssm-parameter
$ cd sample-cdk-ssm-parameter
$ cdk init --language typescript

# cdk init直後のディレクトリ構成
$ tree -L 2 -I node_modules
# .
# ├── README.md
# ├── bin
# │   └── sample-cdk-ssm-parameter.ts
# ├── cdk.json
# ├── jest.config.js
# ├── lib
# │   └── sample-cdk-ssm-parameter-stack.ts
# ├── package-lock.json
# ├── package.json
# ├── test
# │   └── sample-cdk-ssm-parameter.test.ts
# └── tsconfig.json

# 4 directories, 9 files

# このCDK App配下にあるスタック一覧を表示
$ cdk ls
# SampleCdkSsmParameterStack
```

## SSM Parameterを作成して見て動作確認をしてみる
### ./sample-cdk-ssm-parameter/lib/sample-cdk-ssm-parameter-stack.ts に追記

以下を追記してSystems ManagerのParameter Storeにパラメータを作成する。
```ts
import * as ssm from 'aws-cdk-lib/aws-ssm';
```

```ts
const ssmParameter= new ssm.StringParameter(this, 'SampleSsmParameter', {
    parameterName: 'SampleParameter',
    stringValue: 'test-value',
});
```

以下のようになる。
```ts
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as ssm from 'aws-cdk-lib/aws-ssm';

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

    const ssmParameter= new ssm.StringParameter(this, 'SampleSsmParameter', {
        parameterName: 'SampleParameter',
        stringValue: 'test-value',
    });
  }
}
```

### cdkデプロイ
* cdk synthでCloudFormationのテンプレートが生成される。
    * CFn力があれば読めるようになるが、今回は生成に成功できたらOK
* cdk deployで生成したCFnテンプレートでCFnデプロイが実行される。

```bash
$ cdk synth
# 略

$ cdk deploy
# 略

# CDKスタックによって作成されたリソースが存在することを確認
$ aws ssm get-parameter --name SampleParameter
# {
#     "Parameter": {
#         "Name": "SampleParameter",
#         "Type": "String",
#         "Value": "test-value",
#         "Version": 1,
#         "LastModifiedDate": "2024-06-02T23:23:14.617000+09:00",
#         "ARN": "arn:aws:ssm:ap-northeast-1:123456789012:parameter/SampleParameter",
#         "DataType": "text"
#     }
# }

# CDKスタックごと削除して、リソースを丸ごと削除する
$ cdk destroy
# 略

$ aws ssm get-parameter --name SampleParameter
# An error occurred (ParameterNotFound) when calling the GetParameter operation:
```


## 感想
* 相変わらずAWS公式ドキュメントの日本語訳がひどくて理解が難しいレベルにある。