서비스에 끼워 넣기

키 보관부터 출시 전 점검표까지입니다.

전체 구조

내 서비스 서버가 공개 REST로 작업을 접수하고, 웹훅이나 폴링으로 종료를 알아채서 결과를 사용자에게 보여 줍니다. 키는 서버에만 둡니다.

키 보관

  • 키는 서버의 비밀 저장소나 환경변수에만 둡니다. 브라우저나 앱 번들에 넣지 않습니다.
  • 서비스마다 키를 따로 만들고 필요한 기능만 허용합니다.
  • 지출 한도를 걸어 두면 문제가 생겨도 피해가 한도에서 멈춥니다. 키는 서비스마다 따로 두고 한도는 하루 또는 한 달(UTC) 기준입니다.

중복 방지

사용자 요청 하나에 멱등 키 하나를 정합니다. 내 쪽 주문 id나 요청 id에서 만들면 재시도해도 같은 키가 됩니다. 같은 키와 같은 본문은 같은 작업을 돌려주므로, 네트워크 오류 뒤 재전송해도 이중 과금이 없습니다. 같은 키에 본문이 다르면 409입니다.

실행당 지출 상한

모든 접수에 maxCherry를 넣습니다. 서비스가 사용자에게 보여 준 가격에 맞춰 정하면, 서버 쪽 견적이 올라도 그 이상은 쓰이지 않고 400으로 거절됩니다. 후보가 여럿인 요청은 후보 전체의 합계를 넣으세요.

결과 수신

웹훅을 쓰면 다음 순서입니다.
  1. 원문 본문과 서명 헤더로 검증합니다. 실패하면 401을 돌려줍니다.
  2. 이벤트 id로 중복을 거릅니다.
  3. 바로 2xx를 돌려주고 나머지는 큐에서 처리합니다.
  4. 작업 id로 조회해 결과를 가져옵니다.

결과를 화면에 연결하기

조회 응답의 읽기 링크는 15분 뒤 만료됩니다. 링크를 저장하지 말고 보여 줄 때마다 조회하거나, 내 저장소에 파일을 내려받아 보관합니다. 이미지는 outputs[], 오디오는 result, 영상은 job.result.url을 씁니다.

실패 분류

시점예처리
접수할 때400, 401, 402, 403, 409, 422, 429, 503error.code로 분기합니다. 429 RATE_LIMITED는 기다렸다 재시도, 429 SPEND_LIMIT_EXCEEDED는 한도 조정, 402는 사용자에게 충전 안내, 503은 잠시 뒤 같은 키로 재시도.
진행 중작업이 failed로 끝남error/failure의 code와 retryable을 보고, 새 멱등 키로 다시 접수할지 정합니다. 환불 규칙은 오류와 지출입니다.
종료는 했지만결과 링크 만료나 삭제다시 조회합니다. 삭제된 결과는 링크가 없습니다.
알림 전달웹훅이 오지 않음일정 시간 뒤 조회로 확인합니다.

출시 전 점검표

  • 키가 서버에만 있다.
  • 모든 접수에 maxCherry와 멱등 키가 있다.
  • 키에 지출 한도와 최소 권한을 걸었다.
  • 웹훅 서명을 원문으로 검증하고 중복을 걸러 낸다.
  • 종료 상태가 성공인지 확인한다.
  • 429를 Retry-After로 처리한다.
  • 오류 로그에 requestId를 남기고 키는 남기지 않는다.

관련