LoginSignup
0
0

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

Posted at

手順

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

VPCを作成

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

01.png

Lambdaを作成

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

03.png

Lambdaのロールを編集

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

04.png

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

  • AWSLambdaVPCAccessExecutionRole
  • SecretsManagerReadWrite

06.png

LambdaをVPCに入れる

Lambdaの画面に戻る。

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

08.png

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

07.png

SecretsMangerでシークレット作成

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

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

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

09.png

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

10.png

ローテーションを設定(オプション)

デフォルトのまま。

レビュー

問題無ければ「保存」します。

VPCエンドポイントを作成

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

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

11.png

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

12.png

Lambdaを編集

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

失敗してしまう場合は

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

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0