Lambda（Node.js）でSSM パラメータストアの値を取得・更新する

# はじめに
パラメーターストアをNode.jsで扱う系の記事がパッと見つからなかったので「扱ってみた」を書き残します。

難しい事は無いのですが、色んな記事の行ったり来たりや、公式ドキュメントを読むのが面倒な~~私みたいな~~人向けに書いています。
# 手順
1. パラーメータストアを作成する
1. Lambdaを作成する
1. IAMポリシーを追加する
1. Lambdaを実行する

## 1. パラメーターストアを作成する
マネコンの検索窓に「Systems Manager」と入力してSystems Managerに移動する。左ペインの「パラメーターストア」をクリックする。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349281/2a71dd45-74aa-b08e-0c69-1716a48b512c.png)

「パラメータの作成」をクリック。

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349281/29f90b4e-8f54-873a-c72d-04501546a06e.png)

以下のように作成します。

### 名前
/test/lastExcutedAt
### データ型
文字列
### 値
0

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349281/837c28ca-c919-8473-98fe-f29b8c9e4dad.png)

# 2. Lambdaを作成する
### 関数名
get-ssm-parameter
### ランタイム
Node.js 20.x

あとはデフォルトで「関数の作成」をする。

# 3. IAMポリシーを追加する
Lambdaにパラメーターストアを読み書きするための権限を与えます。

作成したLambdaの「設定」タブから「アクセス権限」に移動します。

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349281/fa8252d1-9343-835a-0dba-4637fb78cf6b.png)

ロール名のリンクをクリックしてIAMに移動します。

「許可を追加」から「インラインポリシーを作成」を選択。

![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349281/f0a862a9-9a0e-cb3b-19e2-ccf83fade913.png)

以下のJSONを貼り付けます。

**ResourceにはパラメーターのARNを記載します。**

```json
{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"ssm:DescribeParameters"
			],
			"Resource": "*"
		},
		{
			"Effect": "Allow",
			"Action": [
				"ssm:GetParameter",
				"ssm:PutParameter"
			],
			"Resource": "arn:aws:ssm:ap-northeast-1:1234567890:parameter/test/lastExcutedAt"
		}
	]
}
```

GetParameter、PutParameter以外については下記リンクを参考にしてください。

https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/sysman-paramstore-access.html

# 4. Lambdaを実行する

index.mjsを以下と置き換える。

実行すると、Lambdaの前回実行時と今回実行時のタイムスタンプが返って来ると言う関数です。

```js
import { SSMClient, GetParameterCommand, PutParameterCommand } from '@aws-sdk/client-ssm';

export const handler = async (event, context) => {

    let lastTime = 0;
    let thisTime = (new Date()).getTime();

    try {
        const client = new SSMClient({ region: 'ap-northeast-1' });
        const params = {
            Name: '/test/lastExcutedAt',
            WithDecryption: true
          };
        　// パラメーターストアに保存した前回実行時のタイムスタンプを取得
        const commandGet = new GetParameterCommand(params);
        const paramStore = await client.send(commandGet);
        

        lastTime = +paramStore.Parameter.Value;
        
        　// 今のタイムスタンプをパラメーターストアに保存
        const commandUpdate = new PutParameterCommand({
            Name: '/test/lastExcutedAt',
            Value: String(thisTime),
            Overwrite: true
        });

        const commandResult = await client.send(commandUpdate);

        console.log(commandResult);

    } catch (err) {
        return err;
    }

    return {
      'statusCode': 200,
      'body': JSON.stringify({
          lastTime, thisTime
      })
  }
};

```

「Deploy」して「Test」すると以下のようにパラメーターストアに保存した値が取得出来ます。実行するたびに、lastTimeの値が変わり、パラメーターストアをLambdaから更新出来ていることを確認出来ます。

```
Test Event Name
MyEvent

Response
{
  "statusCode": 200,
  "body": "{\"lastTime\":1708680020789,\"thisTime\":1708681929920}"
}
```

以上ですー！