Python
 Computer >> コンピューター >  >> プログラミング >> Python

Boto3を使ってAWS Glueの全クローラーをページネーション処理する方法

AWS Glueのクローラーは、S3やJDBC接続先などのデータソースを走査し、データカタログへテーブル定義を自動登録する仕組みです。運用が進むとクローラーの数は増えていき、APIは一度ですべての結果を返せないため、レスポンスはページ分割(ページネーション)された形式になります。本記事では、Pythonのboto3ライブラリを使って、AWSアカウント内のAWS Glue Data Catalogに存在するすべてのクローラーをページネーション処理しながら取得する方法を解説します。

やりたいこと

自分のAWSアカウントに作成されたAWS Glue Data Catalog上のすべてのクローラーを、ページネーションを活用して取得します。

課題設定

Pythonのboto3ライブラリを使用し、アカウント内のAWS Glue Data Catalogに存在する全クローラーをページネーション処理で取得すること。

解決のためのアプローチ/アルゴリズム

  1. ステップ1: 例外ハンドリングのため、boto3およびbotocore.exceptionsをインポートします。

  2. ステップ2: 本関数ではmax_itemspage_sizestarting_tokenの3つのパラメータを使用します。

    • max_items:返却するレコードの総数。取得可能なレコード数がmax_itemsを超える場合は、レスポンスにNextTokenが付与され、そこからページネーションを再開できます。

    • page_size:1ページあたりのレコード数。

    • starting_token:ページネーションの開始位置。前回レスポンスから取得したNextTokenを指定します。

  3. ステップ3: boto3でAWSセッションを作成します。デフォルトプロファイルにregion_nameが設定されていることを確認し、未設定の場合はセッション生成時に明示的に指定してください。

  4. ステップ4: glueサービス用のAWSクライアントを作成します。

  5. ステップ5: get_crawlersから、全クローラー情報を扱うpaginatorオブジェクトを生成します。

  6. ステップ6: paginate()を呼び出し、max_itemspage_sizestarting_tokenPaginationConfigパラメータとして渡します。

  7. ステップ7: max_itemspage_sizeの設定に応じた件数のレコードが返されます。

  8. ステップ8: ページネーション処理中に問題が発生した場合は、汎用例外として捕捉・処理します。

サンプルコード

以下のコードを使用すると、アカウント内に作成されたすべてのクローラーをページネーション処理できます。

import boto3
from botocore.exceptions import ClientError

def paginate_through_crawlers(max_items: int = None, page_size: int = None, starting_token: str = None):
    session = boto3.session.Session()
    glue_client = session.client('glue')
    try:
        paginator = glue_client.get_paginator('get_crawlers')
        response = paginator.paginate(
            PaginationConfig={
                'MaxItems': max_items,
                'PageSize': page_size,
                'StartingToken': starting_token
            }
        )
        return response
    except ClientError as e:
        raise Exception("boto3 client error in paginate_through_crawlers: " + str(e))
    except Exception as e:
        raise Exception("Unexpected error in paginate_through_crawlers: " + str(e))

# 1回目の実行
a = paginate_through_crawlers(3, 5)
print(*a)

# 2回目の実行(NextTokenで続きを取得)
for items in a:
    next_token = items['NextToken']
    b = paginate_through_crawlers(3, 5, next_token)

出力結果

1回目の実行では最初のページ(ここでは最大3件)分のクローラー情報が返り、レスポンス末尾にNextTokenが含まれます。このトークンを2回目の呼び出しに渡すことで、続きのページを取得できます。

#1st Run
{'Crawlers': [
  {'Name': 'DailyTest_v1.01', 'Role': 'ds-dev',
   'Targets': {'S3Targets': [{'Path': 's3://**************/UIT_Raw/', 'Exclusions': []}],
               'JdbcTargets': [], 'DynamoDBTargets': [], 'CatalogTargets': []},
   'DatabaseName': 'default', 'State': 'READY', 'TablePrefix': 'test_uit_',
   'CreationTime': datetime.datetime(2020, 11, 23, 17, 50, 20, tzinfo=tzlocal()),
   'LastCrawl': {'Status': 'SUCCEEDED', 'LogGroup': '/aws-glue/crawlers', ...},
   'Version': 10},
  {'Name': 'Client_list', ...},
  {'Name': 'Data Dimension', ...}],
 'NextToken': 'crawlr-wells',
 'ResponseMetadata': {'RequestId': '8a6114ec-************d66',
                      'HTTPStatusCode': 200, 'RetryAttempts': 0}}

#2nd Run
{'Crawlers': [
  {'Name': 'crwlr-cw-etf', 'Role': 'dev-ds-glue-role', ...},
  {'Name': 'crwlr-data-packs', ...},
  {'Name': 'crwlr-data-packs', ...}],
 'NextToken': 'discovery_rep',
 'ResponseMetadata': {'RequestId': '43e0b162-***********',
                      'HTTPStatusCode': 200, 'RetryAttempts': 0}}

※実際のレスポンスには、各クローラーのターゲットパス、スキーマ変更ポリシー、最終クロールのステータスやログストリームなどが詳細に含まれます。上記は主要なフィールドを抜粋したものです。

ポイントまとめ

  • get_paginator('get_crawlers')でページネーターオブジェクトを取得する。
  • PaginationConfigMaxItems(総件数の上限)、PageSize(1ページの件数)、StartingToken(開始位置)を制御する。
  • レスポンスのNextTokenを次回のStartingTokenに渡すことで、全クローラーを漏れなく取得できる。
  1. Boto3を使ってAWS Glueのセキュリティ設定から指定したセキュリティ構成の詳細を取得する方法

    課題Pythonのboto3ライブラリを使用して、AWS Glueセキュリティに存在する指定されたセキュリティ構成(Security Configuration)の詳細情報を取得します。例 − AWS Glueセキュリティに存在する「job-security-settings」というセキュリティ構成の詳細を取得します。解決のためのアプローチとアルゴリズムステップ1 − boto3とbotocoreの例外処理用モジュールをインポートし、例外を適切にハンドリングできるようにします。ステップ2 − security_nameは必須パラメータです。ここには、詳細を取得したいセキュリティ構成の名前を指定

  2. Boto3を使ってAWS Glueのジョブを削除する方法を徹底解説

    AWS Glueは、ETL(抽出・変換・ロード)処理を簡単に実行できるサーバーレスのデータ統合サービスです。本記事では、Pythonのboto3ライブラリを使用して、自分のAWSアカウント内に作成済みのGlueジョブを削除する方法を、ステップごとにわかりやすく解説します。 課題 Pythonのboto3ライブラリを使って、AWSアカウント内に作成されたGlueジョブを削除します。 例: アカウント内に作成された「transfer_from_s3」というGlueジョブを削除します。 解決のためのアプローチとアルゴリズム ステップ1: 例外処理のために、boto3とbotocoreの例外モジュール