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

山中 大志(記事一覧)

アプリケーションサービス部

ビールと味噌カツをこよなく愛するエンジニアです。

AWSをみなさんにより使っていただけるような情報を発信していきたいと考えてます。