はじめに
本記事ではLambdaから別のLambdaを同期的に呼び出す方法について備忘録も兼ねてまとめたものになります。
環境
- python: 3.12
関数を呼び出す側のLambda
Lambda > 関数 > 関数の作成から呼び出す側のLambdaを作成します。
今回は名前をcall_lambda
としています。
別のLambda関数を呼び出すのにデフォルトのロールだけだと権限が足りないので追加します。
設定タブ > アクセス権限 > ロール名をクリックしIAMに移ります。
IAM側では許可を追加 > インラインポリシーを作成します。
別のLambda関数を呼べるようにポリシーを修正します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"lambda:InvokeFunction"
],
"Resource": [
"*"
]
}
]
}
Lambdaのソース(呼び出す側)
下記のソースで別のLambda関数(今回はcalled_lambda
)を呼び出します。
import boto3
import json
def lambda_handler(event, context):
client = boto3.client('lambda')
item1 = event['item1']
item2 = event['item2']
payload = {'item1':item1, 'item2':item2}
response = client.invoke(
FunctionName='called_lambda',
InvocationType='RequestResponse',
Payload=json.dumps(payload)
)
response_payload = json.loads(response['Payload'].read())
return response_payload
イベントJSON
{
"item1": "apple",
"item2": "banana"
}
InvocationTypeについて
- 同期的に呼び出す場合:RequestResponse
- 非同期の場合:Event
https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/lambda/client/invoke.html
呼び出される側のLambda
Lambda > 関数 > 関数の作成から呼び出される側のLambdaを作成します。
今回は名前をcalled_lambda
としています。
Lambdaのソース(呼び出される側)
この関数(今回はcalled_lambda
)が呼ばれた際には、以下のようにレスポンスを作成します。
import json
def lambda_handler(event, context):
item1 = event.get('item1')
item2 = event.get('item2')
response = f'レスポンス:called_lambda関数に{item1}と{item2} は正常に渡されました'
return response
実行 & 結果確認
関数を呼び出す側のLambda(call_lambda)においてイベントJSONを設定後にテスト実行します。
結果を確認すると、呼び出される側のLambda(called_lambda)で設定した文言が返ってきている事が確認できました。
"レスポンス:called_lambda関数にappleとbanana は正常に渡されました"