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.OperationErrorOperationError により、基となるエラーに関連付けられたサービス名やオペレーション名などのコンテキスト情報が提供されます。この情報は、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.ResponseErrorServiceRequestID() メソッドを呼び出すことで、エラーレスポンスに関連付けられたリクエスト 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.ResponseErrorServiceRequestID() および 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 }