VPC Lambda（Node.js）からSecretsManagerのシークレットを取得する

## 手順

- VPCを作成
    - プライベートサブネットを１つ作成
    - （↑Lambdaを入れる）
- Lambdaを作成
- Lambdaのロールを編集
    - LambdaをVPCに入れるためのポリシーをアタッチ
    - SecretsMangerを読むためのポリシーをアタッチ
- LambdaをVPCに入れる
- SecretsMangerでシークレット作成
- VPCエンドポイントを作成
- Lambdaを編集
- Lambdaでシークレットが取得出来る事を確認

## VPCを作成

お試しなので下図の最小限の設定で作ります。

![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349281/f6b257d2-605d-185a-9c15-de2e8791faf8.png)

## Lambdaを作成

ランタイムはNode.js。関数名のみ入力したらデフォルトのままで「関数の作成」します。

![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349281/934312ba-322e-c6c5-a8a8-21a1efd12e05.png)

## Lambdaのロールを編集

「設定」タブの「アクセス権限」に表示された実行ロールのリンクをクリックします。

![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349281/11d631e2-3eca-9401-7605-d9c2b914bacb.png)

IAMロールの画面に飛びます。「許可を追加」をクリックすると現れる「ポリシーをアタッチ」をクリックします。下記２つのポリシーをアタッチします。

- AWSLambdaVPCAccessExecutionRole
- SecretsManagerReadWrite

![06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349281/2268925d-6f3d-d1dc-9358-09c1c9a43d01.png)

## LambdaをVPCに入れる

Lambdaの画面に戻る。

「設定」タブを開いて「VPC」を選択して「編集」する。

![08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349281/73390c31-e17d-a99a-4f76-e67babbb581d.png)

- どのVPCに入れるか選択
- どのサブネットに入れるか選択
- どのセキュリティグループ（SG）を割り当てるか選択
    - VPC作成時に自動で作られたdefaultと表示されているものでOK

![07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349281/fbfc5f8e-35a5-619a-c352-d482c1a9d0cb.png)

## SecretsMangerでシークレット作成

SecretsManagerのページへ移動します。「新しいシークレットを保存」します。

**！さっきまで作業していたリージョンのままであることを確認してください。移動したタイミングで切り替わってしまう事があります。**

- シークレットのタイプ
    - その他のシークレットのタイプ
- キー/値のペア
    - password
    - hogehoge
- 暗号化キー
    - aws/secretsmanager

![09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349281/8ce7fa34-ffd7-5c30-97b7-e9dc6efd187c.png)

- シークレットの名前
    - mypassword

 ![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349281/db03049b-5e5e-f943-db7b-2e618f6fcf32.png)

### ローテーションを設定（オプション）
デフォルトのまま。

### レビュー
問題無ければ「保存」します。

## VPCエンドポイントを作成

VPCのページに移動します。

「エンドポイント」を選択して「エンドポイントを作成」をクリックします。

![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349281/4ae3ca6f-822c-b5e6-8d25-2368fc41e564.png)

- 名前タグ
    - myendpoint
- サービスカテゴリー
    - AWSのサービス
- サービス
    - 下記を検索窓に入力して選択する
    - com.amazonaws.ap-northeast-1.secretsmanager
- VPC
    - 上記で作成したものを選択
- サブネット
    - 上記で作成したものを選択
- セキュリティーグループ
    - LambdaをVPCに入れる際に割り当てたセキュリティーグループを選択
    - ↑これを間違うとLambdaからシークレットの取得が出来ないので注意

![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349281/8fb4b434-6d31-fa26-5faa-2a3b1dd324f7.png)

## Lambdaを編集

```js
import {
  SecretsManagerClient,
  GetSecretValueCommand,
} from '@aws-sdk/client-secrets-manager';

const secret_name = 'mypassword';

const client = new SecretsManagerClient({
  region: 'ap-northeast-1',
});

export const handler = async (event) => {
  let mypasword;

  try {
    const secretObject = await client.send(
      new GetSecretValueCommand({
        SecretId: secret_name,
        VersionStage: 'AWSCURRENT', // VersionStage defaults to AWSCURRENT if unspecified
      })
    );
    mypasword = JSON.parse(secretObject.SecretString);
    
  } catch (e) {
    console.error(e);
    return null;
  }

  return {
    statusCode: 200,
    body: JSON.stringify( mypasword.password ),
  };
};

```

## Lambdaでシークレットが取得出来る事を確認

「Deploy」して「Test」します。シークレットに登録した hogehoge が現れたら成功です。

![16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349281/62af4162-2dd8-d240-3491-6e73deb7cf2a.png)

### 失敗してしまう場合は

私が失敗したパターンは以下のどちらかでした。

- VPCエンドポイントのサブネットやセキュリティグループがLambdaに割り当てているものと違う
- シークレットを他のリージョンで作成してしまっている、あたりを確認してみて下さい。