문제 상황 − Python의 boto3 라이브러리를 사용하여 AWS Glue Data Catalog에 등록된 데이터베이스 내 테이블 정의를 특정 버전 기준으로 조회해야 합니다.
예시 − 'QA-test'라는 데이터베이스의 'security' 테이블에 대해 버전 2에 해당하는 테이블 정의를 가져오는 것이 목표입니다.
문제 해결 접근 방식
1단계 − 예외 처리를 위해 boto3와 botocore.exceptions 모듈을 임포트합니다.
2단계 − database_name(데이터베이스 이름), table_name(테이블 이름), version_id(버전 ID)는 필수 파라미터입니다. 이 세 가지 값을 통해 지정된 버전의 테이블 정의를 조회할 수 있습니다.
3단계 − boto3 라이브러리로 AWS 세션을 생성합니다. 기본 프로파일에 region_name(리전 이름)이 설정되어 있는지 확인하세요. 설정되어 있지 않다면 세션 생성 시 리전 이름을 명시적으로 전달해야 합니다.
4단계 − AWS Glue 서비스를 위한 클라이언트를 생성합니다.
5단계 − get_table_version 함수를 호출하면서 database_name은 DatabaseName으로, table_name은 TableName으로, version_id는 VersionId 파라미터로 전달합니다. 주의할 점은 version_id가 문자열 타입이라는 것입니다. 따라서 정수 값이라도 반드시 따옴표로 감싼 문자열 형태('2')로 전달해야 합니다.
6단계 − 호출이 성공하면 해당 버전의 테이블 정의가 반환됩니다.
7단계 − 작업 진행 중 오류가 발생할 경우를 대비해 일반 예외도 함께 처리합니다.
예제 코드
아래 코드를 사용하여 지정된 버전의 테이블 정의를 조회할 수 있습니다.
import boto3
from botocore.exceptions import ClientError
def retrieves_table_version_details(database_name, table_name, version_id):
session = boto3.session.Session()
glue_client = session.client('glue')
try:
response = glue_client.get_table_version(DatabaseName=database_name,
TableName=table_name, VersionId=version_id)
return response
except ClientError as e:
raise Exception("boto3 client error in retrieves_table_version_details: " + e.__str__())
except Exception as e:
raise Exception("Unexpected error in retrieves_table_version_details: " + e.__str__())
print(retrieves_table_version_details('QA-test', 'security', '2'))
실행 결과
{'TableVersion': {'Table': {'Name': 'security', 'DatabaseName': 'QAtest',
'Owner': 'owner', 'CreateTime': datetime.datetime(2020, 9, 10, 22, 27, 24,
tzinfo=tzlocal()), 'UpdateTime': datetime.datetime(2021, 3, 1, 11, 43, 49,
tzinfo=tzlocal()), 'LastAccessTime': datetime.datetime(2020, 9, 10, 22, 27,
24, tzinfo=tzlocal()), 'Retention': 0, 'StorageDescriptor': {'Columns':
[{'Name': 'assettypecode', 'Type': 'string'}, ...], 'Location':
's3://test/security/', 'InputFormat':
'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat',
'OutputFormat':
'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat',
'Compressed': False, ...}, 'TableType': 'EXTERNAL_TABLE', ...},
'VersionId': '2'}, 'ResponseMetadata': {'RequestId': '431db171-...0',
'HTTPStatusCode': 200, 'RetryAttempts': 0}}결과 해설
정상적으로 실행되면 HTTP 상태 코드 200과 함께 요청한 버전('VersionId': '2')의 테이블 정의가 딕셔너리 형태로 반환됩니다. 응답에는 테이블 이름, 생성/수정 시각, 스토리지 위치(S3 경로), 컬럼 스키마, 입력/출력 포맷, 크롤러 관련 메타데이터 등 Glue 카탈로그에 저장된 상세 정보가 포함됩니다. 만약 존재하지 않는 버전이나 잘못된 테이블 이름을 요청하면 ClientError가 발생하고, 코드에 정의된 예외 처리 로직에 따라 오류 메시지가 출력됩니다.