【AWS】Lamdba関数からSecrets Managerの値を取得する【Python】

この記事では
 ・Lamdba関数からSecrets Managerの値を取得
する手順を紹介します!

手順は
 ・Secrets Managerのシークレットの作成
 ・IAMポリシーの作成
 ・IAMロールの作成
 ・Lambda関数の作成
となります!

※今回は、Lambda関数はPythonで作成します。

Secrets Managerのシークレットの作成

Secrets Managerのページを開いて「新しいシークレットを保存する」をクリックして、画面に従ってパラメータを作成します。

今回は以下で作成します。

項目名設定値
シークレットのタイプその他のシークレットのタイプ
キーkey1
password56789
シークレットの名前sample-key
シークレット「sample-key」を作成した
シークレット「sample-key」を作成した
キーを「key1」、値を「password56789」にした
キーを「key1」、値を「password56789」にした

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": "*"
        }
    ]
}

拡張性を考えて、Resourceは「*」としています。
※今回作成したSecrets Managerのシークレット「sample-key」以外も取得できるようにしています。

IAMロールの作成

以下をアタッチしたIAMロールを作成します。

ポリシー名説明
get-key-secrets-manager-string-text上記で作成したIAMポリシー
AWSLambdaBasicExecutionRoleCloudWatch Logsへの書き込み権限を持つポリシー


今回は「get-key-secrets-manager-Role」という名前で作成します。

IAMロール「get-key-secrets-manager-Role」を作成した
IAMロール「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しか選択できない
レイヤー「AWS-Parameters-and-Secrets-Lambda-Extension」の追加
レイヤー「AWS-Parameters-and-Secrets-Lambda-Extension」の追加


手順

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"])

今回作成したSecrets Managerのシークレットの名前「sample-key」を指定します(7行目)。

キー「key1」に設定されている値(=password56789)を取得して、CloudWatch Logsへ出力します(18行目)。

Secrets Managerから帰ってくるJSONの詳細は以下となります。

{
	"ARN": "arn:aws:secretsmanager:ap-northeast-1:031752030502:secret:sample-key-lXNrh6", 
	"CreatedDate": "2024-02-24T13:00:49.912Z", 
	"Name": "sample-key", 
	"SecretBinary": None, 
	"SecretString": 
		{
			"key1":"password56789"
		}, 
	"VersionId": "b433db01-bac9-414d-bdd3-1b184e1d5456", 
	"VersionStages": ["AWSCURRENT"],
	"ResultMetadata": 
		{
		}
}


●サードパーティのライブラリ「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"])

Lambda関数でサードパーティのライブラリを使用するには、当該ライブラリをレイヤーに追加する必要があります。
レイヤーの詳細は以下の記事をご確認ください。

実行結果

Lamdba関数からSecrets Managerの値を取得できました。

実行結果①
実行結果①


CloudWatch Logsでも、問題無く実行できたことを確認できます。

実行結果②
実行結果②

参考①

上記に記載したAWSレイヤー「AWS-Parameters-and-Secrets-Lambda-Extension」を使用してSecrets Managerの値を取得すると、値が一定期間キャッシュされます。
キャッシュされることでコスト削減が期待できます。

Pythonライブラリ「boto3」を使用してもSecrets Managerの値を取得できますが、こちらはキャッシュされません。
※そのため上記のAWSレイヤーを使用したほうが良いです。

参考②

Lamdba関数からSecrets Managerの値を取得する手順の詳細は、公式サイトをご確認ください。

タイトルとURLをコピーしました