工作と競馬2

電子工作、プログラミング、木工といった工作の記録記事、競馬に関する考察記事を掲載するブログ

boto3でLambda関数を呼び出すinvokeメソッドの引数ClientContextを使い方を確認

概要


boto3でLambda.client.invokeの引数ClientContextを使い方を確認してメモした。



背景と目的


boto3でLambdaを呼び出す際、呼び出し先関数へ渡すペイロードの仕様を変えずに、追加でパラメータを与えたいと思ってboto3のドキュメントを調べたら、invokeの引数ClientContextというものが使えそうだった

boto3.amazonaws.com

なので、使い方を調べてメモする。


詳細


呼び出し側

こちらが参考になった。必要なところだけかいつまんで書く。

  • 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を使い方を確認してメモした。