この記事では、AWS LambdaのPythonプログラムでBoto3のPaginatorを利用する方法について紹介します。
Paginatorとは
Paginatorとは、AWS Boto3ライブラリが提供する機能で、大量のデータを分割して取得する際に便利です。
これによりコードが簡潔になり、修正や機能追加、他の開発者がコードを読む際の負担を減らす事ができます。
なぜPaginatorを利用するのか
Boto3のAPIの中には、すべての結果を一度の実行で返すことができないものがあります。
特に、大量のデータを扱う場合、NextTokenといった戻り値を利用した複数回のAPI実行が必要となります。
Paginatorを利用することで、これらの処理を自動化し、簡潔なコードで実装することができます。
InspectorのAPIを使用した失敗例
エラーが発生するコード
ここでは、Amazon Inspectorを使用して検出結果一覧を取得する際の失敗例を紹介します。
※ Amazon Inspectorは、ソフトウェアやネットワークの状態をスキャンして、脆弱性を重大度別に管理するサービスです。
import boto3 def lambda_handler(event, context): inspector_client = boto3.client('inspector2') high_finding_list = [] next_token = "" while(True): response = inspector_client.list_findings( filterCriteria={ 'severity': [ { 'comparison': 'EQUALS', 'value': 'HIGH' } ] }, maxResults=100, nextToken=next_token, ) high_finding_list.extend(response['findings']) if 'nextToken' in response: next_token = response['nextToken'] else: break
エラー内容
「list_findings」のような一部関数では、上記のコードのようにwhile文を使った処理を実行すると以下のようなエラーが発生します。
"errorMessage": "An error occurred (ValidationException) when calling the ListFindings operation:"
このエラーは、先ほどのコードのnext_tokenをNoneやnullに変更しても解決しません。
この処理では、while文の中で最初に実行される「list_findings」でnextTokenが存在することで失敗しています。
最初の一回をループ外で実行する方法や条件分岐による記述方法もありますが、Paginatorを利用することでより簡潔なコードにすることが可能です。
Paginatorの使い方
Paginatorを利用することでコードが簡潔になり、複雑なループ処理を避けることができます。
前提条件
- 適切なタイムアウトの時間が設定されている
- AWSのLambdaは1回の呼び出しに対して、処理時間が最長15分の制限がある
- 大量のデータを処理するために実行時間の設定を変更する
- 適切なメモリ容量が設定されている
- 大量のデータを処理するために必要なメモリ容量を確保する
- Lambdaのロールに適切な権限を持つポリシーが付与されている
- API呼び出しを行うために、Lambda関数に必要なアクセス権限を設定する
処理が成功するコード
以下に、Paginatorを利用したInspectorの検出結果一覧を取得するコードを示します。
import boto3 def lambda_handler(event, context): inspector_client = boto3.client('inspector2') paginator = inspector_client.get_paginator('list_findings') high_finding_list = [] response_iterator = paginator.paginate( filterCriteria={ 'severity': [ { 'comparison': 'EQUALS', 'value': 'HIGH' } ] } ) for response in response_iterator: high_finding_list.extend(response['findings'])
このコードでは、paginator = inspector_client.get_paginator('list_findings')
のように、実行したいAPIに対してget_paginator
を使用することでPaginatorを利用しています。
また、list_findingsの引数であるfilterCriteriaのように、Paginatorでは通常のAPIと同じ引数を扱うことが可能です。
Paginatorが利用できるAPIは公式ドキュメントに記載がありますので、詳細な利用方法については、Boto3ドキュメントをご確認ください。
まとめ
以上がPaginatorを利用したデータ取得方法となります。
Paginatorを活用することで、AWSリソースからのデータ取得がより効率的に行えるようになります。
日常的にAWSを利用している方でも、特定のユースケースにおいてPaginatorの使い方を知っておくと、より効率的なシステム構築が可能です。
実際にPaginatorが必要になる場合は、Lambdaの実行時間やメモリ容量にもご注意ください。