

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

# 在 API Gateway 中設定 HTTP API 的日誌
<a name="http-api-logging"></a>

您可以開啟記錄功能，將日誌寫入 CloudWatch Logs。您可以使用[記錄變數](http-api-logging-variables.md)來自訂日誌的內容。

為了改善您的安全狀態，建議您將 HTTP API 所有階段的日誌寫入 CloudWatch Logs。您可能需要這樣做，才能符合各種合規架構。如需詳細資訊，請參閱《AWS Security Hub 使用者指南》**中的 [Amazon API Gateway 控制項](https://docs.aws.amazon.com/securityhub/latest/userguide/apigateway-controls.html)。

若要開啟 HTTP API 的記錄功能，您必須執行下列動作。

1. 確定您的使用者具有啟用記錄所需的許可。

1. 建立 CloudWatch Logs 日誌群組。

1. 為 API 的某個階段提供 CloudWatch Logs 日誌群組的 ARN。

## 用以啟用記錄的許可。
<a name="http-api-logging.permissions"></a>

若要開啟 API 的記錄功能，您的使用者必須具有下列許可。

**Example**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:DescribeLogGroups",
                "logs:DescribeLogStreams",
                "logs:GetLogEvents",
                "logs:FilterLogEvents"
            ],
            "Resource": "arn:aws:logs:{{us-east-2}}:{{123456789012}}:log-group:*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogDelivery",
                "logs:PutResourcePolicy",
                "logs:UpdateLogDelivery",
                "logs:DeleteLogDelivery",
                "logs:CreateLogGroup",
                "logs:DescribeResourcePolicies",
                "logs:GetLogDelivery",
                "logs:ListLogDeliveries"
            ],
            "Resource": "*"
        }
    ]
}
```

## 建立日誌群組並啟動 HTTP API 的記錄
<a name="http-api-enable-logging"></a>

您可以使用 AWS 管理主控台 或 建立日誌群組並啟用存取記錄 AWS CLI。

------
#### [ AWS 管理主控台 ]

1.  建立 日誌群組 

   如要了解如何使用主控台建立日誌群組，請參閱《Amazon CloudWatch Logs 使用者指南》中的[建立日誌群組](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/Working-with-log-groups-and-streams.html)

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

1. 選擇一個 HTTP API。

1. 在主導覽面板中的 **Monitor** (監視器) 標籤下，選擇 **Logging** (記錄)。

1. 選取要啟動記錄的階段，然後選擇 **Select** (選取)。

1. 選擇 **Edit** (編輯) 以啟動存取記錄。

1. 開啟 **Access logging** (存取記錄功能)，輸入 CloudWatch Logs，然後選取日誌格式。

1. 選擇**儲存**。

------
#### [ AWS CLI ]

以下 [create-log-group](https://docs.aws.amazon.com/cli/latest/reference/logs/create-log-group.html) 命令會建立日誌群組：

```
aws logs create-log-group --log-group-name {{my-log-group}}
```

您需要日誌群組的 Amazon Resource Name (ARN) 才能啟用記錄。ARN 格式為 arn:aws:logs:{{region}}:{{account-id}}:log-group:{{log-group-name}}。

下列 [update-stage](https://docs.aws.amazon.com/cli/latest/reference/apigatewayv2/update-stage.html) 命令會啟動 HTTP API 的 `$default` 階段的記錄功能：

```
aws apigatewayv2 update-stage --api-id {{abcdef}} \
    --stage-name '{{$default}}' \
    --access-log-settings '{"DestinationArn": "arn:aws:logs:{{region}}:{{account-id}}:log-group:{{log-group-name}}", "Format": "$context.identity.sourceIp - - [$context.requestTime] \"$context.httpMethod $context.routeKey $context.protocol\" $context.status $context.responseLength $context.requestId"}'
```

------

## 日誌格式範例
<a name="http-api-enable-logging.examples"></a>

一些常用存取日誌格式範例會顯示在 API Gateway 主控台中，並列出如下。
+ `CLF` ([通用日誌格式](https://httpd.apache.org/docs/current/logs.html#common))：

  ```
  $context.identity.sourceIp - - [$context.requestTime] "$context.httpMethod $context.routeKey $context.protocol" $context.status $context.responseLength $context.requestId $context.extendedRequestId
  ```
+  `JSON`: 

  ```
  { "requestId":"$context.requestId", "ip": "$context.identity.sourceIp", "requestTime":"$context.requestTime", "httpMethod":"$context.httpMethod","routeKey":"$context.routeKey", "status":"$context.status","protocol":"$context.protocol", "responseLength":"$context.responseLength", "extendedRequestId": "$context.extendedRequestId" }
  ```
+ `XML`: 

  ```
  <request id="$context.requestId"> <ip>$context.identity.sourceIp</ip> <requestTime>$context.requestTime</requestTime> <httpMethod>$context.httpMethod</httpMethod> <routeKey>$context.routeKey</routeKey> <status>$context.status</status> <protocol>$context.protocol</protocol> <responseLength>$context.responseLength</responseLength> <extendedRequestId>$context.extendedRequestId</extendedRequestId> </request>
  ```
+ `CSV` (逗號分隔值)：

  ```
  $context.identity.sourceIp,$context.requestTime,$context.httpMethod,$context.routeKey,$context.protocol,$context.status,$context.responseLength,$context.requestId,$context.extendedRequestId
  ```