🤖

[boto3] NextTokenを使って情報取得

2022/08/01に公開約2,000字

このページについて

boto3で NextToken を使う場面があったので、 NextToken とは?について簡単にメモします。

経緯

このGlueジョブ実行履歴取得スクリプトを作成している際に、 NextToken の使い方を確認しました。

https://zenn.dev/isseeeeey55/articles/e46c0e4cbd89bd

boto3の get_job_runs を使用していますが、実際のジョブ実行履歴数とスクリプトで取得したジョブ実行履歴数に乖離がありました。

そこで確認したところ、最大で取得できる結果( MaxResults )が200件までで、それ以上取得したい時に NextToken を使う必要がありました。

ちなみに、boto3のドキュメントには記載がなく実行結果から確認しています。
また、awscliで GetJobRuns を使うと、 MaxResults は1,000件であり、boto3とは違いました。

参考ドキュメント

  • boto3(get_job_runs)

https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/glue.html#Glue.Client.get_job_runs
  • awscli(get_job_runs)

https://docs.aws.amazon.com/ja_jp/glue/latest/webapi/API_GetJobRuns.html

NextTokenとは

APIによって情報取得を行い、取得上限まで達した場合に、NextToken にトークンが入ってきます。

"NextToken": "eyJOZXh0VGXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX="

この NextToken を使うと、その続きから情報取得できます。
よって、この NextToken がなくなるまでループさせると全件取得できる。

各ドキュメントの説明

  • boto3のドキュメント

NextToken (string) --
A continuation token, if not all requested job runs have been returned.

  • AWSドキュメント

NextToken
A continuation token, if this is a continuation call.
Type: String
Required: No

スクリプト側のサンプル

NextTokenに何か入っている場合は、それを使って情報取得するようにします。

    if next_token is not None and next_token != '':
        response = session.client('glue').get_job_runs(
            JobName = job_name,
            MaxResults = 200,
            NextToken = next_token
        )
    else:
        response = session.client('glue').get_job_runs(
            JobName = job_name,
            MaxResults = 200
        )

Lambdaで使用する際の注意点

今回は一時的に使用するだけのスクリプトだったので問題ではなかったですが、Lambdaで実行する場合は以下の注意点あり。

  • 実行時間が延びるのでタイムアウトに注意。
    • 今回は15分に設定。
  • メモリ使用量も大きく増やす必要があるので注意。
    • 今回は1024MBに設定。
    • 以下のような実行エラーがあり、メモリサイズを調整しています。
RequestId: 6df00cc9-1a0f-4ea5-bce5-38dc27788fa6 Error: Runtime exited with error: signal: killed
Runtime.ExitError

参考記事

https://zenn.dev/jun2021/articles/addad60175934d
https://qiita.com/Fujinamin_D/items/79cb42dff7f3467eee6a
GitHubで編集を提案

Discussion

ログインするとコメントできます