오류, 시간 초과 및 재시도
문제가 발생했을 때와 안전하게 다시 호출할 수 있을 때 invoke가 반환하는 내용을 읽는 방법.
1. 오류 개체
invoke는 { data, error }을 반환하고 절대 발생하지 않습니다. error는 AuraError이므로 isAuraError(error)는 true입니다. 두 개의 하위 클래스가 누가 실패했는지 알려줍니다.
| 필드 | 의미 |
|---|---|
error.status | HTTP 상태. 0는 클라이언트에서 오류가 발생했음을 의미합니다(응답 없음). |
error.code | 안정적인 식별자(예: NOT_FOUND, QUOTA_EXCEEDED, timeout, invalid_body) |
error.message | 함수가 반환한 텍스트 또는 플랫폼 설명입니다. |
error.context | FunctionsHttpError에서: 함수가 반환한 본문(구문 분석된 JSON 또는 텍스트)입니다. |
error.details | 원시 오류 본문입니다. 플랫폼 오류의 경우 error.request_id가 포함됩니다. |
2. 어떤 오류인가요?
실행 중인 스택에 대해 관찰된 동작입니다. 할당량 행은 백엔드의 오류 매핑을 따르며 테스트에서는 트리거되지 않았습니다.
| 무슨 일이 일어났나요? | 수업 | status | code | message |
|---|---|---|---|---|
| 해당 기능이 존재하지 않습니다. | FunctionsHttpError | 404 | NOT_FOUND | "...'안돼' 기능은 문제가 되지 않습니다." |
귀하의 함수는 텍스트와 함께 500를 반환합니다. | FunctionsHttpError | 500 | http_500 | 그 텍스트 |
귀하의 함수는 503 자체를 반환합니다. | FunctionsHttpError | 503 | http_503 | 당신이 반환한 것 |
| 귀하의 기능이 발생합니다 | FunctionsHttpError | 500 | http_500 | "내부 서버 오류" |
귀하의 함수가 timeout_secs을(를) 초과합니다. | FunctionsHttpError | 500 또는 503 | http_500 / http_503 | "함수 실행 실패" 또는 "함수가 HTTP 503을 반환했습니다." |
| 런타임에 연결할 수 없습니다. | FunctionsRelayError | 503 | SERVICE_UNAVAILABLE | 함수가 실행되지 않았다고 설명합니다. |
| 응답하기 전에 네트워크가 실패합니다. | FunctionsRelayError | 0 | network_error | 네트워크 오류 |
| 계획 할당량이 소진되었습니다. | FunctionsHttpError | 403 | QUOTA_EXCEEDED | 할당량 메시지 |
| 한 고객의 통화가 너무 많습니다. | FunctionsHttpError | 429 | rate_limit_exceeded | 대기 메시지 |
| 요청 본문이 너무 큼 | FunctionsRelayError | 503 | SERVICE_UNAVAILABLE | "최대 페이로드 크기를 초과했습니다." |
취소했거나 timeout이 만료되었습니다. | AuraError | 0 | timeout | "함수 호출이 중단되었거나 시간 초과되었습니다." |
| 본문을 JSON으로 보낼 수 없습니다. | AuraError | 0 | invalid_body | 피해야 할 유형의 이름을 지정합니다. |
자신의 코드가 502, 503 또는 504를 반환하면 FunctionsHttpError가 표시됩니다. 클래스는 상태 번호가 아닌 누가 응답했는지 알려줍니다.
약 256KiB를 초과하는 요청 본문은 503 SERVICE_UNAVAILABLE로 거부되었으며 약 300KB 이상의 응답은 50초 테스트 내에 반환되지 않았습니다. 제한을 참조하세요. 다시 시도해도 도움이 되지 않습니다. 데이터를 적게 보내거나 저장소를 사용하세요.
3. 재시도 여부 결정
SDK는 호출을 다시 시도하지 않습니다. 함수에 부작용이 있을 수 있으며 반복되는 POST은 기본적으로 안전하지 않습니다. 아래 표를 참고하여 결정하세요.
| 실패 | 기능이 실행됐나요? | 다시 시도해도 안전할까요? |
|---|---|---|
플랫폼의 503(FunctionsRelayError) | 아니요, 런타임에 연결할 수 없습니다. | 예, 짧은 백오프가 있습니다. |
429 | 아니요 | 예, error.retryAfter 지연 후 |
403 QUOTA_EXCEEDED | 아니요 | 아니요, 할당량이 재설정되거나 계획을 변경할 때까지 |
status 0 (network_error) | 알 수 없음 | 함수가 멱등적인 경우에만 |
클라이언트의 timeout | 알 수 없음 | 함수가 멱등적인 경우에만 |
FunctionsHttpError 5xx | 예, 부분적으로 또는 완전히 | 함수가 멱등적인 경우에만 |
FunctionsHttpError 4xx | 예 | 아니요: 요청을 수정합니다. |
플랫폼은 호출의 중복을 제거하지 않으며 Idempotency-Key를 무시합니다. 결제나 이메일의 경우 body에 전달한 키를 저장하고 기능 시작 시 확인하세요.
4. 시간 초과
세 개의 시계가 동시에 실행됩니다.
| 시계 | 기본값 | 어디서 바꾸나요? |
|---|---|---|
| 귀하의 고객 | responseType마다 30초 | 클라이언트 옵션의 invoke(…, { timeout }), { signal }또는 requestTimeoutMs |
| 기능 | 30초, 1~300 사이 | 함수에 대한 permissions.timeout_secs |
| 게이트웨이 | 380 s | 프로젝트별로 구성할 수 없음 |
함수가 timeout_secs를 초과하면 런타임은 함수를 취소하고 위에 표시된 500 또는 503과 함께 해당 지연 후에 호출이 실패합니다. 원인은 원시 모드의 error.context.detail(WorkerRequestCancelled: request has been cancelled by supervisor)에 나타납니다. 클라이언트 timeout대신 이 오류를 보려면 함수의 timeout_secs보다 약간 높게 클라이언트 timeout를 설정하세요.
몇 초보다 긴 작업의 경우 는 연결을 열어 두는 대신 작업을 대기열에 넣습니다.
5. 원인 찾기
- 플랫폼 오류에는 요청 ID가 포함됩니다:
error.details.error.request_id. 지원팀에 문의할 때 이를 인용하세요. aura functions logs <name>는 메서드, 경로, 상태, 기간 및 요청 ID와 함께 최근 HTTP 요청을 나열합니다. 함수가console.log또는console.error를 사용하여 작성한 내용은 표시되지 않습니다. 해당 출력은 플랫폼 운영자만 읽을 수 있는 런타임 자체 로그에 유지됩니다. 이것과 다른 현재 격차에 대해서는 제한을 참조하세요.- 호출 식별자는 함수로 전달되지 않습니다.
headers에 자신의 ID를 전달하고 기록하세요.