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

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

手順は
 ・Paramter Storeのパラメータの作成
 ・IAMポリシーの作成
 ・IAMロールの作成
 ・Lambda関数の作成
となります!

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

Paramter Storeのパラメータの作成

Paramter Storeのページを開いて「パラメータの作成」をクリックして、画面に従ってパラメータを作成します。

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

項目設定値
名前sample-password
タイプ文字列
データ型text
password12345

上記の通り、今回は「タイプ」を「文字列」しています。「安全な文字列」ではなくて。
※つまりKMS」は使用しません。

パラメータ「sample-password」を作成した
パラメータ「sample-password」を作成した
値を「password12345」にした
値を「password12345」にした

IAMポリシーの作成

Lamdba関数がParamter Storeから値を取得できるように、「Systems Manager」のアクション「GetParameter」を許可する権限を持つIAMポリシーを作成します。

今回は「get-key-parameterstore-string-text」という名前で作成します。
当該アクションの許可を持つJSONは以下となります。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "ssm:GetParameter",
            "Resource": "*"
        }
    ]
}

拡張性を考えて、Resourceは「*」としています。
※今回作成したParamter Storeのパラメータ「sample-password」以外も取得できるようにしています。

今回は「KMS」を使用しないため、「KMS」のアクション「Decrypt」は不要とします。

IAMロールの作成

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

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

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

IAMロール「get-key-parameterstore-Role」を作成した
IAMロール「get-key-parameterstore-Role」を作成した

Lambda関数の作成

手順

Lambda関数のページを開いて「関数の作成」をクリックして、以下を入力/選択してLambda関数を作成します。

項目名入力/選択
関数名任意の名前
※get-key-parameterstore-funcなど
ランタイムPython 3.12
ロールget-key-parameterstore-Role
※上記で作成したIAMロール


手順

下部の「レイヤーの追加」をクリックして、以下を選択して「追加」をクリックする。

項目名入力/選択
AWSレイヤーAWS-Parameters-and-Secrets-Lambda-Extension
バージョン11 ※2024/2/24時点では11しか選択できない
レイヤー「AWS-Parameters-and-Secrets-Lambda-Extension」の追加


手順

Lambda関数のコードとして以下を記載します。
※以下のどちらかのコードを記載します。
・標準ライブラリ「urllib」を使用する方法
・サードパーティのライブラリ「requests」を使用する方法

●標準ライブラリ「urllib」を使用する方法

import urllib.request
import os
import json

aws_session_token = os.environ.get("AWS_SESSION_TOKEN")
key_name = "sample-password"

def lambda_handler(event, context):
    req = urllib.request.Request("http://localhost:2773/systemsmanager/parameters/get/?name={}".format(key_name))
    req.add_header("X-Aws-Parameters-Secrets-Token", aws_session_token)
    config = urllib.request.urlopen(req).read()
    
    print("パスワード = " + json.loads(config)["Parameter"]["Value"])

今回作成したParamter Storeのパラメータ「sample-password」を指定します(6行目)。

パラメータに設定されている値(=password12345)を取得して、CloudWatch Logsへ出力します(13行目)。

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

{
	"Parameter": 
		{
		 	"ARN": "arn:aws:ssm:ap-northeast-1:031752030502:parameter/sample-password", 
		 	"DataType": "text", 
		 	"LastModifiedDate": "2024-02-24T00:10:25.539Z", 
		 	"Name": "sample-password", 
		 	"Selector": None, 
		 	"SourceResult": None, 
		 	"Type": "String", 
		 	"Value": "password12345", 
		 	"Version": 1
		 },
	 "ResultMetadata": 
	 	{
	 	}
}


●サードパーティのライブラリ「requests」を使用する方法

import requests
import os
import json

headers = {"X-Aws-Parameters-Secrets-Token": os.environ.get("AWS_SESSION_TOKEN")}
key_name = "sample-password"

def lambda_handler(event, context):
    endpoint = "http://localhost:2773/systemsmanager/parameters/get/?name={}".format(key_name)
    r = requests.get(endpoint, headers=headers)
    
    print("パスワード = " + r.json()["Parameter"]["Value"])

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

実行結果

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

実行結果①
実行結果①


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

実行結果②
実行結果②

参考①

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

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

参考②

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

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