Lambdaから別Lambdaを実行するのはアンチパターンにも載っている方法ですが、やってみたので書いておきます。
呼び出し元
FooのdataclassをいくつかリストにしてPickle形式にシリアライズして送信先のLambdaに送信しています。
返り値もPickleで返ってくるので読み込んでプリントします。
import json
import pickle
from typing import List
from dataclasses import dataclass
from datetime import datetime
from base64 import b85decode, b85encode
import boto3
@dataclass
class Foo:
i: int
d: datetime
def lambda_handler(event, context):
foo_list: List[Foo] = [Foo(i=i, d=datetime.utcnow()) for i in range(10)]
send_data_pickle = pickle.dumps(foo_list)
send_data = b85encode(send_data_pickle).decode("utf-8")
lambda_cli = boto3.client("lambda")
response = lambda_cli.invoke(
FunctionName="lambda_t",
InvocationType="RequestResponse",
Payload=json.dumps({"data": send_data}),
)
response_payload = response["Payload"].read()
response_data_base85 = json.loads(response_payload)["data"]
response_data = b85decode(response_data_base85)
foo_list_with_index = pickle.loads(response_data)
[print(f) for f in foo_list_with_index]
呼び出し先
Fooのdataclassで飛んできたリストにインデックスを付けて返すだけです。
import pickle
from dataclasses import dataclass
from datetime import datetime
from base64 import b85decode, b85encode
@dataclass
class Foo:
i: int
d: datetime
def lambda_handler(event, context):
receive_data_base85 = event["data"]
receive_data = b85decode(receive_data_base85)
foo_list = pickle.loads(receive_data)
foo_list_with_index = [(i, foo) for i, foo in enumerate(foo_list)]
response_data = pickle.dumps(foo_list_with_index)
return {"data": b85encode(response_data).decode("utf-8")}
実行結果
送信元Lambdaを実行すると、送信元Lambdaで作成したFooクラスのリストに、送信先でインデックスが付けられたものが表示されます。
(0, Foo(i=0, d=datetime.datetime(2022, 1, 29, 7, 41, 52, 734783)))
(1, Foo(i=1, d=datetime.datetime(2022, 1, 29, 7, 41, 52, 734787)))
(2, Foo(i=2, d=datetime.datetime(2022, 1, 29, 7, 41, 52, 734789)))
(3, Foo(i=3, d=datetime.datetime(2022, 1, 29, 7, 41, 52, 734789)))
(4, Foo(i=4, d=datetime.datetime(2022, 1, 29, 7, 41, 52, 734790)))
(5, Foo(i=5, d=datetime.datetime(2022, 1, 29, 7, 41, 52, 734792)))
(6, Foo(i=6, d=datetime.datetime(2022, 1, 29, 7, 41, 52, 734792)))
(7, Foo(i=7, d=datetime.datetime(2022, 1, 29, 7, 41, 52, 734793)))
(8, Foo(i=8, d=datetime.datetime(2022, 1, 29, 7, 41, 52, 734794)))
(9, Foo(i=9, d=datetime.datetime(2022, 1, 29, 7, 41, 52, 734795)))