如何正確處理 AWS API Gateway 的 Lambda Error Status

翻譯自原文 Error handling in AWS API Gateway with Lambda

這篇文章會介紹如何設置 AWS API Gateway 正確處理 Lambda 返回的 HTTP 錯誤狀態碼。

本文假設讀者已經知道如何利用 AWS API Gateway 和 Lambda 建立 REST API,詳細可參考 Create API Gateway API for Lambda Functions。

假設你的 Lambda function 錯誤處理如下:

console.log('I am a AWS Lambda function');

exports.handler = function(event, context) {
    // 一般使用 context.fail 來返回 Lambda function 錯誤
    context.fail(JSON.stringify({status:'fail', reason:'some reason', foo:'bar'}));
};

但是 API Gateway 返回的結果會是 HTTP 200

HTTP/1.1 200 OK
...

{
    "errorMessage": "{\"status\":\"fail\",\"reason\":\"some reason\",\"foo\":\"bar\"}"
}

我們希望的結果是:

  1. HTTP Status 400 Bad request

  2. 只顯示 errorMessage 的 JSON 值

1. 新增 HTTP Status 400 Method Response

  1. 前往 API Gateway Console

  2. 進入 Method Execution

  3. 進入 Method Response

  4. 點選 Add Response

  5. 輸入 HTTP Status 400

  6. 點選 Add Response Model

  7. 輸入 Content type application/json、Models Error

2. 新增 Lambda Error Regex Integration Response

  1. 進入 Integration Response

  2. 點選 Add integration response

  3. 輸入 Lambda Error Regex .*status.*fail.*、Method response status 400

3. 設置 Mapping Templates

  1. 展開 Mapping Templates

  2. 點選 Add mapping template

  3. 輸入 Content-Type application/json

  4. 點選 Output passthrough 並改成 Mapping Templates

  5. 輸入以下程式碼:

#set($inputRoot = $input.path('$.errorMessage'))
$inputRoot

4. 部署 API

記得點選 Deploy API 完成 API 的更新,然後測試返回結果是否為 HTTP 400

HTTP/1.1 400 Bad Request
...

{
    "foo": "bar",
    "reason": "some reason",
    "status": "fail"
}

你可能感兴趣的:(aws-api-gateway,aws-lambda)