AWS Secrets Manager APIキーをlambda関数（Node.js18）で呼び出す

# 概要

- Secrets Managerに登録した値をlambda関数（ランタイムはNode.js18）で呼び出す方法を簡単にまとめる。

# 前提

- 
- 下記か下記に準ずる方法でSecrets Managerに値を登録してあること。

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

# 方法

1. ランタイムがNode.js18のlambda関数を作成する。
1. 関数の概要の「Layers」をクリックする。

    ![getSeacretManagerApiKey_-_Lambda.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/fed05405-13cf-68be-49a1-0414f56c50a7.png)

1. 「レイヤーの追加」をクリックする。

    ![getSeacretManagerApiKey_-_Lambda.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/c8f7494c-adc2-e8f8-325e-ddf2709b9e0a.png)

1. 「レイヤーソース」で「AWSレイヤー」を選択し、プルダウンで「AWS-Parameters-and-Secrets-Lambda-Extension」を選択し、バージョン4を選択し、「追加」をクリックする。

    ![レイヤーを追加_-_Lambda.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/c280c5c9-bd51-8404-49de-c16203e3cec5.png)

1. 関数の「設定」を開き「アクセス権限」の実行ロールの名をクリックする。

    ![getSeacretManagerApiKey_-_Lambda.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/029ae238-4f12-bf93-eb05-abf56856ba45.png)

1. 「許可を追加」をクリックし、「ポリシーをアタッチ」をクリックする。

    ![IAM_Management_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/a9d300f8-2583-faa8-43e8-6675c4e6d832.png)

1. `SecretsManagerReadWrite`と入力しポリシーをフィルターする。
1. ヒットした`SecretsManagerReadWrite`を選択し「許可を追加」をクリックする。

    ![IAM_Management_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/3c5ff7b1-9de6-1958-588f-e322dfe1ec12.png)

1. これでlambda関数のロールにシークレットマネージャーの値を読み書きするポリシーを付与できた。（読み込むだけなら自分でインラインポリシーをjsonで追加してロールに付与する。）

    ![IAM_Management_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/6426719e-c979-2bfb-438a-75183527afd6.png)

1. 下記の内容をlambda関数に記載し、保存 → Deployを実行する。Hello-Wold系のlambdaテストを用意し実行する。（下記のコードは「AWS Secrets Manager」 → 「シークレット」 → 「シークレットの名前のAPI-KEY」 → サンプルコードの「JavaScript」の部分を大いに参考にして記載）

    ```index.mjs
    // 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. lambdaのテストを実行すると定数`secret`の中に下記の値が入っている事が分かる。これでlambdaでシークレットの値を取得する事ができた。

    ```json
    {
        "API-KEY":"hogefuga"
    }
    ```

# 参考文献

https://docs.aws.amazon.com/ja_jp/secretsmanager/latest/userguide/retrieving-secrets_lambda.html