概要
- デフォルトVPC内のサブネットに設置したlambdaからSecrete ManagerのAPIキーを取得する方法をまとめる。
前提
- 下記の内容が完了していること。
方法
lambdaの作成
-
任意のランタイムでlambda関数を作成する。(筆者はNode.js18で作成する)
-
下記の内容を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; };
-
「レイヤーの追加」から「AWSレイヤー」で「AWS-Parameters-and-Secrets-Lambda-Extension」を選択し、設定する。(記事記載時のレイヤーバージョンは4)
-
「設定」から「アクセス権限」を開き、lambdaに紐づいているロールの詳細を開く。
-
「許可を追加」から「ポリシーをアタッチ」を開き「SecretsManagerReadWrite」を付与する。
-
「許可を追加」から「ポリシーをアタッチ」を開き「AWSLambdaVPCAccessExecutionRole」を付与する。
-
一旦この状態でlambdaのHello worldテストを定義後、実行し、下記のように問題なくシークレットマネージャーの値を取得できていることを確認する。
VPC系情報をlambdaに記載
-
「設定」から「VPC」を開き「編集」をクリックする。
-
下記のように設定する。
- VPC:デフォルトVPCを選択
- サブネット:デフォルトサブネットのnp-northeast-1aのサブネットを選択
- セキュリティグループ:AWS VPCエンドポイントを作成するで作成したセキュリティグループを設定する。
-
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
-
ちなみにAWS VPCエンドポイントを作成するを実施せず(VPCエンドポイントを作成せず)にデフォルトのセキュリティグループを設定するとSecrets ManagerからのレスポンスがセキュリティグループのインバウンドルールでHTTPSが許可されていないためタイムアウトとなる。