View a markdown version of this page

REST API のアクセスログ記録 - Amazon API Gateway

REST API のアクセスログ記録

アクセスログの作成では、API にアクセスしたユーザーと、呼び出し元が API にアクセスした方法を記録します。独自のロググループを作成したり、既存のロググループを選択したりすることができます。アクセスの詳細を指定するには、$context 変数、ログ形式、ロググループの送信先を選択します。

アクセスログの形式

アクセスログには少なくとも $context.requestId または $context.extendedRequestId が含まれている必要があります。ベストプラクティスとして、両方をログ形式に含めます。

$context.requestId

これにより、x-amzn-RequestId ヘッダーに値が記録されます。クライアントは、x-amzn-RequestId ヘッダーの値を共通の一意の識別子 (UUID) 形式の値で上書きできます。API Gateway は、x-amzn-RequestId レスポンスヘッダー内のこのリクエスト ID を返します。API Gateway は、アクセスログの上書きされたリクエスト ID のうち UUID の形式ではないものを UUID_REPLACED_INVALID_REQUEST_ID に置き換えます。

$context.extendedRequestId

extendedRequestID は、API Gateway が生成する一意の ID です。API Gateway は、x-amz-apigw-id レスポンスヘッダー内のこのリクエスト ID を返します。API 発信者は、このリクエスト ID を提供することやオーバーライドすることはできません。API のトラブルシューティング役立てるために、必要に応じて、この値を AWS サポートに提供します。詳細については、「API Gateway のアクセスのログ記録のための変数」を参照してください。

Common Log Format (CLF)、JSON、XML、CSV など、分析バックエンドでも採用されているログ形式を選択します。その後、フィードに直接アクセスログを入力して、メトリクスを計算してレンダリングすることができます。ログの形式を定義するには、ロググループの ARN をステージの accessLogSettings/destinationArn プロパティに設定します。ロググループの ARN は、CloudWatch コンソールで取得できます。アクセスログの形式を定義するには、選択した形式をステージの accessLogSetting/format プロパティに設定します。

API Gateway コンソールには、一般的に使用されるアクセスログの形式の例が表示されます。以下にもその例を示します。

  • CLF (Common Log Format):

    $context.identity.sourceIp $context.identity.caller $context.identity.user [$context.requestTime]"$context.httpMethod $context.resourcePath $context.protocol" $context.status $context.responseLength $context.requestId $context.extendedRequestId
  • JSON:

    { "requestId":"$context.requestId", "extendedRequestId":"$context.extendedRequestId","ip": "$context.identity.sourceIp", "caller":"$context.identity.caller", "user":"$context.identity.user", "requestTime":"$context.requestTime", "httpMethod":"$context.httpMethod", "resourcePath":"$context.resourcePath", "status":"$context.status", "protocol":"$context.protocol", "responseLength":"$context.responseLength" }
  • XML:

    <request id="$context.requestId"> <extendedRequestId>$context.extendedRequestId</extendedRequestId> <ip>$context.identity.sourceIp</ip> <caller>$context.identity.caller</caller> <user>$context.identity.user</user> <requestTime>$context.requestTime</requestTime> <httpMethod>$context.httpMethod</httpMethod> <resourcePath>$context.resourcePath</resourcePath> <status>$context.status</status> <protocol>$context.protocol</protocol> <responseLength>$context.responseLength</responseLength> </request>
  • CSV (カンマ区切り値):

    $context.identity.sourceIp,$context.identity.caller,$context.identity.user,$context.requestTime,$context.httpMethod,$context.resourcePath,$context.protocol,$context.status,$context.responseLength,$context.requestId,$context.extendedRequestId

API Gateway コンソールを使用してアクセスログ記録を設定する

アクセスログ記録を設定する前に、API をステージにデプロイし、アカウントに適切な CloudWatch Logs ロール ARN を設定します。

  1. https://console.aws.amazon.com/apigateway で API Gateway コンソールにサインインします。

  2. メインナビゲーションペインで、[API] を選択して、以下のいずれかを実行します。

    1. 既存の API を選択し、ステージを選択します。

    2. API を作成してから、ステージにデプロイします。

  3. メインナビゲーションペインで、[ステージ] を選択します。

  4. [ログおよびトレース] セクションで [編集] を選択します。

  5. [カスタムアクセスロギング] を有効にします。

  6. [アクセスログの送信先 ARN] に、ロググループの ARNを入力します。ARN 形式は arn:aws:logs:{region}:{account-id}:log-group:log-group-name です。

  7. [ログの形式] にログの形式を入力します。[CLF]、[JSON]、[XML]、または [CSV] を選択できます。ログ形式の例について詳しくは、「アクセスログの形式」を参照してください。

  8. [変更の保存] をクリックします。

これで、API Gateway で API へのリクエストのログを記録する準備が整いました。ステージ設定、ログ、またはステージ変数を更新するときに API を再デプロイする必要はありません。

CloudFormation を使用してアクセスログ記録を設定する

次の CloudFormation テンプレート例を使用して Amazon CloudWatch Logs ロググループを作成し、ステージのアクセスログ記録を設定します。CloudWatch Logs を有効にするには、API Gateway の CloudWatch に対するログの読み取りと書き込みのアクセス許可をアカウントに付与する必要があります。詳細については、「AWS CloudFormation ガイド」の「アカウントに IAM ロールを関連付ける」を参照してください。

TestStage: Type: AWS::ApiGateway::Stage Properties: StageName: test RestApiId: !Ref MyAPI DeploymentId: !Ref Deployment AccessLogSetting: DestinationArn: !GetAtt MyLogGroup.Arn Format: $context.extendedRequestId $context.identity.sourceIp $context.identity.caller $context.identity.user [$context.requestTime] "$context.httpMethod $context.resourcePath $context.protocol" $context.status $context.responseLength $context.requestId MyLogGroup: Type: AWS::Logs::LogGroup Properties: LogGroupName: !Join - '-' - - !Ref MyAPI - access-logs