서비스에 끼워 넣기
키 보관부터 출시 전 점검표까지입니다.전체 구조
내 서비스 서버가 공개 REST로 작업을 접수하고, 웹훅이나 폴링으로 종료를 알아채서 결과를 사용자에게 보여 줍니다. 키는 서버에만 둡니다.
키 보관
- 키는 서버의 비밀 저장소나 환경변수에만 둡니다. 브라우저나 앱 번들에 넣지 않습니다.
- 서비스마다 키를 따로 만들고 필요한 기능만 허용합니다.
- 지출 한도를 걸어 두면 문제가 생겨도 피해가 한도에서 멈춥니다. 키는 서비스마다 따로 두고 한도는 하루 또는 한 달(UTC) 기준입니다.
중복 방지
사용자 요청 하나에 멱등 키 하나를 정합니다. 내 쪽 주문 id나 요청 id에서 만들면 재시도해도 같은 키가 됩니다. 같은 키와 같은 본문은 같은 작업을 돌려주므로, 네트워크 오류 뒤 재전송해도 이중 과금이 없습니다. 같은 키에 본문이 다르면 409입니다.
실행당 지출 상한
모든 접수에
maxCherry를 넣습니다. 서비스가 사용자에게 보여 준 가격에 맞춰 정하면, 서버 쪽 견적이 올라도 그 이상은 쓰이지 않고 400으로 거절됩니다. 후보가 여럿인 요청은 후보 전체의 합계를 넣으세요.결과 수신
웹훅을 쓰면 다음 순서입니다.
- 원문 본문과 서명 헤더로 검증합니다. 실패하면 401을 돌려줍니다.
- 이벤트 id로 중복을 거릅니다.
- 바로 2xx를 돌려주고 나머지는 큐에서 처리합니다.
- 작업 id로 조회해 결과를 가져옵니다.
결과를 화면에 연결하기
조회 응답의 읽기 링크는 15분 뒤 만료됩니다. 링크를 저장하지 말고 보여 줄 때마다 조회하거나, 내 저장소에 파일을 내려받아 보관합니다. 이미지는
outputs[], 오디오는 result, 영상은 job.result.url을 씁니다.실패 분류
| 시점 | 예 | 처리 |
|---|---|---|
| 접수할 때 | 400, 401, 402, 403, 409, 422, 429, 503 | error.code로 분기합니다. 429 RATE_LIMITED는 기다렸다 재시도, 429 SPEND_LIMIT_EXCEEDED는 한도 조정, 402는 사용자에게 충전 안내, 503은 잠시 뒤 같은 키로 재시도. |
| 진행 중 | 작업이 failed로 끝남 | error/failure의 code와 retryable을 보고, 새 멱등 키로 다시 접수할지 정합니다. 환불 규칙은 오류와 지출입니다. |
| 종료는 했지만 | 결과 링크 만료나 삭제 | 다시 조회합니다. 삭제된 결과는 링크가 없습니다. |
| 알림 전달 | 웹훅이 오지 않음 | 일정 시간 뒤 조회로 확인합니다. |
출시 전 점검표
- 키가 서버에만 있다.
- 모든 접수에
maxCherry와 멱등 키가 있다. - 키에 지출 한도와 최소 권한을 걸었다.
- 웹훅 서명을 원문으로 검증하고 중복을 걸러 낸다.
- 종료 상태가 성공인지 확인한다.
- 429를
Retry-After로 처리한다. - 오류 로그에
requestId를 남기고 키는 남기지 않는다.