LoginSignup
71
63

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-08-23

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の文字を見たら、それは成功している証拠。 ステータスコード
71
63
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
71
63