문제 정의
Python의 boto3 라이브러리를 사용하여 AWS Glue 데이터 카탈로그의 마이그레이션 작업이 진행 중인지, 아니면 이미 완료되었는지 그 상태를 조회하는 방법을 알아보겠습니다.
예시 − 현재 로그인된 계정에서 진행 중이거나 마지막으로 완료된 카탈로그 마이그레이션 작업의 상태를 확인합니다.
문제 해결 접근 방식 및 알고리즘
1단계 − boto3와 botocore의 예외 처리 모듈(ClientError)을 임포트하여 발생 가능한 오류를 처리합니다.
2단계 − 상태를 확인하고자 하는 catalog_id를 파라미터로 전달합니다. 이 파라미터는 선택 사항(optional)입니다. 값을 지정하지 않으면 기본적으로 로그인된 사용자 계정을 대상으로 마이그레이션 진행 여부를 확인합니다. 참고로 catalog_id는 별도의 값이 아니라 사용자 계정 ID를 의미합니다.
3단계 − boto3 라이브러리를 사용해 AWS 세션(Session)을 생성합니다. 기본 프로필(default profile)에 region_name이 설정되어 있는지 확인하고, 설정되어 있지 않다면 세션 생성 시 region_name을 명시적으로 전달해야 합니다.
4단계 − AWS Glue 서비스를 위한 클라이언트 객체를 생성합니다.
5단계 − get_catalog_import_status 함수를 호출하고 catalog_id를 CatalogId 파라미터로 전달합니다.
6단계 − 해당 함수는 현재 진행 중인 마이그레이션 작업의 세부 정보를 반환합니다. 만약 진행 중인 작업이 없다면 가장 최근에 수행된 마이그레이션 정보를 대신 가져옵니다.
7단계 − 상태 확인 과정에서 문제가 발생할 경우 일반 예외(generic exception)를 처리하여 오류 원인을 명확히 전달합니다.
예제 코드
아래 코드를 사용하면 마이그레이션 작업의 상태를 손쉽게 조회할 수 있습니다 −
import boto3
from botocore.exceptions import ClientError
def status_of_migration(catalog_id = None):
session = boto3.session.Session()
glue_client = session.client('glue')
try:
response = glue_client.get_catalog_import_status(CatalogId = catalog_id)
return response
except ClientError as e:
raise Exception("boto3 client error in status_of_migration: " + e.__str__())
except Exception as e:
raise Exception("Unexpected error in status_of_migration: " + e.__str__())
print(status_of_migration())실행 결과
{'ImportStatus': {'ImportCompleted': True, 'ImportTime':
datetime.datetime(2017, 11, 17, 1, 32, 44, tzinfo=tzlocal()),
'ImportedBy': 'StatusSetByDefault'}, 'ResponseMetadata': {'RequestId':
'7c33d6f9-……………..-3b202961e3e7', 'HTTPStatusCode': 200, 'HTTPHeaders':
{'date': 'Sun, 21 Feb 2021 05:40:06 GMT', 'content-type':
'application/x-amz-json-1.1', 'content-length': '102', 'connection':
'keep-alive', 'x-amzn-requestid': '7c33d6f9-…….…………..-3b202961e3e7'},
'RetryAttempts': 0}}결과 해석
응답 결과의 핵심은 ImportStatus 필드입니다. ImportCompleted 값이 True라면 카탈로그 마이그레이션이 성공적으로 완료된 것이며, False라면 아직 마이그레이션이 진행 중이거나 완료되지 않았음을 의미합니다. 또한 ImportTime은 마이그레이션이 수행된 시각을, ImportedBy는 해당 상태를 설정한 주체를 나타냅니다. HTTPStatusCode가 200이면 API 호출이 정상적으로 처리된 것입니다.