Lambda から Secrets Manager のシークレットを取得する方法 ── ソースコードにパスワードを書かない
記事の「実践」を 1 項目ずつ進めるためのページです。AWS マネジメントコンソールで操作したら、右の一覧にチェックを入れてください。チェックはこのブラウザに保存されます。
前提条件
- リージョン:
ap-northeast-1(東京) - 以下のリソースが作成済みであること
まだ用意していない場合は、「作り方の参考」の記事の手順で作れます。リソース名は、この記事の名前に読み替えてください。
| リソース種別 | リソース名 | 内容 | 作り方の参考 |
|---|---|---|---|
| Lambda 関数 | dva-secret-lab-fn | Python 3.13。環境変数 SECRET_ID = dva-lab/db-credentials。上の「アプリケーションからの取得」と同じ処理で、取得したシークレットからユーザー名・ホスト名・パスワードの文字数を返す | AWS Lambda で関数を作成しイベント駆動で実行する |
| IAM ロール | dva-secret-lab-role | 上の関数の実行ロール。CloudWatch Logs への出力(AWSLambdaBasicExecutionRole)だけを許可 | ― |
作成するリソース一覧
| リソース種別 | リソース名 | 用途 |
|---|---|---|
| シークレット | dva-lab/db-credentials | データベースの認証情報(ハンズオン用のダミー) |
| インラインポリシー | dva-secret-lab-get-secret | 実行ロールにシークレットの取得を許可する |
手順 1: シークレットを作る
AWS マネジメントコンソールにログインし、リージョンが ap-northeast-1(東京)であることを確認します。上部の検索バーに Secrets Manager と入力し、「Secrets Manager」を選択します。
「新しいシークレットを保存する」をクリックし、以下を設定します。
- シークレットのタイプ: 「その他のシークレットのタイプ」
- キー/値のペア: 「行を追加」で次の 4 行を入力
username:app_userpassword:Handson-Passw0rd-2026(ハンズオン用のダミー)host:db.example.internalport:3306
- 暗号化キー:
aws/secretsmanager(デフォルト)
「次」をクリックし、シークレットの名前に dva-lab/db-credentials と入力して「次」をクリックします。ローテーションの設定はデフォルト(無効)のまま「次」をクリックし、レビュー画面で「保存」をクリックします。
手順 2: 権限が無い状態で関数を呼び出す
上部の検索バーに Lambda と入力し、「Lambda」を選択します。関数の一覧から dva-secret-lab-fn を開き、「テスト」タブを選択します。イベント名に empty と入力し、イベント JSON は {} のまま「テスト」をクリックします。
実行結果は「実行中の関数: 失敗」になります。その下の「詳細」を開くと、Response の errorMessage に AccessDeniedException と、実行ロール dva-secret-lab-role が secretsmanager:GetSecretValue を実行する権限を持っていない旨が表示されます。
手順 3: 実行ロールに取得の権限を足す
関数の画面の「設定」タブ →「アクセス権限」を選択し、「実行ロール」のロール名 dva-secret-lab-role をクリックします。IAM コンソールでロールが開きます。
「許可を追加」→「インラインポリシーを作成」を選択します。ポリシーエディタで「JSON」を選び、次のポリシーを入力します。Resource は、手順 1 で作ったシークレットの ARN(Secrets Manager のシークレットの詳細画面で確認できます)に置き換えます。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "secretsmanager:GetSecretValue",
"Resource": "arn:aws:secretsmanager:ap-northeast-1:<アカウントID>:secret:dva-lab/db-credentials-XXXXXX"
}
]
}
「次へ」をクリックし、ポリシー名に dva-secret-lab-get-secret と入力して「ポリシーの作成」をクリックします。ロールの「許可ポリシー」に dva-secret-lab-get-secret が追加されたことを確認します。
手順 4: もう一度呼び出す
Lambda コンソールに戻り、dva-secret-lab-fn の「テスト」タブで、もう一度「テスト」をクリックします。今度は成功し、username に app_user、host に db.example.internal、password_length にパスワードの文字数、version_id に取得したシークレットのバージョン ID が返ります(結果は「詳細」を開くと見られます)。
関数のコードと環境変数には、パスワードはどこにも書かれていません。関数は実行のたびに、Secrets Manager から値を取りに行っています。
手順 5: ローテーションの設定画面を確かめる
Secrets Manager のコンソールで dva-lab/db-credentials を開き、「ローテーション」タブを選択して「ローテーションを編集」をクリックします。「ローテーション設定を編集する」ダイアログが開き、「自動ローテーション」をオンにすると、ローテーションのスケジュールと、ローテーションを行う Lambda 関数を指定する欄が表示されます。今回のシークレットは「その他のシークレットのタイプ」なので、パスワードを変える処理(Lambda 関数)を自分で用意する必要があります。RDS などのデータベースのタイプを選んだシークレットでは、AWS が用意したローテーションの仕組みを使えます。
ここでは設定を保存せずに「Cancel」をクリックします。RDS の認証情報を実際にローテーションする流れは、Secrets ManagerによるECSコンテナの認証情報管理と自動ローテーション で扱っています。