AWS SDK for Go V2 でのエラー処理 - AWS SDK for Go v2

AWS SDK for Go V2 でのエラー処理

AWS SDK for Go は、Go の error インターフェイス型を満たすエラーを返します。Error() メソッドを使用することで、特別な処理をせずに SDK のエラーメッセージをフォーマットされた文字列として取得できます。SDK から返されるエラーの中には、Unwrap メソッドを実装しているものがあります。Unwrap メソッドは、根本原因となるエラーやエラー連鎖へのアクセスを提供しつつ、追加のコンテキスト情報を付加するために SDK によって使用されます。エラー連鎖を展開して処理するには、Unwrap メソッドを errors.As と共に使用する必要があります。

重要なのは、error インターフェイス型を返す可能性のある関数またはメソッドを呼び出した後、エラーが発生したかどうかをアプリケーション側で確認することです。エラー処理の最も基本的な形式は、次の例のようになります。

if err != nil { // Handle error return }

エラーのログ記録

最も簡単なエラー処理は、エラーメッセージをログ記録または表示してから、アプリケーションを終了するかアプリケーションに制御を戻す、というものです。

import "log" // ... if err != nil { log.Printf("error: %s", err.Error()) return }

サービスクライアントのエラー

SDK は、サービスクライアントから返されるすべてのエラーを smithy.OperationError 型でラップします。この OperationError により、基となるエラーに関連付けられたサービス名やオペレーション名などのコンテキスト情報が提供されます。この情報は、1 つ以上のサービスに対してオペレーションのバッチを実行し、エラー処理を一元化しているアプリケーションに役立ちます。アプリケーションでは、errors.As を使用してこの OperationError メタデータにアクセスできます。

import "log" import "github.com/aws/smithy-go" // ... if err != nil { var oe *smithy.OperationError if errors.As(err, &oe) { log.Printf("failed to call service: %s, operation: %s, error: %v", oe.Service(), oe.Operation(), oe.Unwrap()) } return }

API エラーレスポンス

サービスのオペレーションは、特定のエラーを示すために、モデル化されたエラー型を返す可能性があります。これらのモデル型は errors.As で使用することで展開され、オペレーションの失敗が特定のエラーによるものかどうかを判別できます。例えば、Amazon S3 の CreateBucket は、同じ名前のバケットが既に存在する場合に BucketAlreadyExists エラーを返す可能性があります。

例えば、エラーが BucketAlreadyExists エラーかどうか確認するには次のようにします。

import "log" import "github.com/aws/aws-sdk-go-v2/service/s3/types" // ... if err != nil { var bne *types.BucketAlreadyExists if errors.As(err, &bne) { log.Println("error:", bne) } return }

すべてのサービス API レスポンスエラーは、smithy.APIError インターフェイス型を実装しています。このインターフェイスを使用すると、モデル化されたエラーレスポンスとそうでないレスポンスの両方を処理できます。この型では、サービスから返されたエラーコードおよびメッセージにアクセスできます。さらにこの型では、エラーの原因がクライアント側にあるかサーバー側にあるかも示します (判明している場合)。

import "log" import "github.com/aws/smithy-go" // ... if err != nil { var ae smithy.APIError if errors.As(err, &ae) { log.Printf("code: %s, message: %s, fault: %s", ae.ErrorCode(), ae.ErrorMessage(), ae.ErrorFault().String()) } return }

リクエスト ID の取得

AWS サポートへの問い合わせ時には、トラブルシューティングの際にリクエストを識別するリクエスト ID の提供を求められる場合があります。http.ResponseError を使用して ServiceRequestID() メソッドを呼び出すことで、エラーレスポンスに関連付けられたリクエスト ID を取得できます。

import "log" import awshttp "github.com/aws/aws-sdk-go-v2/aws/transport/http" // ... if err != nil { var re *awshttp.ResponseError if errors.As(err, &re) { log.Printf("requestID: %s, error: %v", re.ServiceRequestID(), re.Unwrap()); } return }

Amazon S3 リクエスト ID

Amazon S3 リクエストには、AWS サポートによるリクエストのトラブルシューティングに役立つように、追加の ID が含まれています。s3.ResponseError を使用し、ServiceRequestID() および ServiceHostID() を呼び出すことで、リクエスト ID とホスト ID を取得できます。

import "log" import "github.com/aws/aws-sdk-go-v2/service/s3" // ... if err != nil { var re s3.ResponseError if errors.As(err, &re) { log.Printf("requestID: %s, hostID: %s request failure", re.ServiceRequestID(), re.ServiceHostID()); } return }