

# 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. [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway) で API Gateway コンソールにサインインします。

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 リソースネーム (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` ([Common Log Format](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
  ```