AWS Lambdaで、他の関数を呼び出したいケースもままあるかと思います。
今回は実際に呼び出し設定をしてみましたので、備忘録としてサクッとした手順を残しておきます。
なお、タイトルにある通り、処理はPythonで記述していますのであしからず。
事前設定: 実行ロールの修正
呼び出す側のLambda関数に紐づいている実行ロールに、呼び出し先をInvokeできる権限を付与します。
内容としては以下のとおり。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"lambda:InvokeFunction"
],
"Resource": "呼び出し先関数のarn"
}
]
}
管理コンソールからポリシーをアタッチする場合は”AWSLambdaRole”とかが該当するかと思います。(ただしResourceが”*”となっているので、強すぎる権限かもしれません。細かいことは割愛します。)
呼び出し先の関数作成
こちらは呼び出されてからどうしたいかなので、任意にコーディングしていく形になります。
私の場合は呼び出し元から値をもらって処理したかったので、evnet.bodyの値を取って処理する実装をしています。値の渡し方は後述します。
呼び出し元の関数作成
細かいことはともかく、お試しでサンプルコードを作ったので参考にしてください。
import json, boto3
def invokeLambdaFunction():
response = boto3.client('lambda').invoke(
FunctionName = 'sample_hello_world', # 呼び出し先関数名
InvocationType = 'RequestResponse', # 同期呼び出し
Payload = json.dumps({"key": "value"}) # eventに任意の値を引き渡す
)
print(response)
def lambda_handler(event, context):
invokeLambdaFunction()
return {
'statusCode': 200,
'body': json.dumps('Hello from Lambda!')
}
実行してみた
実行してみると、同期呼び出しが行われ、いずれの処理も実行されました。
呼び出し先関数のlambda_handler(最初に呼ばれるやつ)に渡されたeventはPayloadで渡した値がそのまま入っており、今回は辞書としてevnet["key"]
で値がとれました。
呼び出し元のInvocationTypeってなんぞ
今回は必要最低限の内容で呼び出しましたが、「InvocationTypeってなんだ?」となりましたので、ちょっとだけしらべました。
これは名前のとおりですが呼び出し方を指定しているもので、
- RequestResponse(デフォルト): 同期呼び出し
- Event: 非同期呼び出し
- DryRun: パラメーター値の検証
という呼び出し方があるらしい。詳細はAWSのデベロッパーガイドを見てください。
実行ロール設定ができていないときのエラー
参考までに一応実行ロールの設定ができていなかった際のエラーを記載しておきます。
[ERROR] ClientError: An error occurred (AccessDeniedException) when calling the Invoke operation: User: [arn情報] because no identity-based policy allows the lambda:InvokeFunction action