AWS デフォルトVPC内のサブネットに設置したlambdaからSecrets ManagerのAPIキーを取得する方法

# 概要

- デフォルトVPC内のサブネットに設置したlambdaからSecrete ManagerのAPIキーを取得する方法をまとめる。

# 前提

- 下記の内容が完了していること。

https://qiita.com/miriwo/items/269c8ae11ea8b5cc7740

https://qiita.com/miriwo/items/c1606a4292e108425d77

# 方法

## lambdaの作成

1. 任意のランタイムでlambda関数を作成する。（筆者はNode.js18で作成する）
1. 下記の内容をindex.mjsに記載する。

    ```js
    // Use this code snippet in your app.
    // If you need more information about configurations or implementing the sample code, visit the AWS docs:
    // https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/getting-started.html
    
    import {
      SecretsManagerClient,
      GetSecretValueCommand,
    } from "@aws-sdk/client-secrets-manager";
    
    const secret_name = "API-KEY";
    
    const client = new SecretsManagerClient({
      region: "ap-northeast-1",
    });
    
    let response;
    
    try {
      response = await client.send(
        new GetSecretValueCommand({
          SecretId: secret_name,
          VersionStage: "AWSCURRENT", // VersionStage defaults to AWSCURRENT if unspecified
        })
      );
    } catch (error) {
      // For a list of exceptions thrown, see
      // https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_GetSecretValue.html
      throw error;
    }
    
    const secret = response.SecretString;
    console.log(secret);
    
    // Your code goes here
    
    export const handler = async(event) => {
        // TODO implement
        const response = {
            statusCode: 200,
            body: JSON.stringify('Hello from Lambda!'),
        };
        return response;
    };
    ```

1. 「レイヤーの追加」から「AWSレイヤー」で「AWS-Parameters-and-Secrets-Lambda-Extension」を選択し、設定する。（記事記載時のレイヤーバージョンは4）
1. 「設定」から「アクセス権限」を開き、lambdaに紐づいているロールの詳細を開く。
1. 「許可を追加」から「ポリシーをアタッチ」を開き「SecretsManagerReadWrite」を付与する。
1. 「許可を追加」から「ポリシーをアタッチ」を開き「AWSLambdaVPCAccessExecutionRole」を付与する。
1. 一旦この状態でlambdaのHello worldテストを定義後、実行し、下記のように問題なくシークレットマネージャーの値を取得できていることを確認する。

    ![secret-manager-get-test_-_Lambda.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/1a5c482c-7285-60a4-4070-c0bc57e54f49.png)

## VPC系情報をlambdaに記載

1. 「設定」から「VPC」を開き「編集」をクリックする。
1. 下記のように設定する。
    - VPC：デフォルトVPCを選択
    - サブネット：デフォルトサブネットのnp-northeast-1aのサブネットを選択
    - セキュリティグループ：[AWS VPCエンドポイントを作成する](https://qiita.com/miriwo/items/c1606a4292e108425d77)で作成したセキュリティグループを設定する。

    ![VPC_の編集__secret-manager-get-test__-_Lambda.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/19011dc1-2dab-67d2-948b-8745c884ea32.png)

1. Hello worldテストを実行し、下記のように問題なくSecrets Managerの値を取得できていることを確認する。

    ![secret-manager-get-test_-_Lambda.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/d6352b0a-6559-1cd0-ced2-f1c2f4f65057.png

1. ちなみに[AWS VPCエンドポイントを作成する](https://qiita.com/miriwo/items/c1606a4292e108425d77)を実施せず（VPCエンドポイントを作成せず）にデフォルトのセキュリティグループを設定するとSecrets ManagerからのレスポンスがセキュリティグループのインバウンドルールでHTTPSが許可されていないためタイムアウトとなる。

# 参考文献

[https://confrage.jp/vpc-lambda%E3%81%8B%E3%82%89vpc%E3%82%A8%E3%83%B3%E3%83%89%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88%E7%B5%8C%E7%94%B1%E3%81%A7secrets-manager%E3%81%AB%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%99%E3%82%8B/](https://confrage.jp/vpc-lambda%E3%81%8B%E3%82%89vpc%E3%82%A8%E3%83%B3%E3%83%89%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88%E7%B5%8C%E7%94%B1%E3%81%A7secrets-manager%E3%81%AB%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%99%E3%82%8B/)