この記事では
・Lamdba関数からSecrets Managerの値を取得
する手順を紹介します!
手順は
・Secrets Managerのシークレットの作成
・IAMポリシーの作成
・IAMロールの作成
・Lambda関数の作成
となります!
※今回は、Lambda関数はPythonで作成します。
Secrets Managerのシークレットの作成
Secrets Managerのページを開いて「新しいシークレットを保存する」をクリックして、画面に従ってパラメータを作成します。
今回は以下で作成します。
項目名 | 設定値 |
---|---|
シークレットのタイプ | その他のシークレットのタイプ |
キー | key1 |
値 | password56789 |
シークレットの名前 | sample-key |
IAMポリシーの作成
Lamdba関数がSecrets Managerから値を取得できるように、「Secrets Manager」のアクション「GetSecretValue」を許可する権限を持つIAMポリシーを作成します。
今回は「get-key-secrets-manager-string-text」という名前で作成します。
当該アクションの許可を持つJSONは以下となります。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "secretsmanager:GetSecretValue",
"Resource": "*"
}
]
}
IAMロールの作成
以下をアタッチしたIAMロールを作成します。
ポリシー名 | 説明 |
---|---|
get-key-secrets-manager-string-text | 上記で作成したIAMポリシー |
AWSLambdaBasicExecutionRole | CloudWatch Logsへの書き込み権限を持つポリシー |
今回は「get-key-secrets-manager-Role」という名前で作成します。
Lambda関数の作成
Lambda関数のページを開いて「関数の作成」をクリックして、以下を入力/選択してLambda関数を作成します。
項目名 | 入力/選択 |
---|---|
関数名 | 任意の名前 ※get-key-secrets-manager-funcなど |
ランタイム | Python 3.12 |
ロール | get-key-secrets-manager-Role ※上記で作成したIAMロール |
下部の「レイヤーの追加」をクリックして、以下を選択して「追加」をクリックする。
項目名 | 入力/選択 |
---|---|
AWSレイヤー | AWS-Parameters-and-Secrets-Lambda-Extension |
バージョン | 11 ※2024/2/24時点では11しか選択できない |
Lambda関数のコードとして以下を記載します。
※以下のどちらかのコードを記載します。
・標準ライブラリ「urllib」を使用する方法
・サードパーティのライブラリ「requests」を使用する方法
●標準ライブラリ「urllib」を使用する方法
import os
import urllib.request
import ast
import json
aws_session_token = os.environ.get("AWS_SESSION_TOKEN")
secret_id = "sample-key"
def lambda_handler(event, context):
req = urllib.request.Request("http://localhost:2773/secretsmanager/get?secretId={}".format(secret_id))
req.add_header("X-Aws-Parameters-Secrets-Token", aws_session_token)
config = urllib.request.urlopen(req).read()
secret_data = json.loads(config)["SecretString"]
secret = ast.literal_eval(secret_data)
print("key1の値 = " + secret["key1"])
●サードパーティのライブラリ「requests」を使用する方法
import os
import requests
import ast
import json
headers = {"X-Aws-Parameters-Secrets-Token": os.environ.get("AWS_SESSION_TOKEN")}
secret_id = "sample-key"
def lambda_handler(event, context):
secrets_extension_endpoint = "http://localhost:2773/secretsmanager/get?secretId={}".format(secret_id)
r = requests.get(secrets_extension_endpoint, headers=headers)
secret_data = json.loads(r.text)["SecretString"]
secret = ast.literal_eval(secret_data)
print("key1の値 = " + secret["key1"])
実行結果
Lamdba関数からSecrets Managerの値を取得できました。
CloudWatch Logsでも、問題無く実行できたことを確認できます。
参考①
上記に記載したAWSレイヤー「AWS-Parameters-and-Secrets-Lambda-Extension」を使用してSecrets Managerの値を取得すると、値が一定期間キャッシュされます。
キャッシュされることでコスト削減が期待できます。
参考②
Lamdba関数からSecrets Managerの値を取得する手順の詳細は、公式サイトをご確認ください。