Python3.6でやります。
呼ばれるLambda
まずは呼ばれるLambdaの関数。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
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にして、レスポンス読出しをコメントアウトします。
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をみてみましょう。
yobareru関数のprint文がでています!すごい~
非同期処理も完了です。
覚書注意点
- HTTP ヘッダーは 特殊な形のjson
- 同期処理にしないとreturnは帰ってこない
- 202の文字を見たら、それは成功している証拠。 ステータスコード