概要
boto3でLambda.client.invokeの引数ClientContextを使い方を確認してメモした。
背景と目的
boto3でLambdaを呼び出す際、呼び出し先関数へ渡すペイロードの仕様を変えずに、追加でパラメータを与えたいと思ってboto3のドキュメントを調べたら、invokeの引数ClientContextというものが使えそうだった
なので、使い方を調べてメモする。
詳細
呼び出し側
こちらが参考になった。必要なところだけかいつまんで書く。
- custom、envというキーを持つJSON化可能な辞書を用意
- それぞれのキーの値には任意のデータ(あくまでJSON化可能)
- 辞書をJSON文字列化、バイト列化、base64エンコード、文字列に戻す
- invokeの引数に渡す
という感じ。例えば、以下。
import boto3 import json import base64 Lambda = boto3.client("lambda") # JSON化可能なデータ ctx = { "custom": { "param1": "value1" }, "env": "env_value" } # JSON文字列化とバイト列化 b = json.dumps(ctx).encode("utf-8") # base64化して文字列に戻す ClientContext = base64.b64encode(b).decode("utf-8") # 引数に渡して呼び出し resp = Lambda.invoke( FunctionName=FunctionName, Payload=json.dumps(Payload), ClientContext=ClientContext )
呼び出される側
呼び出される側は、引数contextから取り出す。client_contextプロパティの下に、custom、envがそれぞれついている。customは、辞書を入れたので辞書、envは文字列を入れたので文字列と、与えたものがそのまま出てくる。
def lambda_handler(event, context): print(context.client_context.custom) print(context.client_context.env)
ペイロードの仕様を変えず、contextを使って追加のデータを送ることができた。
まとめと今後の課題
boto3でLambda.client.invokeメソッドの引数ClientContextを使い方を確認してメモした。