내 CloudWatch logs에서 API Gateway REST API 오류를 찾으려면 어떻게 해야 하나요?

4분 분량
0

Amazon CloudWatch logs에서 특정 Amazon API Gateway REST API 요청 실패를 찾고 싶습니다. 어떻게 해야 하나요?

해결 방법

CloudWatch는 액세스 로깅과 실행 로깅, 이렇게 두 가지 유형의 API 로깅을 제공합니다. 다양한 유형의 API 로깅에 대한 자세한 내용은 API Gateway에 대한 CloudWatch 로그 형식을 참조하세요.

CloudWatch logs를 사용하여 특정 API Gateway REST API 요청 실패를 찾으려면 다음을 수행합니다.

참고: AWS 명령줄 인터페이스(AWS CLI) 명령을 실행할 때 오류가 발생할 경우 AWS CLI의 최신 버전을 사용하고 있는지 확인하세요.

CloudWatch 액세스 로그를 사용하여 REST API 요청 실패를 찾으려면

1.    API Gateway 콘솔을 사용하여 CloudWatch API 액세스 로깅을 설정합니다.

참고: 다음 예제에는 JSON CloudWatch 로그 형식이 사용되며 $context.error.message 컨텍스트에 대한 메시지 필드가 포함됩니다.

2.    선호하는 검색 유틸리티를 사용하여 API Gateway 액세스 로그에서 filter-log-events AWS CLI 명령을 실행합니다.

API Gateway 액세스 로그에 "grep" 검색 유틸리티를 사용하는 filter-log-events 명령의 예

중요: log-group-name을 액세스 로그 그룹의 이름으로 변경하세요.

aws logs filter-log-events --log-group-name 'API-Gateway-Access-Logs_2mg2xeej0a/test' | grep '17cb49b2-c061-11e9-bc30-f118c8b08d5f'

3.    filter-log-events 명령에 대한 응답을 확인하여 오류를 식별합니다. 명령 응답이 매핑한 모든 $context 변수가 포함된 객체를 반환합니다.

filter-log-events 명령 응답의 예

{
    "requestId": "17cb49b2-c061-11e9-bc30-f118c8b08d5f",
    "ip": "1.2.3.4",
    "caller": "-",
    "user": "-",
    "requestTime": "28/Aug/2019:15:10:34 +0000",
    "httpMethod": "GET",
    "resourcePath": "/iam",
    "status": "403",
    "message": "Missing Authentication
            Token",
    "protocol": "HTTP/1.1",
    "responseLength": "42"
}

CloudWatch 실행 로그를 사용하여 REST API 요청 실패를 찾으려면

1.    API Gateway 콘솔을 사용하여 CloudWatch API 실행 로깅을 설정합니다.

중요: 민감한 정보를 저장하지 않으려면 프로덕션으로 이동하기 전에 전체 요청/응답 데이터 로깅을 중단해야 합니다.

2.    다음 cURL 명령을 실행하여 실패한 API 요청을 복제합니다.

중요: abcd1234를 API ID로 바꾸고 us-east-1을 API가 있는 AWS 리전으로 바꿉니다.

curl -X GET https://abcd1234.execute-api.us-east-1.amazonaws.com/dev/myapi -v

3.    API 응답 헤더에서 x-amzn-requestid 값을 기록해 둡니다. 이 값은 다음 단계에서 필요합니다.

API Gateway 응답 헤더의 예

< content-type: application/json
< content-length: 41
< x-amzn-requestid: 17cb49b2-c061-11e9-bc30-f118c8b08d5f
< x-amz-apigw-id: eh7enHGIvHcFnPg=

4.    선호하는 검색 유틸리티를 사용하여 API Gateway 실행 로그에서 filter-log-events AWS CLI 명령을 실행합니다.

API Gateway 실행 로그에 "grep" 검색 유틸리티를 사용하는 filter-log-events 명령의 예

중요: log-group-name을 액세스 로그 그룹의 이름으로 변경하세요.

aws logs filter-log-events --log-group-name 'API-Gateway-Execution-Logs_2mg2xeej0a/test' | grep '17cb49b2-c061-11e9-bc30-f118c8b08d5f'

5.    filter-log-events 명령에 대한 응답을 확인하여 오류를 식별합니다. 다음은 표시될 수 있는 오류 메시지 유형의 예입니다.

API Gateway 권한 오류의 예

(b59c91c8-3386-4478-b2b4-c4d63191756e) Execution failed due to configuration error: Invalid permissions on Lambda function
(b59c91c8-3386-4478-b2b4-c4d63191756e) Gateway response type: DEFAULT_5XX with status code: 500
(b59c91c8-3386-4478-b2b4-c4d63191756e) Gateway response body: {"message": "Internal server error"}

API Gateway 통합 시간 초과 오류의 예

(2a1db04d-ac7c-463f-b9bd-478285467d58) Execution failed due to a timeout error
(2a1db04d-ac7c-463f-b9bd-478285467d58) Gateway response type: DEFAULT_5XX with status code: 504
(2a1db04d-ac7c-463f-b9bd-478285467d58) Gateway response body: {"message": "Endpoint request timed out"}

API Gateway 백엔드 통합 오류의 예

(631ff793-2c5b-413d-a31d-f2cd3f75708b) Endpoint response body before transformations: {"errorMessage": "division by zero", "errorType": "ZeroDivisionError", "stackTrace": [" File \"/var/task/lambda_function.py\", line 7, in lambda_handler\n c=a/b\n"]}
(631ff793-2c5b-413d-a31d-f2cd3f75708b) Lambda execution failed with status 200 due to customer function error: division by zero. Lambda request id: 7f0d8fc1-33ce-4bf9-8685-df78e179da5c
(631ff793-2c5b-413d-a31d-f2cd3f75708b) Gateway response type: DEFAULT_5XX with status code: 502
(631ff793-2c5b-413d-a31d-f2cd3f75708b) Gateway response body: {"message": "Internal server error"}

요청 ID를 가져올 수 없는 경우

1.    클라이언트 측 애플리케이션 로그에서 HTTP 상태 코드 또는 반환된 오류 메시지 중 하나, 또는 둘 다를 가져옵니다.

2.    API Gateway 액세스 로그에서 filter-log-events AWS CLI 명령을 실행합니다. HTTP 상태 코드 또는 반환된 오류 메시지에 대해 "grep" 검색 유틸리티를 사용합니다.

HTTP 상태 코드에 "grep" 검색 유틸리티를 사용하는 filter-log-events 명령의 예

aws logs filter-log-events --log-group-name 'API-Gateway-Access-Logs_2mg2xeej0a/test' | grep '504'

클라이언트 측에서 반환된 오류 메시지에 "grep" 검색 유틸리티를 사용하는 filter-log-events 명령의 예

aws logs filter-log-events --log-group-name 'API-Gateway-Access-Logs_2mg2xeej0a/test' | grep 'Endpoint request timed out'

3.    액세스 로그 결과에서 요청 ID를 찾습니다.

4.    이 문서의 실행 로그에서 API 응답 추적 단원의 절차를 따릅니다.