

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# AWS SDK for Go V2 でのエラー処理
<a name="handle-errors"></a>

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

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

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

## エラーのログ記録
<a name="logging-errors"></a>

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

```
import "log"

// ...

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

## サービスクライアントのエラー
<a name="service-client-errors"></a>

 SDK は、サービスクライアントから返されるすべてのエラーを [smithy.OperationError](https://pkg.go.dev/github.com/aws/smithy-go#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 エラーレスポンス
<a name="api-error-responses"></a>

 サービスのオペレーションは、特定のエラーを示すために、モデル化されたエラー型を返す可能性があります。これらのモデル型は `errors.As` で使用することで展開され、オペレーションの失敗が特定のエラーによるものかどうかを判別できます。例えば、Amazon S3 の `CreateBucket` は、同じ名前のバケットが既に存在する場合に [BucketAlreadyExists](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/service/s3/types#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](https://pkg.go.dev/github.com/aws/smithy-go/#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 の取得
<a name="retrieving-request-identifiers"></a>

 AWS サポートへの問い合わせ時には、トラブルシューティングの際にリクエストを識別するリクエスト ID の提供を求められる場合があります。[http.ResponseError](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/aws/transport/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
<a name="s3-request-identifiers"></a>

 Amazon S3 リクエストには、AWS サポートによるリクエストのトラブルシューティングに役立つように、追加の ID が含まれています。[s3.ResponseError](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/service/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
}
```