本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
在 API Gateway RESTAPIs中設定 CloudWatch 的記錄
若要協助偵錯與請求執行或用戶端存取 相關的問題API,您可以啟用 Amazon CloudWatch Logs 來記錄API呼叫。如需 的詳細資訊 CloudWatch,請參閱 使用 Amazon CloudWatch 指標監控RESTAPI執行。
CloudWatch API Gateway 的日誌格式
API 登入有兩種類型 CloudWatch:執行記錄和存取記錄。在執行日誌中,APIGateway 會管理 CloudWatch 日誌。此程序包含建立日誌群組和日誌串流,以及向日誌串流報告任何發起人的請求和回應。
記錄的資料包括錯誤或執行追蹤 (例如請求或回應參數值或承載)、Lambda 授權方 (先前稱為自訂授權方) 使用的資料、是否需要API金鑰、是否啟用使用計畫,以及其他資訊。API Gateway 會從記錄的資料修改授權標頭、API金鑰值和類似的敏感請求參數。
部署 時API,APIGateway 會在日誌群組下建立日誌群組和日誌串流。日誌群組的命名是遵循 API-Gateway-Execution-Logs_{rest-api-id}/{stage_name}
格式。在每個日誌群組內,日誌會進一步分割為日誌串流,而其在報告所記錄的資料時會依 Last Event Time (上次事件時間) 排序。
在存取日誌中,身為API開發人員的您要日誌誰存取了您的 ,API以及來電者如何存取 API。您可以建立自己的日誌群組,或選擇可由 API Gateway 管理的現有日誌群組。若要指定存取詳細資訊,您可以選取$context變數、日誌格式和日誌群組目的地。
存取日誌格式必須至少包含 $context.requestId
或 $context.extendedRequestId
。最佳實務是將 $context.requestId
和 $context.extendedRequestId
納入日誌格式。
$context.requestId
-
這會記錄
x-amzn-RequestId
標頭中的值。用戶端可以使用通用唯一識別碼 () 格式的值覆寫x-amzn-RequestId
標頭中的值UUID。API Gateway 會在x-amzn-RequestId
回應標頭中傳回此請求 ID。API Gateway 會取代您存取日誌
中IDs非 UUID與 格式的覆寫請求。UUID
_REPLACED_INVALID_REQUEST_ID $context.extendedRequestId
-
extendedRequestID 是 API Gateway 產生的唯一 ID。API Gateway 會在
x-amz-apigw-id
回應標頭中傳回此請求 ID。API 來電者無法提供或覆寫此請求 ID。您可能需要將此值提供給 AWS Support,以協助疑難排解您的 API。如需詳細資訊,請參閱$context 資料模型、授權方、映射範本和 CloudWatch 存取記錄的變數。
注意
僅支援$context
變數。
選擇分析後端也採用的日誌格式,例如通用日誌格式
一些常用存取日誌格式的範例會顯示在 API Gateway 主控台中,如下所示。
-
CLF
(通用日誌格式): $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
CloudWatch 記錄的許可
若要啟用 CloudWatch 日誌,您必須授予 API Gateway 許可,才能 CloudWatch 讀取和寫入您帳戶的日誌。AmazonAPIGatewayPushToCloudWatchLogs
受管政策 (具有 ARN的 arn:aws:iam::aws:policy/service-role/AmazonAPIGatewayPushToCloudWatchLogs
) 具有所有必要的許可:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:DescribeLogGroups", "logs:DescribeLogStreams", "logs:PutLogEvents", "logs:GetLogEvents", "logs:FilterLogEvents" ], "Resource": "*" } ] }
注意
API 閘道呼叫 AWS Security Token Service 以擔任IAM角色,因此請確定 AWS STS 已針對 區域啟用 。如需詳細資訊,請參閱在 AWS 區域 STS中管理 AWS。
若要將這些許可授予您的帳戶,請使用 建立IAM角色apigateway.amazonaws.com
作為其信任的實體,將上述政策連接到IAM角色,並在您帳戶 的 cloudWatchRoleArn 屬性ARN上設定IAM角色。您必須針對您要啟用 CloudWatch 日誌的每個 AWS 區域分別設定 cloudWatchRoleArn 屬性。
如果您在設定IAM角色 時收到錯誤ARN,請檢查您的 AWS Security Token Service 帳戶設定,以確保在您所使用的區域中 AWS STS 啟用 。如需啟用 的詳細資訊 AWS STS,請參閱 使用者指南 中的在 AWS 區域中管理 AWS STS。 IAM
使用API閘道主控台設定 CloudWatch API記錄
若要設定 CloudWatch API記錄,您必須已將 部署API到階段。您也必須ARN為您的帳戶設定適當的 CloudWatch 日誌角色。
在 https://console.aws.amazon.com/apigateway
登入 API Gateway 主控台。 -
在主導覽窗格中,選擇設定,然後在記錄下選擇編輯。
-
對於CloudWatch 日誌角色 ARN,輸入具有適當許可IAM的角色ARN的 。您需要對APIs使用 API Gateway 建立 AWS 帳戶 的每個 執行一次此操作。
-
在主導覽窗格中,選擇 APIs,然後執行下列其中一項操作:
-
選擇現有的 API,然後選擇階段。
-
建立 API,然後將其部署到階段。
-
在主導覽窗格中,選擇階段。
-
在日誌和追蹤區段中,選擇編輯。
-
若要啟用執行記錄:
-
從 CloudWatch Logs 下拉式功能表中選取記錄層級。記錄層級如下:
-
關閉 – 此階段未開啟登入。
-
僅限錯誤 – 僅針對錯誤啟用記錄。
-
錯誤和資訊日誌 – 為所有事件啟用了記錄。
-
-
(選用) 選取資料追蹤以開啟階段的資料追蹤記錄。這對於疑難排解 很有用APIs,但可能導致記錄敏感資料。
注意
建議您不要將資料追蹤用於生產 APIs。
-
(選用) 選取詳細指標以開啟詳細 CloudWatch 指標。
如需 CloudWatch 指標的詳細資訊,請參閱 使用 Amazon CloudWatch 指標監控RESTAPI執行。
-
-
若要啟用存取記錄:
-
開啟自訂存取記錄。
-
針對存取日誌目的地 ARN,輸入日誌群組ARN的 。ARN 格式為
arn:aws:logs:
。{region}
:{account-id}
:log-group:log-group-name
-
在日誌格式中,輸入日誌格式。您可以選擇 CLF、JSON、 XML或 CSV。若要進一步了解範例日誌格式,請參閱 CloudWatch API Gateway 的日誌格式。
-
-
選擇 Save changes (儲存變更)。
注意
您可以個別啟用執行記錄和存取記錄。
API Gateway 現在已準備好將請求記錄到您的 API。當您更新階段設定、日誌或階段變數API時,不需要重新部署 。
使用 設定 CloudWatch API記錄 AWS CloudFormation
使用下列範例 AWS CloudFormation 範本建立 Amazon CloudWatch Logs 日誌群組,並設定階段的執行和存取日誌。若要啟用 CloudWatch 日誌,您必須授予 API Gateway CloudWatch 許可,以讀取和寫入您帳戶的日誌。若要進一步了解,請參閱 AWS CloudFormation 使用者指南 中的將帳戶與IAM角色建立關聯。
TestStage: Type: AWS::ApiGateway::Stage Properties: StageName: test RestApiId: !Ref MyAPI DeploymentId: !Ref Deployment Description: "test stage description" MethodSettings: - ResourcePath: "/*" HttpMethod: "*" LoggingLevel: INFO 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