0
0

More than 3 years have passed since last update.

Lambdaから同一アカウントの異なるリージョンのLambdaを呼び出す

Last updated at Posted at 2021-02-16

構成

Lambda.png

呼び出し先の設定

 コードは適当です。

呼び出し先

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())

 InvokePayload<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で戻ってきます。

スクリーンショット 2021-02-16 23.30.08.png

 実行ロールにはデフォルトでアタッチされるポリシーの他に、Lambdaを呼び出すアクションを許可するポリシーを作成してアタッチします。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "lambda:InvokeFunction",
            "Resource": "arn:aws:lambda:*:${呼び出し先のLambdaアカウント}:function:*"
        }
    ]
}
0
0
0

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
0
0