

のバージョン 4 (V4) AWS SDK for .NET がリリースされました。

重要な変更とアプリケーションの移行については、[「移行トピック](https://docs.aws.amazon.com/sdk-for-net/v4/developer-guide/net-dg-v4.html)」を参照してください。

 [https://docs.aws.amazon.com/sdk-for-net/v4/developer-guide/net-dg-v4.html](https://docs.aws.amazon.com/sdk-for-net/v4/developer-guide/net-dg-v4.html)

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

# 再試行とタイムアウト
<a name="retries-timeouts"></a>

 AWS SDK for .NET では、 AWS サービスへの HTTP リクエストの再試行回数とタイムアウト値を設定できます。再試行とタイムアウトのデフォルト値がアプリケーションで適切でない場合は、特定の要件に対してそれらの値を調整できますが、それによってアプリケーションの動作にどのように影響するかを理解しておくことが重要です。

再試行とタイムアウトに使用する値を決定するには、以下の点を検討します。
+ ネットワーク接続が低下したり、 AWS サービスにアクセスできない場合、 AWS SDK for .NET とアプリケーションはどのように応答する必要がありますか? 呼び出しがすぐに失敗するか、またはユーザーに代わって呼び出しが再試行され続けるか、どちらが適切か。
+ 応答性が必要なユーザー対応アプリケーションまたはウェブサイトであるか、またはレイテンシーの増加に耐性があるバックグラウンド処理ジョブであるか。
+ アプリケーションが低レイテンシーの信頼性の高いネットワークでデプロイされているか、または信頼性が低い接続でリモートの場所にデプロイされているか。

## 再試行
<a name="retries"></a>

### 概要:
<a name="w2aac11c23c11b5"></a>

 AWS SDK for .NET は、サーバー側のスロットリングまたは接続の切断が原因で失敗したリクエストを再試行できます。サービス設定クラスの 2 つのプロパティを使用して、サービスクライアントの再試行動作を指定します。サービス設定クラスは、[AWS SDK for .NET API リファレンス](https://docs.aws.amazon.com/sdkfornet/v4/apidocs/)の抽象 [Amazon.Runtime.ClientConfig](https://docs.aws.amazon.com/sdkfornet/v4/apidocs/items/Runtime/TClientConfig.html) クラスからこれらのプロパティを継承します。
+ `RetryMode` では、[Amazon.Runtime.RequestRetryMode](https://docs.aws.amazon.com/sdkfornet/v4/apidocs/items/Runtime/TRequestRetryMode.html) 列挙で定義される 3 つの再試行モードのいずれかを指定します。

  アプリケーションのデフォルト値は、`AWS_RETRY_MODE`環境変数または共有設定ファイルの *retry\$1mode* AWS 設定を使用して制御できます。
+ `MaxErrorRetry` では、サービスクライアントレベルで許可される再試行の回数を指定します。SDK では、指定した回数だけ操作が再試行された後に、失敗となり、例外がスローされます。

  アプリケーションのデフォルト値は、 `AWS_MAX_ATTEMPTS`環境変数または共有設定ファイルの *max\$1attempts* AWS 設定を使用して制御できます。

これらのプロパティの詳細な説明は、[AWS SDK for .NET API リファレンス](https://docs.aws.amazon.com/sdkfornet/v4/apidocs/)の抽象 [Amazon.Runtime.ClientConfig](https://docs.aws.amazon.com/sdkfornet/v4/apidocs/items/Runtime/TClientConfig.html) クラスに記載されています。`RetryMode` の各値は、次の表に示すように、デフォルトでは `MaxErrorRetry` の特定の値に対応します。

|  |  |  | 
| --- |--- |--- |
| Legacy | 10 | 4 | 
| Standard | 10 | 2 | 
| Adaptive (experimental) | 10 | 2 | 

### 行動
<a name="w2aac11c23c11b9"></a>

**アプリケーションの起動時**

アプリケーションの起動時に、`RetryMode` および `MaxErrorRetry` のデフォルト値が SDK によって設定されます。これらのデフォルト値は、他の値を指定しない限り、サービスクライアントを作成するときに使用されます。
+ 環境でプロパティが設定されていない場合は、`RetryMode` のデフォルトが *Legacy* として設定され、`MaxErrorRetry` のデフォルトが上記の表の対応する値で設定されます。
+ 環境で再試行モードが設定されている場合は、その値が `RetryMode` のデフォルトとして使用されます。`MaxErrorRetry` のデフォルトは、最大エラー数の値も環境で設定されていない限り、上記の表の対応する値で設定されます (次の説明を参照)。
+ 環境で最大エラー数の値が設定されている場合は、その値が `MaxErrorRetry` のデフォルトとして使用されます。Amazon DynamoDB はこのルールの例外です。`MaxErrorRetry` のデフォルトの DynamoDB 値は、常に上記の表の値になります。

**アプリケーションの実行時**

サービスクライアントを作成すると、`RetryMode` および `MaxErrorRetry` の次のデフォルト値を使用できます。または、前述したように、他の値を指定することもできます。他の値を指定するには、サービスクライアントを作成する際に、[AmazonDynamoDBConfig](https://docs.aws.amazon.com/sdkfornet/v4/apidocs/items/DynamoDBv2/TDynamoDBConfig.html) や [AmazonSQSConfig](https://docs.aws.amazon.com/sdkfornet/v4/apidocs/items/SQS/TSQSConfig.html) など、サービス設定オブジェクトを作成して含めます。

サービスクライアントの作成後にこれらの値を変更することはできません。

**考慮事項**

再試行が発生すると、リクエストのレイテンシーが増加します。アプリケーションでのリクエストレイテンシーの合計とエラー発生率の制限に基づいて、再試行回数を設定する必要があります。

## タイムアウト
<a name="timeouts"></a>

 AWS SDK for .NET では、サービスクライアントレベルおよびメソッド呼び出しごとにリクエストタイムアウトを設定できます。タイムアウトを設定するには 2 つのメカニズムがあり、以降のセクションで説明します。
+ [非同期呼び出し](#timeouts-async)を使用している場合は、メソッドの `CancellationToken` パラメータを使用できます。
+ [.NET Framework で同期呼び出し](#timeouts-sync-framework)を使用している場合は、抽象 [Amazon.Runtime.ClientConfig](https://docs.aws.amazon.com/sdkfornet/v4/apidocs/items/Runtime/TClientConfig.html) クラスの `Timeout` および `ReadWriteTimeout` プロパティを使用できます。

### タイムアウトに `CancellationToken` パラメータを使用する
<a name="timeouts-async"></a>

 AWS SDK for .NET を使用すると、 `CancellationToken`パラメータを使用して非同期呼び出しのリクエストタイムアウトを設定できます。次のコードスニペットは例を示しています。リクエストが 10 秒以内に完了しなかった場合、コードは `System.Threading.Tasks.TaskCanceledException` をスローします。

```
string bucketName = "amzn-s3-demo-bucket";
string path = "pathToBucket";
using (var amazonS3Client = new AmazonS3Client(new AmazonS3Config()))
{
    // Cancel request after 10 seconds
    CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(TimeSpan.FromMilliseconds(10000));
    CancellationToken cancellationToken = cancellationTokenSource.Token;
    ListObjectsV2Request listRequestV2 = new()
    {
        BucketName = bucketName,
        Prefix = path,
    };

    ListObjectsV2Response listResponseV2 = await amazonS3Client.ListObjectsV2Async(listRequestV2, cancellationToken);
}
```

### タイムアウトに `Timeout` および `ReadWriteTimeout` プロパティを使用する
<a name="timeouts-sync-framework"></a>

**注記**  
`Timeout` プロパティは非同期呼び出しには影響しません。非同期呼び出しを使用している場合は、代わりに「[タイムアウトに `CancellationToken` パラメータを使用する](#timeouts-async)」を参照してください。

 AWS SDK for .NET では、リクエストタイムアウトとソケットの読み取り/書き込みタイムアウト値をサービスクライアントレベルで設定できます。これらの値は、抽象 [Amazon.Runtime.ClientConfig](https://docs.aws.amazon.com/sdkfornet/v4/apidocs/items/Runtime/TClientConfig.html) クラスの `Timeout` プロパティと `ReadWriteTimeout` プロパティで指定されます。これらの値は、 AWS サービスクライアントオブジェクトによって作成された [HttpWebRequest](https://learn.microsoft.com/en-us/dotnet/api/system.net.httpwebrequest) オブジェクトの `Timeout`および `ReadWriteTimeout`プロパティとして渡されます。デフォルトでは、`Timeout` の値は 100 秒であり、`ReadWriteTimeout` の値は 300 秒です。

ネットワークのレイテンシーが大きい場合、または操作が再試行される条件が存在する場合に、長いタイムアウト値と大きい再試行回数を使用すると、一部の SDK 操作が応答していないように見えることがあります。

**注記**  
ポータブルクラスライブラリ (PCL) をターゲット AWS SDK for .NET とする のバージョンは、 クラスではなく [HttpClient](https://learn.microsoft.com/en-us/dotnet/api/system.net.http.httpclient) `HttpWebRequest` クラスを使用し、[タイムアウト](https://learn.microsoft.com/en-us/dotnet/api/system.net.http.httpclient.timeout)プロパティのみをサポートします。

デフォルトのタイムアウト値の例外を次に示します。これらの値は、タイムアウト値を明示的に設定するとオーバーライドされます。
+ [AmazonS3Client.PutObjectAsync()](https://docs.aws.amazon.com/sdkfornet/v4/apidocs/items/S3/MS3PutObjectAsyncPutObjectRequestCancellationToken.html)、[AmazonS3Client.UploadPartAsync()](https://docs.aws.amazon.com/sdkfornet/v4/apidocs/items/S3/MS3UploadPartAsyncUploadPartRequestCancellationToken.html)、[AmazonGlacierClient.UploadArchiveAsync()](https://docs.aws.amazon.com/sdkfornet/v4/apidocs/items/Glacier/MGlacierUploadArchiveAsyncUploadArchiveRequestCancellationToken.html) など、呼び出されるメソッドによってストリームがアップロードされると、`Timeout` および `ReadWriteTimeout` は最大値に設定されます。
+ .NET Framework をターゲット AWS SDK for .NET とする のバージョンは`Timeout`、すべての [AmazonS3Client](https://docs.aws.amazon.com/sdkfornet/v4/apidocs/items/S3/TS3Client.html) および [AmazonGlacierClient](https://docs.aws.amazon.com/sdkfornet/v4/apidocs/items/Glacier/TGlacierClient.html) オブジェクトの最大値`ReadWriteTimeout`に と を設定します。
+ ポータブルクラスライブラリ (PCL) と .NET Core をターゲット AWS SDK for .NET とする のバージョンは、すべての [AmazonS3Client](https://docs.aws.amazon.com/sdkfornet/v4/apidocs/items/S3/TS3Client.html) および [AmazonGlacierClient](https://docs.aws.amazon.com/sdkfornet/v4/apidocs/items/Glacier/TGlacierClient.html) オブジェクトの最大値`Timeout`に設定されます。

次の例では、*標準*再試行モード、3 回の最大再試行、10 秒のタイムアウト、および 10 秒の読み取り/書き込みタイムアウト (該当する場合) を指定する方法を示しています。[AmazonS3Client](https://docs.aws.amazon.com/sdkfornet/v4/apidocs/items/S3/TS3Client.html) コンストラクタには [AmazonS3Config](https://docs.aws.amazon.com/sdkfornet/v4/apidocs/items/S3/TS3Config.html) オブジェクトが指定されています。

```
var s3Client = new AmazonS3Client(
  new AmazonS3Config
  {
    Timeout = TimeSpan.FromSeconds(10),
    // NOTE: The following property is obsolete for
    //       versions of the AWS SDK for .NET that target .NET Core.
    ReadWriteTimeout = TimeSpan.FromSeconds(10),
    RetryMode = RequestRetryMode.Standard,
    MaxErrorRetry = 3
  });
```