[新機能] Amazon API Gateway がクロスアカウントでLambda関数を呼び出し可能になりました

API GatewayでクロスアカウントのLambda関数がインテグレートが可能になりました。API Gatewayを利用するAWSアカウントとは異なるアカウントにデプロイしたLambda関数を呼び出し可能になります。また、同時にクロスアカウントでのLambda Authorizerにも対応しています。
2018.04.03

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、菊池です。

本日紹介する新機能はこちらです。

API GatewayでクロスアカウントのLambda関数がインテグレートが可能になりました。API Gatewayを利用するAWSアカウントとは異なるアカウントにデプロイしたLambda関数を呼び出し可能になります。また、同時にクロスアカウントでのLambda Authorizer(Custom Authorization)にも対応しています。

API Gatewayから異なるアカウントのLambdaを呼び出す

早速やってみました。

アカウントAでLambda関数の作成

まずは、アカウントA側でLambda関数を作成します。

関数を新規作成し、

単純な文字列を返すコードを保存します。

作成できたら、後ほど使う、関数のARNを確認しておきます。(この時点ではトリガーは何も設定されていませんね)

アカウントBでAPI Gatewayの作成

続いて、アカウントB側でAPIを作成します。

メソッドの作成でGETを選択して、Lambda関数を指定します。ここで、先ほど作成したLambda関数のARNを入力します。

保存すると、Lambdaへ権限(ポリシー)を設定するための AWS CLIコマンドが表示されます。

AWS CLIでLambda関数のポリシーを設定

Lambda関数にポリシーを設定するため、アカウントA側でAWS CLIを使って先ほどのコマンドをそのまま実行します。add-permissionコマンドですね。

$ aws lambda add-permission \
    --function-name "arn:aws:lambda:ap-northeast-1:XXXXXXXXXXXX:function:time" \
    --source-arn "arn:aws:execute-api:ap-northeast-1:yyyyyyyyyyyy:zzzzzzzzzz/*/GET/" \
    --principal apigateway.amazonaws.com \
    --statement-id 3a0fbd2e-c7e2-4a54-961a-xxxxxxxxxx \
    --action lambda:InvokeFunction
{
    "Statement": "{\"Sid\":\"3a0fbd2e-c7e2-4a54-961a-xxxxxxxxxx\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"apigateway.amazonaws.com\"},\"Action\":\"lambda:InvokeFunction\",\"Resource\":\"arn:aws:lambda:ap-northeast-1:XXXXXXXXXXXX:function:time\",\"Condition\":{\"ArnLike\":{\"AWS:SourceArn\":\"arn:aws:execute-api:ap-northeast-1:yyyyyyyyyyyy:zzzzzzzzzz/*/GET/\"}}}"
}

動作確認

ポリシーが設定できたら、API Gatewayからテストを実行してみます。200レスポンスで、Lambdaに記述した文字列が返ってきました。

ステージして、ブラウザでアクセスしても確認できます。

この状態で、アカウントA側のLambdaコンソールを確認すると、API Gatewayがトリガーに設定されているのがわかります。ただし、対象のAPI Gatewayは表示されないようです。

まとめ

新機能の、クロスアカウントでのAPI Gateway - Lambdaの連携を紹介しました。

環境ごとにAWSアカウントを分けている場合などでも、柔軟な設定が可能になるアップデートです。