

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 疑難排解 API Gateway 中的 HTTP API 問題
<a name="http-api-troubleshooting"></a>

下列主題說明當您在使用 HTTP API 時，可如何疑難排解可能遭遇到的錯誤和問題的建議。

**Topics**
+ [對 HTTP API Lambda 整合的問題進行疑難排解](http-api-troubleshooting-lambda.md)
+ [對 HTTP API JWT 授權方的問題進行疑難排解](http-api-troubleshooting-jwt.md)

# 對 HTTP API Lambda 整合的問題進行疑難排解
<a name="http-api-troubleshooting-lambda"></a>

以下建議說明在您將 [AWS Lambda 整合](http-api-develop-integrations-lambda.md) 與 HTTP API 搭配使用時，如何疑難排解可能會遇到的錯誤和問題。

## 問題：具有 Lambda 整合的 API 會傳回 `{"message":"Internal Server Error"}`
<a name="http-api-troubleshooting-lambda-internal-server-error"></a>

若要對內部伺服器錯誤進行疑難排解，請將 `$context.integrationErrorMessage` [記錄變數](http-api-logging-variables.md)新增至您的日誌格式，然後檢視您 HTTP API 的日誌。若要完成此動作，請執行下列操作：

**使用 建立日誌群組 AWS 管理主控台**

1. 在 [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/) 開啟 CloudWatch 主控台。

1. 選擇 **Log groups** (日誌群組)。

1. 選擇 **Create log group** (建立日誌群組)。

1. 輸入日誌群組名稱，然後選擇 **Create** (建立)。

1. 記下日誌群組的 Amazon Resource Name (ARN)。ARN 格式為 arn:aws:logs:*region*: *account-id*:log-group:*log-group-name*。您需要日誌群組 ARN 才能存取 HTTP API 的記錄功能。

**新增 `$context.integrationErrorMessage` 記錄變數**

1. 在以下網址登入 API Gateway 主控台：[https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway)。

1. 選擇 HTTP API。

1. 在 **Monitor** (監控) 下，選擇 **Logging** (記錄)。

1. 選取 API 的階段。

1. 選擇 **Edit** (編輯)，然後存取記錄。

1. 針對 **Log destination** (日誌目的地)，輸入您在上一個步驟中建立之日誌群組的 ARN。

1. 在 **Log format** (日誌格式) 中，選擇 **CLF**。API Gateway 會建立範例日誌格式。

1. 將 `$context.integrationErrorMessage` 新增至日誌格式的結尾。

1. 選擇 **Save** (儲存)。

**檢視 API 的日誌**

1. 產生日誌。使用瀏覽器或 `curl` 來叫用您的 API。

   ```
   $curl https://api-id.execute-api.us-west-2.amazonaws.com/route
   ```

1. 在以下網址登入 API Gateway 主控台：[https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway)。

1. 選擇 HTTP API。

1. 在 **Monitor** (監控) 下，選擇 **Logging** (記錄)。

1. 選取您啟用記錄功能的 API 階段。

1. 選擇 **View logs in CloudWatch** (檢視 CloudWatch 中的日誌)。

1. 選擇最新的日誌串流來檢視 HTTP API 的日誌。

1. 您的日誌項目看起來應與下列類似：  
![\[CloudWatch Logs 日誌項目，顯示來自 Lambda 的整合錯誤訊息。\]](http://docs.aws.amazon.com/zh_tw/apigateway/latest/developerguide/images/troubleshoot-http-api-logs.png)

因為我們已將 `$context.integrationErrorMessage` 新增至日誌格式，所以我們會在摘要問題的日誌中看到錯誤訊息。

您的日誌可能包含不同的錯誤訊息，其中會指出您的 Lambda 函數程式碼發生問題。在這種情況下，請檢查您的 Lambda 函數程式碼，並確認您的 Lambda 函數以[所需的格式](http-api-develop-integrations-lambda.md#http-api-develop-integrations-lambda.response)傳回回應。如果您的日誌未包含錯誤訊息，請將 `$context.error.message` 和 `$context.error.responseType` 新增至您的日誌格式，以取得更多有助於疑難排解的資訊。

在這種情況下，日誌會顯示 API Gateway 沒有叫用 Lambda 函式所需的許可。

當您在 API Gateway 主控台中建立 Lambda 整合時，API Gateway 會自動設定叫用 Lambda 函數的許可。當您使用 AWS CLI CloudFormation或 SDK 建立 Lambda 整合時，您必須授予 API Gateway 調用函數的許可。以下 [add-permission](https://docs.aws.amazon.com/cli/latest/reference/lambda/add-permission.html) 命令會對不同的 HTTP API 路由授予許可，以調用 Lambda 函式。

**Example 範例 – 適用於 HTTP API 的 `$default` 階段和 `$default` 路由**  

```
aws lambda add-permission \
    --function-name my-function \
    --statement-id apigateway-invoke-permissions \
    --action lambda:InvokeFunction \
    --principal apigateway.amazonaws.com \
    --source-arn "arn:aws:execute-api:us-west-2:123456789012:api-id/\$default/\$default"
```

**Example 範例 – 適用於 HTTP API 的 `prod` 階段和 `test` 路由**  

```
aws lambda add-permission \
    --function-name my-function \
    --statement-id apigateway-invoke-permissions \
    --action lambda:InvokeFunction \
    --principal apigateway.amazonaws.com \
    --source-arn "arn:aws:execute-api:us-west-2:123456789012:api-id/prod/*/test"
```

在 Lambda 主控台的 **Permissions** (許可) 索引標籤中，[確認函數政策](https://docs.aws.amazon.com/lambda/latest/dg/access-control-resource-based.html)。

嘗試再次叫用您的 API。您應會看見 Lambda 函數的回應。

# 對 HTTP API JWT 授權方的問題進行疑難排解
<a name="http-api-troubleshooting-jwt"></a>

以下建議說明當您在搭配 HTTP API 使用 JSON Web Token (JWT) 授權方時，如何對可能遇到的錯誤和問題進行疑難排解。

## 問題：我的 API 傳回 `401 {"message":"Unauthorized"}`
<a name="http-api-troubleshooting-jwt.unauthorized"></a>

檢查 API 回應中的 `www-authenticate` 標頭。

下列命令會用 `curl` 來將請求傳送至 API，並使用 JWT 授權方 `$request.header.Authorization` 做為其身分識別來源。

```
$curl -v -H "Authorization: token" https://api-id.execute-api.us-west-2.amazonaws.com/route
```

來自 API 的回應包括一個 `www-authenticate` 標頭。

```
...
< HTTP/1.1 401 Unauthorized
< Date: Wed, 13 May 2020 04:07:30 GMT
< Content-Length: 26
< Connection: keep-alive
< www-authenticate: Bearer scope="" error="invalid_token" error_description="the token does not have a valid audience"
< apigw-requestid: Mc7UVioPPHcEKPA=
<
* Connection #0 to host api-id.execute-api.us-west-2.amazonaws.com left intact
{"message":"Unauthorized"}}
```

在這種情況下，`www-authenticate` 標頭會顯示字符並未發給有效的對象。若 API Gateway 要授權請求，JWT 的 `aud` or `client_id` 要求必須符合為授權方設定的其中一個對象項目。API Gateway 僅於 `aud` 不存在時驗證 `client_id`。當 `aud` 和 `client_id` 同時存在時，API Gateway 會評估 `aud`。

您也可以解碼 JWT，並確認它符合您的 API 所需的發行者、對象和範圍。該網站 [jwt.io](https://jwt.io/) 可以在瀏覽器中對 JWT 偵錯。OpenID Foundation 會[提供可搭配 JWT 使用的程式庫清單](https://openid.net/developers/jwt-jws-jwe-jwk-and-jwa-implementations/)。

若要進一步了解 JWT 授權方，請參閱[使用 API Gateway 中的 JWT 授權方來控制對 HTTP API 的存取](http-api-jwt-authorizer.md)。