ページネーター - AWS SDK for .NET

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

ページネーター

一部の AWS サービスでは、大量のデータを収集して保存し、 のAPI呼び出しを使用して取得できます AWS SDK for .NET。1 回のAPI呼び出しで取得するデータ量が大きすぎる場合は、ページ分割 を使用して結果をより管理しやすい部分に分割できます。

ページ分割を実行できるようにするために、 の多くのサービスクライアントのリクエストオブジェクトとレスポンスオブジェクトには、継続トークン (通常は ) SDKが用意されていますNextToken。また、このようなサービスクライアントの一部では、ページネーターも使用できます。

ページネーターを使用すると、ループ、状態変数、複数のAPI呼び出しなどを含む継続トークンのオーバーヘッドを回避できます。ページネーターを使用すると、1 行のコード、すなわち foreach ループの宣言によって AWS からデータを取得できます。データを取得するために複数のAPI呼び出しが必要な場合は、ページネーターがこれを処理します。

ページネーターの使用の可否

すべてのサービスでページネーターを使用できるわけではありません。サービスが特定の のページネーターを提供するかどうかを判断する 1 つの方法は、 AWS SDK for .NET API リファレンス のサービスクライアントクラスの定義を調べるAPIことです。

例えば、AmazonCloudWatchLogsClientクラスの定義を調べると、 Paginatorsプロパティが表示されます。これは、Amazon CloudWatch Logs のページネーターを提供する プロパティです。

ページネーターを使用するメリット

ページネーターには、完全なレスポンスを表示するプロパティが含まれています。また、通常、主な結果であるレスポンスの最も興味深い部分へのアクセスを有効にする 1 つ以上のプロパティも含まれています。

例えば、AmazonCloudWatchLogsClient前述の では、 Paginator オブジェクトにはAPI呼び出しからの完全なDescribeLogGroupsResponseオブジェクトを含む Responsesプロパティが含まれています。特に、この Responses プロパティには、ロググループのコレクションが含まれています。

また、ページネーターオブジェクトにも、LogGroups という名前の主な結果が 1 つ含まれています。このプロパティにはレスポンスのロググループ部分のみが格納されています。この主な結果が含まれていることで、多くの状況でコードを減らして簡素化できます。

同期と非同期のページ分割

ページネーターでは、ページ分割の同期と非同期の両方の仕組みを利用できます。同期ページ分割は で利用できます。NET Framework 4.7.2 (以降) プロジェクト。非同期ページ分割は で利用できます。NET コアプロジェクト (。NET Core 3.1、.NET 5 など)。

非同期オペレーションと のため。NET コアが推奨されます。次の例では、非同期ページ分割を示しています。同期ページ分割と を使用して同じタスクを実行する方法に関する情報。NET Framework 4.7.2 (以降) は、 の例の後に示されていますページネーターに関する追加の考慮事項

次の例は、 AWS SDK for .NET を使用してロググループのリストを表示する方法を示しています。比較のために、この例では、ペジネーターを使用した方法と、使用しない方法の両方を示します。後で示す完全なコードを確認する前に、次のスニペットを検討してください。

ページネーターなしで CloudWatch ロググループを取得する

// Loop as many times as needed to get all the log groups var request = new DescribeLogGroupsRequest{Limit = LogGroupLimit}; do { Console.WriteLine($"Getting up to {LogGroupLimit} log groups..."); var response = await cwClient.DescribeLogGroupsAsync(request); foreach(var logGroup in response.LogGroups) { Console.WriteLine($"{logGroup.LogGroupName}"); } request.NextToken = response.NextToken; } while(!string.IsNullOrEmpty(request.NextToken));

ページネーターを使用して CloudWatch ロググループを取得する

// No need to loop to get all the log groups--the SDK does it for us behind the scenes var paginatorForLogGroups = cwClient.Paginators.DescribeLogGroups(new DescribeLogGroupsRequest()); await foreach(var logGroup in paginatorForLogGroups.LogGroups) { Console.WriteLine(logGroup.LogGroupName); }

これら 2 つのスニペットの結果はまったく同じであるため、ページネータを使用する利点が明確になります。

注記

完全なコードをビルドして実行する前に、環境とプロジェクトがセットアップされていることを確認してください。

非同期ページネーターは IAsyncEnumerableインターフェイスを使用するため、Microsoft.Bcl.AsyncInterfaces NuGet package が必要になる場合があります。

コード全文

このセクションでは、例に関連する参考資料とコードの全文を示します。

NuGet パッケージ:

プログラミング要素:

using System; using System.Threading.Tasks; using Amazon.CloudWatchLogs; using Amazon.CloudWatchLogs.Model; namespace CWGetLogGroups { class Program { // A small limit for demonstration purposes private const int LogGroupLimit = 3; // // Main method static async Task Main(string[] args) { var cwClient = new AmazonCloudWatchLogsClient(); await DisplayLogGroupsWithoutPaginators(cwClient); await DisplayLogGroupsWithPaginators(cwClient); } // // Method to get CloudWatch log groups without paginators private static async Task DisplayLogGroupsWithoutPaginators(IAmazonCloudWatchLogs cwClient) { Console.WriteLine("\nGetting list of CloudWatch log groups without using paginators..."); Console.WriteLine("------------------------------------------------------------------"); // Loop as many times as needed to get all the log groups var request = new DescribeLogGroupsRequest{Limit = LogGroupLimit}; do { Console.WriteLine($"Getting up to {LogGroupLimit} log groups..."); DescribeLogGroupsResponse response = await cwClient.DescribeLogGroupsAsync(request); foreach(LogGroup logGroup in response.LogGroups) { Console.WriteLine($"{logGroup.LogGroupName}"); } request.NextToken = response.NextToken; } while(!string.IsNullOrEmpty(request.NextToken)); } // // Method to get CloudWatch log groups by using paginators private static async Task DisplayLogGroupsWithPaginators(IAmazonCloudWatchLogs cwClient) { Console.WriteLine("\nGetting list of CloudWatch log groups by using paginators..."); Console.WriteLine("-------------------------------------------------------------"); // Access the key results; i.e., the log groups // No need to loop to get all the log groups--the SDK does it for us behind the scenes Console.WriteLine("\nFrom the key results..."); Console.WriteLine("------------------------"); IDescribeLogGroupsPaginator paginatorForLogGroups = cwClient.Paginators.DescribeLogGroups(new DescribeLogGroupsRequest()); await foreach(LogGroup logGroup in paginatorForLogGroups.LogGroups) { Console.WriteLine(logGroup.LogGroupName); } // Access the full response // Create a new paginator, do NOT reuse the one from above Console.WriteLine("\nFrom the full response..."); Console.WriteLine("--------------------------"); IDescribeLogGroupsPaginator paginatorForResponses = cwClient.Paginators.DescribeLogGroups(new DescribeLogGroupsRequest()); await foreach(DescribeLogGroupsResponse response in paginatorForResponses.Responses) { Console.WriteLine($"Content length: {response.ContentLength}"); Console.WriteLine($"HTTP result: {response.HttpStatusCode}"); Console.WriteLine($"Metadata: {response.ResponseMetadata}"); Console.WriteLine("Log groups:"); foreach(LogGroup logGroup in response.LogGroups) { Console.WriteLine($"\t{logGroup.LogGroupName}"); } } } } }

ページネーターに関する追加の考慮事項

  • ページネーターは複数回使用できない

    コード内の複数の場所に特定の AWS ページネーターの結果が必要な場合は、ページネーターオブジェクトを複数回使用しないでください。代わりに、使用する必要があるたびに新しいページネーターを作成してください。この概念は、前の DisplayLogGroupsWithPaginators メソッドの例のコードに示されています。

  • 同期ページ分割

    同期ページ分割は で使用できます。NET Framework 4.7.2 (以降) プロジェクト。

    警告

    2024 年 8 月 15 日以降、 AWS SDK for .NET は のサポートを終了します。NET Framework 3.5 および では、最小 が変更されます。NET 4.7.2 へのフレームワークバージョン。詳細については、ブログ記事の「 で予定されている重要な変更」を参照してください。NET のフレームワーク 3.5 および 4.5 ターゲット AWS SDK for .NET

    これを表示するには、 を作成します。NET Framework 4.7.2 (以降) は、前述のコードをプロジェクトしてコピーします。次に、次の例に示すように、2 つの foreach ページネータコールから await キーワードのみを削除します。

    /*await*/ foreach(var logGroup in paginatorForLogGroups.LogGroups) { Console.WriteLine(logGroup.LogGroupName); }

    プロジェクトをビルドして実行し、非同期ページ分割の結果と同じ結果が生成されることを確認します。