Help us understand the problem. What is going on with this article?

AWS LambdaからLambdaを非同期で呼び出す(Python)

Python3.6でやります。

呼ばれるLambda

まずは呼ばれるLambdaの関数。yobareru関数にしました。

yobareru
import json

def lambda_handler(event, context):
    print("呼ばれています")
    return event

非常にシンプルな形です。
これが呼び出される時にeventにはjsonの形で入れますが、そのeventをそのままreturnしています。

呼ぶLambda

関数をテキトーに作っていただき、まずはロールの設定から。

- ロールの設定

画面下部、実行ロールに割り当てられているロールがあると思いますが

それのポリシーのアクセス権限を編集します。

        {
            "Effect": "Allow",
            "Action": [
                "lambda:InvokeFunction"
            ],
            "Resource": "*"
        }

これが入っていないので、いれてください。

- 関数の編集

では関数を編集しましょう。
呼び出すにはinvokeというのを使います。

response = boto3.client('lambda').invoke(
FunctionName='yobareru',
InvocationType='RequestResponse', # Event or RequestResponse
Payload=Payload
)

これをかきます。
client('lambda')は変更しないでください。
変更するところは、FunctionNameです。作った関数名を入れてください。
InvocationTypeは
Event なら非同期
RequestResponse なら同期です。
色々なページでyobareruのデータをダンプするような記述がありますが、yobareruで指定したものをyobuのコンソールでみたい時は、RequestResponseの同期処理にしなければなりません。
Payloadはyobareruに渡すものです。yobareruのeventに入ります。

試しに同期処理のコードを書いてみましょう。

- 同期処理 RequestResponse

yobu(同期ver)
import boto3
import json

def lambda_handler(event, context):

    # 引数
    input_event = {
        "param1": 1,
        "param2": 2,
        "param3": 3
    }

    Payload = json.dumps(input_event) # jsonシリアライズ
    print("---01: Payload:", Payload)


    # 呼び出し
    response = boto3.client('lambda').invoke(
        FunctionName='test0820',
        InvocationType='RequestResponse',
        Payload=Payload
    )
    print("---02: response:", response)


    # レスポンス読出し
    body = json.loads(response['Payload'].read()) #どうやらHTTPヘッダーは特殊な形をしているようで、普通にjson.
    print("---03: body:", body)

    return body

これでyobuの実行をすると、コンソールには

Response:
{
  "param1": 1,
  "param2": 2,
  "param3": 3
}

とでるのでいい感じです。
では非同期処理をしましょう。

- 非同期処理 Event

InvocationTypeをEventにして、レスポンス読出しをコメントアウトします。

yobu(非同期ver)
import boto3
import json

def lambda_handler(event, context):

    # 引数
    input_event = {
        "param1": 1,
        "param2": 2,
        "param3": 3
    }

    Payload = json.dumps(input_event) # jsonシリアライズ
    print("---01: Payload:", Payload)


    # 呼び出し
    response = boto3.client('lambda').invoke(
        FunctionName='test0820',
        InvocationType='Event',
        Payload=Payload
    )
    print("---02: response:", response)


    # レスポンス読出し
    # body = json.loads(response['Payload'].read())
    # print("---03: body:", body)

    # return body

これで実行すると、Responseはnullになりますが、
yobareru側のCloudWatchをみてみましょう。
スクリーンショット 2019-08-23 11.31.46.png

yobareru関数のprint文がでています!すごい~
非同期処理も完了です。

覚書注意点

  • HTTP ヘッダーは 特殊な形のjson
  • 同期処理にしないとreturnは帰ってこない
  • 202の文字を見たら、それは成功している証拠。 ステータスコード
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした