翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
AWS SDK for Rust でのエラーの処理
AWS SDK for Rust によってエラーが返される仕組みとタイミングを理解することは、SDK を使用して高品質なアプリケーションを構築するために重要なことです。以下のセクションでは、SDK で発生する可能性のあるさまざまなエラーと、その適切な処理方法について説明します。
すべてのオペレーションは、エラータイプが SdkError<E, R = HttpResponse>Result タイプを返します。SdkError は、バリアントと呼ばれるいくつかの可能なタイプを持つ列挙型です。
サービスエラー
最も一般的なエラーのタイプは SdkError::ServiceError
SdkError::ServiceError が発生した場合、リクエストは AWS のサービス に正常に送信されましたが、正常に処理できなかったことを意味します。これは、リクエストのパラメータに含まれるエラーまたはサービス側の問題が原因です。
エラーレスポンスの詳細は、エラーバリアントに含まれています。次の例は、基盤となる ServiceError バリアントを簡単に取得し、さまざまなエラーケースを処理する方法を示しています。
// Needed to access the '.code()' function on the error type: use aws_sdk_s3::error::ProvideErrorMetadata; let result = s3.get_object() .bucket("my-bucket") .key("my-key") .send() .await; match result { Ok(_output) => { /* Success. Do something with the output. */ } Err(err) => match err.into_service_error() { GetObjectError::InvalidObjectState(value) => { println!("invalid object state: {:?}", value); } GetObjectError::NoSuchKey(_) => { println!("object didn't exist"); } // err.code() returns the raw error code from the service and can be // used as a last resort for handling unmodeled service errors. err if err.code() == Some("SomeUnmodeledError") => {} err => return Err(err.into()) } };
エラーメタデータ
すべてのサービスエラーには、サービス固有のトレイトをインポートすることによりアクセスできる追加のメタデータがあります。
-
トレイトは、サービスから返される利用可能な基盤となる生のエラーコードとエラーメッセージへのアクセスを提供します。<service>::error::ProvideErrorMetadata-
Amazon S3 の場合、このトレイトは
aws_sdk_s3::error::ProvideErrorMetadataです。
-
以下のように、サービスエラーのトラブルシューティングに役立つ情報を取得することもできます。
-
トレイトによって拡張メソッドを追加して、サービスによって生成された一意の AWS リクエスト ID を取得します。<service>::operation::RequestId-
Amazon S3 の場合、このトレイトは
aws_sdk_s3::operation::RequestIdです。
-
-
トレイトによって<service>::operation::RequestIdExtextended_request_id()メソッドを追加して、追加の拡張リクエスト ID を取得します。-
一部のサービスでのみサポートされています。
-
Amazon S3 の場合、このトレイトは
aws_sdk_s3::operation::RequestIdExtです。
-
DisplayErrorContext による詳細なエラー出力
SDK におけるエラーは、通常次のような一連の障害の結果として発生します。
-
コネクタによってエラーを返したため、リクエストのディスパッチに失敗しました。
-
認証情報プロバイダーによってエラーを返したため、コネクタはエラーを返しました。
-
認証情報プロバイダーによってサービスを呼び出し、そのサービスがエラーを返したため、エラーが返されました。
-
認証情報リクエストに正しい認可がないため、サービスからエラーが返されました。
デフォルトでは、このエラーの表示は「ディスパッチ失敗」のみを出力します。これには、エラーのトラブルシューティングに役立つ詳細情報が不足しています。SDK for Rust には、DisplayErrorContext というシンプルなエラーレポーターが用意されています。
-
構造体は、完全なエラーコンテキストを出力する機能を追加します。<service>::error::DisplayErrorContext-
Amazon S3 の場合、この構造体は
aws_sdk_s3::error::DisplayErrorContextです。
-
エラーを表示して出力するようにまとめると、DisplayErrorContext は次のようなより詳細なメッセージを表示します。
dispatch failure: other: Session token not found or invalid. DispatchFailure( DispatchFailure { source: ConnectorError { kind: Other(None), source: ProviderError( ProviderError { source: ProviderError( ProviderError { source: ServiceError( ServiceError { source: UnauthorizedException( UnauthorizedException { message: Some("Session token not found or invalid"), meta: ErrorMetadata { code: Some("UnauthorizedException"), message: Some("Session token not found or invalid"), extras: Some({"aws_request_id": "1b6d7476-f5ec-4a16-9890-7684ccee7d01"}) } } ), raw: Response { status: StatusCode(401), headers: Headers { headers: { "date": HeaderValue { _private: H0("Thu, 04 Jul 2024 07:41:21 GMT") }, "content-type": HeaderValue { _private: H0("application/json") }, "content-length": HeaderValue { _private: H0("114") }, "access-control-expose-headers": HeaderValue { _private: H0("RequestId") }, "access-control-expose-headers": HeaderValue { _private: H0("x-amzn-RequestId") }, "requestid": HeaderValue { _private: H0("1b6d7476-f5ec-4a16-9890-7684ccee7d01") }, "server": HeaderValue { _private: H0("AWS SSO") }, "x-amzn-requestid": HeaderValue { _private: H0("1b6d7476-f5ec-4a16-9890-7684ccee7d01") } } }, body: SdkBody { inner: Once( Some( b"{ \"message\":\"Session token not found or invalid\", \"__type\":\"com.amazonaws.switchboard.portal#UnauthorizedException\"}" ) ), retryable: true }, extensions: Extensions { extensions_02x: Extensions, extensions_1x: Extensions } } } ) } ) } ), connection: Unknown } } )