構成
呼び出し先の設定
コードは適当です。
def lambda_handler(event, context):
test = "呼ばれたよ!"
return test
Lambdaからの呼び出しを許可するためのアクセス許可を付与します。
同一アカウント同一リージョン間でのLambda呼び出しでは必要ありませんが、異なるリージョン間で呼び出す場合は必要になるようです。
異なるアカウント間でLambdaを呼び出したことはありませんが、おそらく今回のようにアクセス許可を付与する必要があると思います。
ただしこのポリシーは全てのアカウントからLambdaを使用できてしまうので、ソースアカウントを指定したポリシーを使用した方がいいでしょう。
{
"Version": "2012-10-17",
"Id": "default",
"Statement": [
{
"Sid": "lambda",
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com"
},
"Action": "lambda:InvokeFunction",
"Resource": "arn:aws:lambda:us-east-1:${AWS::AccountId}:function:test-hia"
}
]
}
コンソールからは設定できないので、CLIで設定しました。
言っていませんでしたが、東京リージョンからバージニア北部リージョンのLambdaを呼び出しています。
aws lambda add-permission --function-name ${FUNCTION_NAME}\
--action lambda:InvokeFunction --principal lambda.amazonaws.com\
--statement-id lambda --profile $PROFILE --region us-east-1
呼び出し元の設定
import json
import boto3
import os
def lambda_handler(event, context):
payload = json.dumps(event).encode()
client = boto3.client("lambda", "us-east-1")
response = client.invoke(
FunctionName = os.environ.get("FUNCTION_ARN"),
InvocationType = "RequestResponse",
Payload = payload
)
return json.loads(response["Payload"].read())
Invoke
のPayload
は <class 'bytes'>, <class 'bytearray'>, file-like object
のいずれかである必要があるそうです。
json.dumps
でJSON形式のsrt
オブジェクトにして、encode()
でバイト型に変換しています。
str
のままでもエラーは発生しませんが、バイト型が推奨されているようなのでバイト型を使用します。
https://github.com/boto/boto3/issues/1543#issuecomment-384813230
response["Payload"]
は<class 'botocore.response.StreamingBody'>
であり、read()
でバイナリ文字列を取得しています。
json.loads()
はそのバイナリ文字列(bytes型)をPythonオブジェクトにデシリアライズします。
結果的に、呼び出し先の呼ばれたよ!
がreturn
で戻ってきます。
実行ロールにはデフォルトでアタッチされるポリシーの他に、Lambdaを呼び出すアクションを許可するポリシーを作成してアタッチします。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "lambda:InvokeFunction",
"Resource": "arn:aws:lambda:*:${呼び出し先のLambdaアカウント}:function:*"
}
]
}