エラーをプロアクティブに解釈して対応することで、より一貫したユーザー エクスペリエンスを提供します。自動化されたクラウド ワークフローを開発する場合でも、リモート API とやり取りする場合でも、Rust クライアント ライブラリを使用すると、エラーを適切に処理できます。このガイドでは、次の方法について説明します。
- エラーを処理する: エラータイプを検査し、サービス ステータス コードに基づいてアプリケーション ロジックを分岐します。たとえば、
NotFoundエラーが発生したときに、不足しているリソースを作成します。 - エラーの詳細を確認する: サービスから返されたリッチなエラーの詳細(不正な リクエスト フィールドの違反や割り当ての失敗など)を抽出して検査し、 Google Cloud サービスを 使用して API の問題をトラブルシューティングし、実行時の動作を動的に調整します。
- バインディング エラーを解決する: 無効または欠落しているリクエスト フィールドが原因で発生するクライアントサイドの HTTP バインディング エラーを解釈して解決し、リクエストがサービスにスムーズに到達するようにします。
前提条件
このガイドでは、 Secret Manager サービスと Cloud Natural Language APIを使用してエラー処理を示します。例を実行するには、まず次の操作を行います。
- Secret Manager サービスを有効にする。
- Cloud Natural Language API を有効にする。
- 認証を設定する。
依存関係
次のコマンドを使用して、必要な依存関係を Cargo.toml ファイルに追加します。
cargo add google-cloud-secretmanager-v1 google-cloud-gax crc32c google-cloud-language-v2
エラーを処理する
Rust クライアント ライブラリを使用すると、エラーを表面化して対応できます。たとえば、エラー検出を使用して動作を分岐できます。クラウド サービスの一般的なパターンは、コンテナが存在するかのようにリソースを使用し、エラーが発生した場合にのみコンテナを作成することです。通常、コンテナが存在する場合、このアプローチはリクエストを行う前にコンテナが存在するかどうかを確認するよりも効率的です。
次の例は、Secret Manager シークレットの更新を試行したときにエラーをキャッチし、存在しない場合は作成することで、不足しているリソースを処理する方法を示しています。
新しい Secret バージョンを作成してみます。
update_attemptが成功した場合は、成功した結果を出力して返します。update_attemptが失敗した場合は、失敗の原因を明確にする必要があります。リクエストが失敗する理由は、接続の切断や認証トークンのエラーなど、さまざまなことが考えられます。再試行ポリシーは、これらのエラーのほとんどに対応できます。サービスから返されたエラーを探します。不足している Secret に対応するエラーを探します。
「見つからない」エラー(
Code::NotFound)が発生した場合は、Secret の作成を試みます。Secret バージョンをもう一度追加してみてください。今回は、失敗した場合はエラーを返します。
コードサンプル: メイン関数(sample)
この例の完全なコードは、メイン オーケストレーション関数(sample)と、その 2 つのヘルパー メソッド(update_attempt と create_secret)の 3 つの部分に分かれています。
sample 関数は、Secret に新しいバージョンを追加しようとします。クライアントから返されたエラーをキャッチし、エラーが Code::NotFound エラーかどうかを確認します。Secret が見つからない場合、関数は最初に不足していた Secret を作成し、更新を再試行します。
コードサンプル: ヘルパー メソッド(update_attempt)
ヘルパー メソッド update_attempt は、Secret バージョンを追加しようとし、ペイロード データの CRC32c チェックサムを計算します。
コードサンプル: ヘルパー メソッド(create_secret)
ヘルパー メソッド create_secret は、不足している Secret を作成し、カスタマイズされた再試行ポリシーを構成します。
エラーの詳細を確認する
一部の Google Cloud サービスでは、リクエストが失敗した場合に追加のエラーの詳細が含まれます。
トラブルシューティングに役立つように、Rust クライアント ライブラリには、std::fmt::Display を使用してエラーをフォーマットする際に、これらの詳細が含まれています。これらの詳細を調べて、アプリケーションの動作を適宜変更できます。
サービスから返されたエラーにのみ詳細情報が含まれます。クライアント
ライブラリは、さまざまな種類のエラーの詳細を含む
StatusDetails
列挙型を返します。
エラーの詳細を抽出する
この例では、 Cloud Natural Language API に意図的に不正なリクエストを送信し、結果のエラーを調べます。
クライアントを作成します。
リクエストを送信します(この例では、キー フィールドがありません)。
標準の Rust 関数を使用して、結果からエラーを抽出します。 エラータイプは、すべてのエラーの詳細を人が読める形式で出力します。
出力は次のようになります。
request failed with error Error {
kind: Service {
status_code: Some(
400,
),
headers: Some(
{
"vary": "X-Origin",
"vary": "Referer",
"vary": "Origin,Accept-Encoding",
"content-type": "application/json; charset=UTF-8",
"date": "Sat, 24 May 2025 17:19:49 GMT",
"server": "scaffolding on HTTPServer2",
"x-xss-protection": "0",
"x-frame-options": "SAMEORIGIN",
"x-content-type-options": "nosniff",
"alt-svc": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000",
"accept-ranges": "none",
"transfer-encoding": "chunked",
},
),
status: Status {
code: InvalidArgument,
message: "One of content, or gcs_content_uri must be set.",
details: [
BadRequest(
BadRequest {
field_violations: [
FieldViolation {
field: "document.content",
description: "Must have some text content to annotate.",
reason: "",
localized_message: None,
_unknown_fields: {},
},
],
_unknown_fields: {},
},
),
],
},
},
}
プログラムでエラーの詳細を確認する
プログラムでエラーの詳細を確認する必要がある場合があります。この例では、データ構造をトラバースして、最も関連性の高いフィールドを出力します。
サービスから返されたエラーにのみ詳細情報が含まれるため、まずエラーをクエリして、正しいエラータイプが含まれているかどうかを確認します。含まれている場合は、エラーに関する上位レベルの情報を分解できます。
詳細を反復処理します。
前述のように、クライアント ライブラリは、さまざまな種類のエラーの詳細を含む
StatusDetails
列挙型を返します。この例では、BadRequest エラーのみを調べます。
BadRequest には、違反しているフィールドのリストが含まれています。各項目の詳細を反復処理して出力できます。
このような情報は、開発中に役立ちます。
StatusDetails などの
QuotaFailure の他のブランチは、実行時にアプリケーションをスロットリングするのに役立ちます。
予想される出力
エラーの詳細の出力は次のようになります。
status.code=400, status.message=One of content, or gcs_content_uri must be set., status.status=Some("INVALID_ARGUMENT")
the request field document.content has a problem: "Must have some text content to annotate."
コードサンプル: エラーの詳細を確認する
sample 関数は、意図的に無効なリクエストを Cloud Natural Language API に送信して、サービス エラーを生成します。次に、エラーをキャッチし、プログラムで StatusDetails を抽出して、特定の BadRequest フィールドの違反を検査して出力します。
バインディング エラーを解決する
HTTP を使用して Google Cloud サービスにリクエストを送信する場合、リクエストは Uniform Resource Identifier(URI)を使用してリソースを指定します。一部の RPC は複数の URI に対応しており、リクエストの内容によって使用される URI が決まります。
クライアント ライブラリは、考えられるすべての URI を考慮し、URI が機能しない場合にのみバインディング エラーを返します。通常、これはフィールドが欠落しているか、形式が無効な場合に発生します。
リクエストで、考えられる URI の有効な形式を含むフィールドを指定できない場合は、バインディング エラーが発生する可能性があります。
Error: cannot find a matching binding to send the request: at least one of the
conditions must be met: (1) field `name` needs to be set and match the template:
'projects/*/secrets/*' OR (2) field `name` needs to be set and match the
template: 'projects/*/locations/*/secrets/*'
上の例のエラーは、リソースの名前を指定せずにリソースの詳細を取得しようとしたために発生しました。具体的には、name フィールド
GetSecretRequest
は必須ですが、この例では設定されていません。
バインディング エラーを修正する方法
エラーを修正するには、エラー メッセージに表示されているテンプレートのいずれかに一致するように、必須フィールドを設定します。
'projects/*/secrets/*''projects/*/locations/*/secrets/*'
どちらのテンプレートでも、クライアント ライブラリはサーバーにリクエストを送信できます。たとえば、次のコードは最初のテンプレートと一致します。
または、次のコードは 2 番目のテンプレートと一致します。
テンプレートを解釈する
バインディング エラーのエラー メッセージには、リクエスト フィールドに使用できる値を示すテンプレート文字列が含まれています。ほとんどのテンプレート文字列には、* と ** が
フィールド値に一致するワイルドカードとして含まれています。
単一のワイルドカード
* ワイルドカードは、/ のない空でない文字列を意味します。正規表現 [^/]+ と考えることができます。
次に例を示します。
| テンプレート | 入力 | 照合しますか? |
|---|---|---|
* |
simple-string-123 |
true |
projects/* |
projects/p |
true |
projects/*/locations |
projects/p/locations |
true |
projects/*/locations/* |
projects/p/locations/l |
true |
* |
""(空) |
false |
* |
string/with/slashes |
false |
projects/* |
projects/(空) |
false |
projects/* |
projects/p/(余分なスラッシュ) |
false |
projects/* |
projects/p/locations/l |
false |
projects/*/locations |
projects/p |
false |
projects/*/locations |
projects/p/locations/l |
false |
2 個のワイルドカード
あまり一般的ではありませんが、** ワイルドカードは任意の文字列を意味します。文字列は
空にすることも、任意の数のスラッシュ(/)を含めることもできます。
正規表現 .*と考えることができます。
テンプレートが /** で終わる場合、最初のスラッシュは省略可能です。
| テンプレート | 入力 | 照合しますか? |
|---|---|---|
** |
"" |
true |
** |
simple-string-123 |
true |
** |
string/with/slashes |
true |
projects/*/** |
projects/p |
true |
projects/*/** |
projects/p/locations |
true |
projects/*/** |
projects/p/locations/l |
true |
projects/*/** |
locations/l |
false |
projects/*/** |
projects//locations/l |
false |
バインディング エラーを検査する
プログラムでエラーを検査する必要がある場合は、バインディング エラーかどうかを確認し、BindingError にダウンキャストします。
次のステップ
- 再試行ポリシーの構成について学習する。