문제 상황
Python의 boto3 라이브러리를 사용하여 AWS Glue 데이터 카탈로그에 등록된 모든 연결(Connection)의 세부 정보를 조회하는 방법을 알아보겠습니다.
예시
AWS Glue 데이터 카탈로그에 정의된 모든 연결의 세부 정보를 가져오는 것이 목표입니다.
해결 접근 방식 및 알고리즘
1단계 − 예외 처리를 위해 boto3와 botocore.exceptions를 임포트합니다.
2단계 − 이 함수에는 별도의 매개변수가 필요하지 않습니다.
3단계 − boto3 라이브러리를 사용하여 AWS 세션을 생성합니다. 기본 프로필(default profile)에 region_name이 설정되어 있는지 확인하고, 설정되어 있지 않다면 세션 생성 시 region_name을 명시적으로 전달해야 합니다.
4단계 − Glue 서비스를 위한 AWS 클라이언트를 생성합니다.
5단계 − get_connections() 함수를 호출합니다.
6단계 − 해당 함수는 AWS Glue 데이터 카탈로그에서 연결 정의의 전체 세부 정보를 반환합니다.
7단계 − 조회 과정에서 오류가 발생할 경우 일반 예외(generic exception)를 처리하여 안정성을 확보합니다.
코드 예시
아래 코드를 사용하면 AWS Glue 데이터 카탈로그에 정의된 모든 연결의 세부 정보를 가져올 수 있습니다.
import boto3
from botocore.exceptions import ClientError
def get_details_of_all_connections():
session = boto3.session.Session()
glue_client = session.client('glue')
try:
response = glue_client.get_connections()
return response
except ClientError as e:
raise Exception("boto3 client error in get_details_of_all_connections: " + e.__str__())
except Exception as e:
raise Exception("Unexpected error in get_details_of_all_connections: " + e.__str__())
print(get_details_of_all_connections())
실행 결과
위 코드를 실행하면 다음과 같이 연결 이름, 연결 유형(JDBC), JDBC 연결 URL, 사용자 이름, 서브넷·보안 그룹 등 물리적 연결 요구 사항, 생성 시각과 최종 수정 시각까지 포함한 상세 정보가 딕셔너리 형태로 출력됩니다.
{'ConnectionList': [
{'Name': '01_Daily', 'Description': '', 'ConnectionType': 'JDBC',
'ConnectionProperties': {'JDBC_CONNECTION_URL':
'jdbc:redshift://**********.us-east-1.redshift.amazonaws.com:5439/abc',
'JDBC_ENFORCE_SSL': 'false', 'PASSWORD': '!*******', 'USERNAME':
'********'}, 'PhysicalConnectionRequirements': {'SubnetId': 'subneta******e', 'SecurityGroupIdList': ['sg-********3'], 'AvailabilityZone':
'us-east-1a'}, 'CreationTime': datetime.datetime(2020, 12, 11, 17, 1,
51, 519000, tzinfo=tzlocal()), 'LastUpdatedTime':
datetime.datetime(2020, 12, 11, 17, 1, 51, 519000, tzinfo=tzlocal())},
{'Name': 'aurora-poc', 'ConnectionType': 'JDBC', 'ConnectionProperties':
{'JDBC_CONNECTION_URL': 'jdbc:postgresql://**********-cluster.clustercv********6p.us-east-1.rds.amazonaws.com:5432/*******',
'JDBC_ENFORCE_SSL': 'false', 'PASSWORD': '******', 'USERNAME': 'user'},
'PhysicalConnectionRequirements': {'SubnetId': 'subnet-35******e',
'SecurityGroupIdList': ['sg-*******d', 'sg-0***********'],
'AvailabilityZone': 'us-east-1c'}, 'CreationTime':
datetime.datetime(2020, 11, 18, 12, 38, 29, 625000, tzinfo=tzlocal()),
'LastUpdatedTime': datetime.datetime(2020, 11, 18, 12, 51, 16, 59000,
tzinfo=tzlocal())},
{'Name': 'dev-ods', 'ConnectionType': 'JDBC', 'ConnectionProperties':
{'JDBC_CONNECTION_URL': 'jdbc:postgresql://*****************.us-east1.rds.amazonaws.com:5432/store', 'JDBC_ENFORCE_SSL': 'false',
'PASSWORD': '***********', 'USERNAME': 'user'},
'PhysicalConnectionRequirements': {'SubnetId': 'subnet-a********',
'SecurityGroupIdList': ['sg-*********b7', 'sg-a8********e'],
'AvailabilityZone': 'us-east-1a'}, 'CreationTime':
datetime.datetime(2020, 5, 27, 3, 10, 24, 538000, tzinfo=tzlocal()),
'LastUpdatedTime': datetime.datetime(2021, 2, 26, 5, 50, 53, 991000,
tzinfo=tzlocal())}],
'ResponseMetadata': {'RequestId': '58bae80d-*******************87',
'HTTPStatusCode': 200, 'HTTPHeaders': {'date': 'Sun, 28 Feb 2021
11:21:55 GMT', 'content-type': 'application/x-amz-json-1.1', 'contentlength': '11568', 'connection': 'keep-alive', 'x-amzn-requestid':
'58bae80d-************************87'}, 'RetryAttempts': 0}}정리
boto3의 get_connections() API를 활용하면 별도의 파라미터 없이 AWS Glue 데이터 카탈로그에 등록된 모든 연결 정보를 손쉽게 조회할 수 있습니다. ClientError와 일반 예외를 구분해 처리하면 운영 환경에서도 안정적인 에러 핸들링이 가능합니다.