はじめに
こんにちは、技術一課の山中です。 冬は好きではないですが、夏は嫌いです。
さて、 Amazon API Gateway + AWS Lambda で REST API を構築することは多々あるとおもいますが、 Lambda プロキシ統合をセットアップした際に、 AWS Lambda からどのような形式でレスポンスを組み立て返せばいいのか、忘れてしまうことはありませんか?
API Gateway の Lambda プロキシ統合をセットアップする
少なくとも私は覚えることができないので、いっつも調べています。 というわけで、自分自身の備忘録がてらここに残しておくことにします。
Lambda 関数のレスポンス形式
プロキシ統合のための Lambda 関数の出力形式 には、以下のように記載があります。
{ "isBase64Encoded": true|false, "statusCode": httpStatusCode, "headers": { "headerName": "headerValue", ... }, "multiValueHeaders": { "headerName": ["headerValue", "headerValue2", ...], ... }, "body": "..." }
この中で、 statusCode
が必須なので、 Python で正常レスポンスを返すだけであれば、 Lambda 関数の中身は以下のように書けば良さそうです。
def lambda_handler(event, context): return { 'statusCode': 200, }
もし body
を加える場合はこのようになります。
import json def lambda_handler(event, context): return { 'statusCode': 200, 'body': json.dumps('Hello from Lambda!') }
Amazon API Gateway から呼んでみる
Amazon API Gateway + AWS Lambda の構成で実際に呼んでみます。 まずは、 Lambda 関数に以下をデプロイし実行します。
return { 'statusCode': 200, }
レスポンス結果は以下のとおりです。
$ curl -I https://xxxxxxxx.execute-api.us-east-2.amazonaws.com/default/apigw-sample HTTP/2 200 date: Fri, 07 Feb 2020 00:49:48 GMT content-type: application/json content-length: 0 x-amzn-requestid: HgEW9i8QIAMEAAQ=
ためしに、 statusCode
を 404 に変更してみます。
return { 'statusCode': 404, }
レスポンス結果は以下のとおりです。
$ curl -I https://xxxxxxxx.execute-api.us-east-2.amazonaws.com/default/apigw-sample HTTP/2 404 date: Fri, 07 Feb 2020 00:52:33 GMT content-type: application/json content-length: 0 x-amzn-requestid: HgEwvjJ7IAMEAAQ=
当然 500 に変更しても同様の結果が得られます。
$ curl -I https://xxxxxxxx.execute-api.us-east-2.amazonaws.com/default/apigw-sample HTTP/2 500 date: Fri, 07 Feb 2020 00:53:20 GMT content-type: application/json content-length: 0 x-amzn-requestid: HgE3_jNvIAMEAAQ=
body
を加えた場合のレスポンスは
def lambda_handler(event, context): return { 'statusCode': 200, 'body': json.dumps('Hello from Lambda!') }
以下のとおりです。
$ curl https://xxxxxxxx.execute-api.us-east-2.amazonaws.com/default/apigw-sample "Hello from Lambda!"
最後に
Amazon API Gateway + AWS Lambda で作成する REST API で Lambda 関数のテストをしたいけど、レスポンスどうすればいいんだっけ?と考える時間がもったいないので、そんなときはこの備忘録を見ていこうと思います。