

# 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
  ```

# HTTP API アクセスログをカスタマイズする
<a name="http-api-logging-variables"></a>

次の変数を使用して、HTTP API のアクセスログをカスタマイズできます。HTTP API のアクセスログの詳細については、「[API Gateway で HTTP API のログ記録を設定する](http-api-logging.md)」を参照してください。


| パラメータ | 説明 | 
| --- | --- | 
| \$1context.accountId |  API 所有者の AWS アカウント ID。  | 
| \$1context.apiId |  API Gateway が API に割り当てる識別子。  | 
| \$1context.authorizer.claims.property |  メソッドの呼び出し元が正常に認証された後で JSON ウェブトークン (JWT) から返されるクレームのプロパティ (`$context.authorizer.claims.username` など)。詳細については、「[API Gateway の JWT オーソライザーを使用して HTTP API へのアクセスを制御する](http-api-jwt-authorizer.md)」を参照してください。  `$context.authorizer.claims` を呼び出すと NULL が返されます。   | 
| \$1context.authorizer.error | オーソライザーから返されたエラーメッセージ。 | 
| \$1context.authorizer.property |  API Gateway Lambda オーソライザー関数から返された `context` マップの指定されたキー/値ペアの値。たとえば、オーソライザーが次の `context` マップを返すとします。 <pre>"context" : {<br />  "key": "value",<br />  "numKey": 1,<br />  "boolKey": true<br />}</pre> `$context.authorizer.key` を呼び出すと `"value"` 文字列が返され、`$context.authorizer.numKey` を呼び出すと `1` が返され、`$context.authorizer.boolKey` を呼び出すと `true` が返されます。  | 
| \$1context.awsEndpointRequestId |  `x-amz-request-id` または `x-amzn-requestId` ヘッダーからの AWS エンドポイントのリクエスト ID。  | 
| \$1context.awsEndpointRequestId2 |  `x-amz-id-2` ヘッダーからの AWS エンドポイントのリクエスト ID。  | 
| \$1context.customDomain.basePathMatched |  受信リクエストが一致した API マッピングのパス。クライアントがカスタムドメイン名を使用して API にアクセスする場合に適用されます。たとえば、クライアントがリクエストを `https://api.example.com/v1/orders/1234` に送信し、リクエストがパス `v1/orders` を持つ API マッピングと一致する場合 、値は `v1/orders` になります。詳細については、「[API ステージを HTTP API のカスタムドメイン名にマッピングする](http-api-mappings.md)」を参照してください。  | 
| \$1context.dataProcessed | 処理されたデータの量 (バイト単位)。 | 
| \$1context.domainName |  API の呼び出しに使用された完全ドメイン名。これは、受信 `Host` ヘッダーと同じである必要があります。  | 
| \$1context.domainPrefix |  `$context.domainName` の 1 つ目のラベル。  | 
| \$1context.error.message |  API Gateway エラーメッセージを含む文字列。  | 
| \$1context.error.messageString | \$1context.error.message を引用符で囲んだ値、つまり "\$1context.error.message"。 | 
| \$1context.error.responseType |  `GatewayResponse` のタイプ。詳細については、「[CloudWatch メトリクスを使用して WebSocket API の実行をモニタリングする](apigateway-websocket-api-logging.md)」および「[エラーレスポンスをカスタマイズするためのゲートウェイレスポンスのセットアップ](api-gateway-gatewayResponse-definition.md#customize-gateway-responses)」を参照してください。  | 
| \$1context.extendedRequestId | \$1context.requestId と同等です。 | 
| \$1context.httpMethod |  使用される HTTP メソッドです。有効な値には、`DELETE`、`GET`、`HEAD`、`OPTIONS`、`PATCH`、`POST` および `PUT` があります。  | 
| \$1context.identity.accountId |  リクエストに関連付けられた AWS アカウント ID です。IAM 認可を使用するルートでサポートされています。  | 
| \$1context.identity.caller |  リクエストに署名した発信者のプリンシパル ID。IAM 認可を使用するルートでサポートされています。  | 
| \$1context.identity.cognitoAuthenticationProvider |  リクエスト元の発信者が使用するすべての Amazon Cognito 認証プロバイダーのカンマ区切りのリスト。リクエストが Amazon Cognito 認証情報で署名されている場合にのみ使用できます。 たとえば、Amazon Cognito ユーザープールのアイデンティティの場合、`cognito-idp. region.amazonaws.com/user_pool_id,cognito-idp.region.amazonaws.com/user_pool_id:CognitoSignIn:token subject claim` 利用可能な Amazon Cognito 認証プロバイダーについては、「Amazon Cognito 開発者ガイド」の「[フェデレーティッド ID の使用](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-identity.html)」を参照してください。** | 
| \$1context.identity.cognitoAuthenticationType |  リクエストを行う発信者の Amazon Cognito 認証タイプ。リクエストが Amazon Cognito 認証情報で署名されている場合にのみ使用できます。有効な値は、認証されたアイデンティティ`authenticated`および認証されていないアイデンティティ`unauthenticated`です。 | 
| \$1context.identity.cognitoIdentityId |  リクエストを行う発信者の Amazon Cognito ID。リクエストが Amazon Cognito 認証情報で署名されている場合にのみ使用できます。  | 
| \$1context.identity.cognitoIdentityPoolId |  リクエストを行う発信者の Amazon Cognito ID プール ID。リクエストが Amazon Cognito 認証情報で署名されている場合にのみ使用できます。  | 
| \$1context.identity.principalOrgId |  [AWS 組織 ID](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_org_details.html)。IAM 認可を使用するルートでサポートされています。  | 
| \$1context.identity.clientCert.clientCertPem |  クライアントが相互 TLS 認証中に提示した PEM エンコードされたクライアント証明書。相互 TLS が有効なカスタムドメイン名を使用してクライアントが API にアクセスすると、アクセスログに存在します。  | 
| \$1context.identity.clientCert.subjectDN |  クライアントが提示する証明書のサブジェクトの識別名。相互 TLS が有効なカスタムドメイン名を使用してクライアントが API にアクセスすると、アクセスログに存在します。  | 
| \$1context.identity.clientCert.issuerDN |  クライアントが提示する証明書の発行者の識別名。相互 TLS が有効なカスタムドメイン名を使用してクライアントが API にアクセスすると、アクセスログに存在します。  | 
| \$1context.identity.clientCert.serialNumber |  証明書のシリアル番号。相互 TLS が有効なカスタムドメイン名を使用してクライアントが API にアクセスすると、アクセスログに存在します。  | 
| \$1context.identity.clientCert.validity.notBefore |  証明書が無効になる前の日付。相互 TLS が有効なカスタムドメイン名を使用してクライアントが API にアクセスすると、アクセスログに存在します。  | 
| \$1context.identity.clientCert.validity.notAfter |  証明書が無効になった日付。相互 TLS が有効なカスタムドメイン名を使用してクライアントが API にアクセスすると、アクセスログに存在します。  | 
| \$1context.identity.sourceIp |  API Gateway エンドポイントへのリクエストを実行する即時 TCP 接続のソース IP アドレス。  | 
| \$1context.identity.user |  リソースアクセスに対して許可されるユーザーのプリンシパル識別子。IAM 認可を使用するルートでサポートされています。  | 
| \$1context.identity.userAgent |  API 発信者の [https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User-Agent](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User-Agent) ヘッダー。  | 
| \$1context.identity.userArn |  認証後に識別された有効ユーザーの Amazon リソースネーム (ARN) です。IAM 認可を使用するルートでサポートされています。詳細については、「[https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users.html](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users.html)」を参照してください。  | 
| \$1context.integration.error | 統合から返されたエラーメッセージ。これは \$1context.integrationErrorMessage と同等です。 | 
| \$1context.integration.integrationStatus | Lambda プロキシ統合の場合、バックエンドの Lambda 関数コードからではなく、AWS Lambda から返されるステータスコード。 | 
| \$1context.integration.latency | 統合レイテンシー (ミリ秒)。これは \$1context.integrationLatency と同等です。 | 
| \$1context.integration.requestId | AWS エンドポイントのリクエスト ID これは \$1context.awsEndpointRequestId と同等です。 | 
| \$1context.integration.status | 統合から返されたステータスコード。Lambda プロキシ統合では、これは Lambda 関数コードから返されたステータスコードです。 | 
| \$1context.integrationErrorMessage |  統合エラーメッセージを含む文字列。  | 
| \$1context.integrationLatency | 統合レイテンシー (ミリ秒)。 | 
| \$1context.integrationStatus | Lambda プロキシ統合の場合、このパラメータはバックエンド Lambda 関数からではなく、AWS Lambda から返されたステータスコードを表します。 | 
| \$1context.path | リクエストパス。例えば、/\$1stage\$1/root/child。 | 
| \$1context.protocol | HTTP/1.1 などのリクエストプロトコル。 API Gateway API は HTTP/2 リクエストを受け入れることができますが、API Gateway は HTTP/1.1 を使用してバックエンド統合にリクエストを送信します。その結果、クライアントが HTTP/2 を使用するリクエストを送信した場合でも、リクエストプロトコルは HTTP/1.1 として記録されます。   | 
| \$1context.requestId |  API Gateway が API リクエストに割り当てる ID。  | 
| \$1context.requestTime | [CLF](https://httpd.apache.org/docs/current/logs.html#common) 形式の要求時間 (dd/MMM/yyyy:HH:mm:ss \$1-hhmm)。 | 
| \$1context.requestTimeEpoch | [エポック](https://en.wikipedia.org/wiki/Unix_time)形式のリクエスト時間。 | 
| \$1context.responseLatency | レスポンスレイテンシー (ミリ秒)。 | 
| \$1context.responseLength | レスポンスペイロードの長さ (バイト単位)。 | 
| \$1context.routeKey |  API リクエストのルートキー (例:`/pets`)。  | 
| \$1context.stage |  API リクエストのデプロイステージ (`beta`、`prod` など)。  | 
| \$1context.status | メソッドレスポンスのステータス。 | 