Amazon API Gateway + AWS Lambda でのレスポンス形式

記事タイトルとURLをコピーする

はじめに

こんにちは、技術一課の山中です。 冬は好きではないですが、夏は嫌いです。

さて、 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 関数のテストをしたいけど、レスポンスどうすればいいんだっけ?と考える時間がもったいないので、そんなときはこの備忘録を見ていこうと思います。