Boto3を使ってAWS Glue Data Catalogの全テーブルをページネーションで取得する方法
問題提起
Pythonのboto3ライブラリを使用して、自分のAWSアカウントに作成されたGlue Data Catalog内のすべてのテーブルを、ページネーション処理を通じて取得する方法を解説します。
解決のためのアプローチとアルゴリズム
ステップ1: 例外処理のために、boto3とbotocoreの例外クラスをインポートします。
ステップ2: 引数について整理します。database_nameは必須ですが、max_items、page_size、starting_tokenは任意のパラメータです。
max_items: 取得するレコードの総数を指定します。利用可能なレコード数がmax_itemsを超える場合、レスポンスにNextTokenが返され、これを使ってページネーションを再開できます。
page_size: 1ページあたりのレコード数を指定します。
starting_token: ページネーションを途中から再開するためのトークンで、前回のレスポンスで取得したNextTokenを指定します。
ステップ3: boto3を使ってAWSセッションを作成します。デフォルトプロファイルにregion_nameが設定されていることを確認してください。設定されていない場合は、セッション作成時に明示的にregion_nameを渡す必要があります。
ステップ4: AWS Glue用のクライアントを作成します。
ステップ5:
get_tables操作用のpaginator(ページネーター)オブジェクトを作成します。ステップ6:
paginate関数を呼び出し、DatabaseNameにデータベース名を、PaginationConfigにMaxItems、PageSize、StartingTokenを渡します。ステップ7: max_itemsとpage_sizeの設定に応じた件数のレコードが返されます。
ステップ8: ページネーション処理中にエラーが発生した場合は、汎用例外を捕捉して適切にハンドリングします。
サンプルコード
以下のコードを使用すると、アカウント内に作成されたすべてのテーブルをページネーションで取得できます。
import boto3
from botocore.exceptions import ClientError
def paginate_through_tables(database_name: str,
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_tables')
response = paginator.paginate(
DatabaseName=database_name,
PaginationConfig={
'MaxItems': max_items,
'PageSize': page_size,
'StartingToken': starting_token
}
)
return response
except ClientError as e:
raise Exception("boto3 client error in paginate_through_tables: " + str(e))
except Exception as e:
raise Exception("Unexpected error in paginate_through_tables: " + str(e))
a = paginate_through_tables("test_db", 2, 5)
print(*a)
実行結果
上記のコードを実行すると、指定したデータベース「test_db」内のテーブル情報が辞書形式で返されます。以下は出力の抜粋です。
{'TableList': [
{'Name': 'temp_table', 'DatabaseName': 'test_db', 'Owner': 'abc',
'CreateTime': datetime.datetime(2020, 9, 10, 20, 44, 29, tzinfo=tzlocal()),
'StorageDescriptor': {
'Columns': [
{'Name': 'keyname', 'Type': 'string'},
{'Name': 'amount', 'Type': 'string'},
{'Name': 'effectivedate', 'Type': 'string'},
{'Name': 'clientname', 'Type': 'string'},
{'Name': 'accoutname', 'Type': 'varchar(5)'},
{'Name': 'clientid', 'Type': 'varchar(6)'}],
'Location': 's3://test/',
'InputFormat': 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat',
'OutputFormat': 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat', ...},
'TableType': 'EXTERNAL_TABLE',
'Parameters': {'EXTERNAL': 'TRUE', 'parquet.compression': 'SNAPPY'}},
{'Name': 'test_3', 'DatabaseName': 'test_db', 'Owner': 'abc',
'CreateTime': datetime.datetime(2020, 9, 10, 21, 54, 39, tzinfo=tzlocal()),
'StorageDescriptor': {...},
'TableType': 'EXTERNAL_TABLE'}],
'ResponseMetadata': {
'RequestId': 'dd35e6c5-****',
'HTTPStatusCode': 200,
'RetryAttempts': 0}}
補足:NextTokenによる続きの取得
テーブル数が多く、一度のリクエストで取得しきれない場合は、レスポンスに含まれるNextTokenを次の呼び出し時にstarting_tokenとして渡すことで、前回の続きからページネーションを再開できます。これにより、大量のテーブルが登録されたカタログでも効率的かつ確実に全テーブル情報を取得できます。
-
PythonのBoto3を使ってAWS Glue Data Catalog内のすべての分類子(クラシファイア)の詳細を取得する方法
課題Pythonのboto3ライブラリを使用して、AWS Glue Data Catalogに登録されているすべての分類子(クラシファイア)の詳細情報を取得します。たとえば、ユーザーのアカウントに存在する全分類子の詳細を一括で取得するケースが挙げられます。解決のためのアプローチと手順ステップ1: まず、boto3およびbotocore.exceptions(ClientErrorなど)をインポートし、例外処理に備えます。ステップ2: get_classifiers APIにはパラメータは不要です。ステップ3: boto3ライブラリを使用してAWSセッションを作成します。デフォルトプロファイルに
-
Boto3を使ってAWS Glueのジョブを削除する方法を徹底解説
AWS Glueは、ETL(抽出・変換・ロード)処理を簡単に実行できるサーバーレスのデータ統合サービスです。本記事では、Pythonのboto3ライブラリを使用して、自分のAWSアカウント内に作成済みのGlueジョブを削除する方法を、ステップごとにわかりやすく解説します。 課題 Pythonのboto3ライブラリを使って、AWSアカウント内に作成されたGlueジョブを削除します。 例: アカウント内に作成された「transfer_from_s3」というGlueジョブを削除します。 解決のためのアプローチとアルゴリズム ステップ1: 例外処理のために、boto3とbotocoreの例外モジュール