Access logging for REST APIs
In access logging, you log who has accessed your API and how the caller accessed the API. You can create your own log group or choose an existing log group. To specify the access details, you select $context variables, a log format, and a log group destination.
Access log formats
The access log format must include at least $context.requestId or
$context.extendedRequestId. As a best practice, include both in your
log format.
$context.requestId-
This logs the value in the
x-amzn-RequestIdheader. Clients can override the value in thex-amzn-RequestIdheader with a value in the format of a universally unique identifier (UUID). API Gateway returns this request ID in thex-amzn-RequestIdresponse header. API Gateway replaces overridden request IDs that aren't in the format of a UUID within your access logs.UUID_REPLACED_INVALID_REQUEST_ID $context.extendedRequestId-
The extendedRequestID is a unique ID that API Gateway generates. API Gateway returns this request ID in the
x-amz-apigw-idresponse header. An API caller can't provide or override this request ID. You might need to provide this value to AWS Support to help troubleshoot your API. For more information, see Variables for access logging for API Gateway.
Choose a log format that is also adopted by your analytic backend, such as
Common Log
Format
Examples of some commonly used access log formats are shown in the API Gateway console and are listed as follows.
-
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(comma-separated values):$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
Set up access logging using the API Gateway console
Before you set up access logging, deploy the API to a stage and configure an appropriate CloudWatch Logs role ARN for your account.
Sign in to the API Gateway console at https://console.aws.amazon.com/apigateway
. -
In the main navigation pane, choose APIs, and then do one of the following:
-
Choose an existing API, and then choose a stage.
-
Create an API, and then deploy it to a stage.
-
-
In the main navigation pane, choose Stages.
-
In the Logs and tracing section, choose Edit.
-
Turn on Custom access logging.
-
For Access log destination ARN, enter the ARN of a log group. The ARN format is
arn:aws:logs:.{region}:{account-id}:log-group:log-group-name -
For Log Format, enter a log format. You can choose CLF, JSON, XML, or CSV. To learn more about example log formats, see Access log formats.
-
Choose Save changes.
API Gateway is now ready to log requests to your API. You don't need to redeploy the API when you update the stage settings, logs, or stage variables.
Set up access logging using CloudFormation
Use the following example CloudFormation template to create a Amazon CloudWatch Logs log group and configure access logging for a stage. To enable CloudWatch Logs, you must grant API Gateway permission to read and write logs to CloudWatch for your account. To learn more, see Associate account with IAM role in the AWS CloudFormation User Guide.
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