AWS Lambdaで他の関数を呼び出す(Python)

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のデベロッパーガイドを見てください。

AWS Lambda – Invoke

実行ロール設定ができていないときのエラー

参考までに一応実行ロールの設定ができていなかった際のエラーを記載しておきます。

[ERROR] ClientError: An error occurred (AccessDeniedException) when calling the Invoke operation: User: [arn情報] because no identity-based policy allows the lambda:InvokeFunction action

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

都内Edtech企業のコーポレートエンジニア。
業務改善・自動化についての開発をしています。
エンジニア歴9年、コーポレートエンジニア歴4年。

目次