Node.jsでAWSのパラメータストアから値を取得する

# はじめに
シークレット系の情報をAWSのパラメータストアに格納し，それをNode.jsで呼び出してみました。
この記事はその際の備忘録になります。
誤っている箇所や修正したほうがいい箇所などありましたらコメントいただけますと幸いです。

# AWSのパラメータストアとは
**AWS System Manager** の機能の一つ。
パスワードなどのシークレット系の情報をセキュアに保存することができます。

公式ページ : [https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/systems-manager-parameter-store.html](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/systems-manager-parameter-store.html)

# 必要なモジュールのインストール
[**AWS SDK for JavaScript**](https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/welcome.html) をインストールします。

```console
$ npm install aws-sdk
```

AWS SDK for JavaScript とは，AWSのサービスをjavascriptで使用するためのAPIになります。
今回はこのAPIを使用して，パラメータストアから値を取得します。

# AWSの認証情報の設定
Node.jsでAWSのサービスを利用するに当たって，認証情報を設定する必要があります。
[認証情報の設定方法はいくつかあります](https://docs.aws.amazon.com/ja_jp/sdk-for-javascript/v2/developer-guide/setting-credentials-node.html)が，今回は[ `~/.aws/credentials` から読み取る方法](https://docs.aws.amazon.com/ja_jp/sdk-for-javascript/v2/developer-guide/loading-node-credentials-shared.html)を使用したいと思います。

今回 `~/.aws/credentials` には，defaultプロファイルとは別に，privateアカウントのプロファイルも記述しておきます。

```~/.aws/credentials
[default]
aws_access_key_id = <ACCESS_KEY_ID>
aws_secret_access_key = <SECRET_ACCESS_KEY>

[private]
aws_access_key_id = <PRIVATE_ACCOUNT_ACCESS_KEY_ID>
aws_secret_access_key = <PRIVATE_ACCOUNT_SECRET_ACCESS_KEY>
```

また，`~/.aws/config` ファイルには，`region` を記述しておきます。

```~/.aws/config
[default]
output = json
region = ap-northeast-1

[profile private]
output = json
region = ap-northeast-1
```

# AWSで新規パラメータを作成
[公式ドキュメント](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/parameter-create-console.html)を参考に，新規パラメータを作成します。
今回は，`~/.aws/credentials` や `~/.aws/config` にprivateというプロファイル名で記述したAWSアカウントのパラメータストアに，sampleというパラメータ名で 'sample' という文字列を保存しました。

# 実行ファイル作成
上記で作成したsampleというパラメータを取得します。

### 実行ファイルの完成形
```javascript:sample.js
// aws-sdk をロードする前に，環境変数をセットする

// ~/.aws/config の情報を参照できるようにする
process.env.AWS_SDK_LOAD_CONFIG = true;

// 使用するprofileを指定する
process.env.AWS_PROFILE = 'private';

// 環境変数セット完了

// aws-sdk モジュールを読み込む
const AWS = require("aws-sdk");

// 新規 AWS.SSM class を作成
const ssm = new AWS.SSM();

// 'sample' という名前のパラメータを取得
const params = {
  Name: 'sample',
  WithDecryption: true
};
ssm.getParameter(params, (err, data) => {
  if (err) {
    console.log(err);
  } else {
    console.log(data);
  }
});
```

下記で各処理について説明していきます。

### 環境変数の設定
```javascript:sample.js（一部）
// aws-sdk をロードする前に，環境変数をセットする

// ~/.aws/config の情報を参照できるようにする
process.env.AWS_SDK_LOAD_CONFIG = true;

// 使用するprofileを指定する
process.env.AWS_PROFILE = 'private';

// 環境変数セット完了

// aws-sdk モジュールを読み込む
const AWS = require("aws-sdk");
```

`aws-sdk` モジュールを読み込む前に，環境変数をセットします。
そうすることで，セットした環境変数の設定を元に `aws-sdk` モジュールの読み込みが行われます。

**セットする環境変数**

- **AWS_SDK_LOAD_CONFIG** : `~/.aws/config` に記述された設定を参照できるようにします。（[参考](https://docs.aws.amazon.com/ja_jp/sdk-for-javascript/v2/developer-guide/getting-started-nodejs.html)）
- **AWS_PROFILE** : 使用するprofileを指定します。（[参考](https://docs.aws.amazon.com/ja_jp/sdk-for-javascript/v2/developer-guide/loading-node-credentials-shared.html)）

### 新規 AWS.SSM クラスを作成
```javascript:sample.js（一部）
// 新規 AWS.SSM class を作成
const ssm = new AWS.SSM();
```
AWS.SSM クラスは，Node.js内で AWS System Manager の機能を利用するためのクラスになります。([参考](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/SSM.html))

### パラメータを取得
```javascript:sample.js（一部）
// 'sample' という名前のパラメータを取得
const params = {
  Name: 'sample',
  WithDecryption: true // パラメータの値が暗号化されていた場合は復号
};
ssm.getParameter(params, (err, data) => {
  if (err) {
    console.log(err);
  } else {
    console.log(data);
  }
});
```

AWS.SSM クラスに用意されている `getParameter` メソッドを使用して，パラメータストアから値を取得します。（[参考](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/SSM.html#getParameter-property
)）

**paramsに設定できるオプション**

- **Name** : パラメータ名
- **WithDecryption** : パラメータの値が暗号化されていた場合に復号するかどうかを指定（パラメータの値が文字列または文字列リストの場合は，このオプションは無視されます）

# 実行
```console
$ node sample.js
{
  Parameter: {
    Name: 'sample',
    Type: 'String',
    Value: 'sample',
    Version: 1,
    LastModifiedDate: 2021-03-23T07:45:35.557Z,
    ARN: 'arn:aws:ssm:ap-northeast-1:xxxxxxxxxxxx:parameter/sample',
    DataType: 'text'
  }
}
```



# 参考
### AWS 公式
- [AWS Systems Manager パラメータストア](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/systems-manager-parameter-store.html)
- [Node.js での認証情報の設定](https://docs.aws.amazon.com/ja_jp/sdk-for-javascript/v2/developer-guide/setting-credentials-node.html)
- [Getting started in Node.js](https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/getting-started-nodejs.html)
- [SDK for JavaScript のセットアップ](https://docs.aws.amazon.com/ja_jp/sdk-for-javascript/v2/developer-guide/setting-up.html)
- [What Is the AWS SDK for JavaScript?](https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/welcome.html)

### その他
- [【Node.js】AWS SSMパラメータストアの値を取得する](https://qiita.com/kou_pg_0131/items/4bc1053678b34cbc59c2)