体系的なアプローチ
Box APIのエラーのほとんどは、無効なトークン、スコープの欠落、アプリがアクセスできない項目、形式が正しくないリクエスト、あるいは一過性のサーバー側の問題といった、ごく少数の原因のいずれかに起因しています。コードを変更する前に、エラーが発生している処理の流れを、個別にテスト可能な、小さな単位に分割してください。- 認証。アプリでアクセストークンを取得できますか? そのトークンは、使用している認証方式 (OAuth 2.0、JWT、またはクライアント資格情報許可) に適合したタイプですか?
- 承認。トークンには、エンドポイントが必要とするスコープが含まれていますか? サービスアカウントやユーザーは、対象の項目にアクセスできますか?
- リクエストの作成。URL、HTTPメソッド、ヘッダーの設定、および本文は、APIリファレンスで指定されている内容と完全に一致していますか?
- サーバーのレスポンス。どのようなHTTPステータスコードとBoxエラーコードが返されましたか? 一過性のエラーであった場合、リクエストは正しく再試行されましたか?
- ダウンストリームへの副次的影響。Webhookやワーカーから他のシステムを呼び出した場合、正常に実行されましたか?
curlやPostmanなどのツールを使用して、各ステップを個別にテストしてください。
APIレスポンスの調査
Boxは、ほとんどの4xxおよび5xxレスポンスに対して、構造化されたエラーオブジェクトを返します。レスポンス本文とレスポンスヘッダーは必ずログに記録してください。これらは、収集できる最も有用な証拠となります。
Box APIのレスポンスのほとんどには、
box-request-idというレスポンスヘッダーも含まれています。これは、エラー本文内のrequest_idフィールドとは異なる値です。可能であれば、両方を取得してください。再試行とタイムアウトの処理
すべてのエラーが恒久的なものとは限りません。一過性のエラーに対しては再試行を行うことが適切ですが、恒久的なエラーに対しては、処理を中止して呼び出し元にその旨を通知する方が適切です。恒久的なエラーに対して再試行を行うと、クォータを無駄に消費し、機能停止が拡大する恐れがあります。再試行すべきレスポンス
ジッターによる指数バックオフの使用
再試行する際は、すでに負荷がかかっているサービスに再試行が集中しないよう、試行間の待機時間を長めにします。シンプルな方法としては、base * 2^attempt秒にわずかなランダム遅延 (ジッター) を加えた時間 (上限あり) だけ待機することで、並列ワーカーによるサンダリングハード現象を防ぎます。
retry-afterヘッダーが含まれている場合、ユーザーが独自に設定したバックオフ値を使用するのではなく、その秒数以上待ってから再試行します。
適切なリクエストタイムアウトの設定
処理に時間のかかるリクエストはワーカーのリソースを占有し、エラーの発見を妨げます。アプリからBoxへのすべてのHTTP呼び出しに明示的なタイムアウトを設定し、無期限に待機するのではなく、タイムアウトと同時に再試行するようにします。エンドポイントに合わせて適切な値を選択してください。小さなJSONデータを読み取る場合にはタイムアウトを短く設定できますが、アップロードやAI抽出の呼び出しにはさらに長い時間が必要です。Box SDKを使用する場合、自動再試行と指数バックオフの機能が組み込み済みです。安全な再試行の実施
GETの再試行は常に安全です。POST、PUT、またはDELETEの再試行は、元のリクエストが実際に成功していてもレスポンスが失われていた場合、重複が発生する可能性があります。こうした再試行を安全に行うために、以下の点に注意してください。
- 分割アップロードの場合、既存のアップロードセッションを再利用し、影響を受けた部分のみを再アップロードします。を参照してください。
- 再試行した作成リクエストで
409 item_name_in_useが返された場合、それが処理フローに合致するのであれば、実際の競合ではなく元のリクエストがすでに成功していると見なします。たとえば、POST /files/contentを再試行してitem_name_in_useが返された場合は、親フォルダを表示して、先ほどアップロードしようとしたファイルを探します。ほとんどの場合、レスポンスが失われる前に最初の試行は正常に保存されています。 GET以外のリクエストを再試行する際には、再試行の前にそのリソースがすでに存在していることを確認してください。たとえば、ファイルを再アップロードする前に、宛先フォルダに対してGET /folders/:id/itemsを呼び出し、ファイル名とサイズを比較します。コラボレーションを再作成する前に、GET /folders/:id/collaborationsを呼び出します。
App Diagnosticsツールの使用
ローカルで問題を再現できない場合や、リクエストについてBoxでどのような情報が記録されているかを正確に確認したい場合は、開発者コンソールからを実行します。 このレポートでは、選択した24時間の枠内でアプリケーションが行ったすべてのAPIコールに関する.csvがエクスポートされます。各コールに関する以下の情報が含まれます。
- Boxが返したHTTPステータスコード。
- APIリクエストの継続時間。
API Request ID— これをBoxサポートに送れば、対象のリクエストを確認できます。- リソース、サブリソース、HTTPメソッド、およびタイムスタンプ。
- リクエストがBoxに届いたかどうかを確認する。
- ユーザー自身のログに記録されなかった、失敗した呼び出しのリクエストIDを特定する。
- 呼び出し量を予想されるパターンと比較する (例: 再試行が急増していないかを確認する)。
- Boxサポートチームに対し、調査に必要な正確な呼び出し情報を提供する。
Boxサポートに提供するリクエストIDの取得
Boxサポートへのエスカレーションが必要な場合は、Boxのエラーレスポンス全文と、以下のいずれかの情報を1つ以上送ってください。- エラーレスポンス本文に含まれる
request_idの値。 - 失敗した呼び出しの
box-request-idレスポンスヘッダー。 - App Diagnosticsレポートの
API Request ID列。
よくあるシナリオのデバッグ
以下のチェックリストには、ほとんどのアプリで最初に発生するエラー状態が網羅されています。認証およびトークンの問題
UI側の承認エラー (管理コンソールのメッセージ) については、を参照してください。
権限およびアクセスの問題
レート制限と容量の問題
Webhookの問題
Boxステータスページの確認
関連性のない複数の呼び出しで5xxエラーが発生し始めた場合、作業中のコードを調べる前に、status.box.comで既知のインシデントが発生していないか確認してください。Boxでインシデントが発生している場合、通常は作業を中断し、既存の再試行ロジックを実行して復帰を待つことをお勧めします。
次の手順
- で、エラーコードの詳細なリストを確認します。
- の設定に合わせて、再試行ポリシーを調整します。
- 次回に予期せぬエラーが発生した際は、を実行してください。
