Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Boto3로 AWS Glue 작업 여러 개의 상세 정보를 한 번에 조회하는 방법

이 글에서는 Python의 boto3 라이브러리를 활용해 AWS 계정에 등록된 Glue 작업(Job)들의 이름 목록을 조회하고, 해당 작업들의 리소스 메타데이터를 한 번에 가져오는 방법을 알아봅니다.

문제 정의

Python에서 boto3 라이브러리를 사용하여 본인 AWS 계정에서 사용 가능한 Glue 작업을 조회해야 합니다. 예를 들어, 계정에 존재하는 모든 작업의 이름과 각 작업의 상세 정보(생성일, 실행 역할, 스크립트 위치 등)를 가져오는 것이 목표입니다.

해결 접근 방식 및 알고리즘

1단계 – 예외 처리를 위해 boto3와 botocore.exceptions를 임포트합니다.

2단계 – 이 기능에는 별도의 입력 파라미터가 필요하지 않습니다. 사용자 계정에 나열된 모든 작업을 자동으로 가져온 뒤, 각 작업의 메타데이터를 표시합니다.

3단계 – boto3 라이브러리로 AWS 세션(Session)을 생성합니다. 기본 프로필(default profile)에 region_name이 설정되어 있는지 확인하세요. 만약 설정되어 있지 않다면, 세션 생성 시 region_name을 명시적으로 전달해야 합니다.

4단계 – AWS Glue 서비스를 위한 클라이언트를 생성합니다.

5단계list_jobs 함수를 호출하여 사용자 계정에 등록된 전체 작업 목록을 가져옵니다.

6단계batch_get_jobs 함수를 호출하고, 앞 단계에서 가져온 작업 이름 목록을 JobNames 파라미터로 전달합니다.

7단계 – 요청이 성공하면 list_of_jobs(작업 이름 목록)와 각 작업의 상세 메타데이터가 반환됩니다.

8단계 – 작업 조회 과정에서 오류가 발생할 경우 일반 예외(generic exception)를 처리하여 적절한 오류 메시지를 출력합니다.

예제 코드

아래 코드를 사용하면 계정에 나열된 각 Glue 작업의 세부 정보를 가져올 수 있습니다.

import boto3
from botocore.exceptions import ClientError

def get_resource_metadata_of_glue_jobs():
    session = boto3.session.Session()
    glue_client = session.client('glue')
    try:
        list_of_jobs = glue_client.list_jobs()
        response = glue_client.batch_get_jobs(JobNames=list_of_jobs['JobNames'])

        return list_of_jobs, response
    except ClientError as e:
        raise Exception("boto3 client error in get_resource_metadata_of_glue_jobs: " + e.__str__())
    except Exception as e:
        raise Exception("Unexpected error in get_resource_metadata_of_glue_jobs: " + e.__str__())

a, b = get_resource_metadata_of_glue_jobs()
#작업 목록
print(a)
#각 작업의 리소스 메타데이터
print(b)

실행 결과

위 코드를 실행하면 다음과 같은 형태의 결과를 얻을 수 있습니다.

#작업 목록
{'JobNames': ['01_PythonShellTest1', '01_pythonSHELL_14012021'],
'NextToken':
'eyJleHBpcmF0aW9uIjp7InNlY29uZHMiOjE2MTQxNzE2OTksIm5hbm9zIjo1MTYwMDAwMDB
9LCJsYXN0RXZhbHV
zFiMzAzNzAxMzRmNDk3NWM3M2MyMjhjYTk5MDgzZTA3YjQ0ZWEyOTZlIn19fQ==',
'ResponseMetadata': {'RequestId': '5d3eb19a-41f5-b24e-2d59ed9664b5',
'HTTPStatusCode': 200, 'HTTPHeaders': {'date': 'Tue, 23 Feb 2021
13:01:39 GMT', 'content-type': 'application/x-amz-json-1.1', 'contentlength': '1134', 'connection': 'keep-alive', 'x-amzn-requestid':
'5d3eb19a-41f5-b24e-2d59ed9664b5'}, 'RetryAttempts': 0}}

#각 작업의 리소스 메타데이터
{'Jobs': [{'Name': '01_PythonShellTest1', 'Role':
'arn:aws:iam::1234:role/dev-edl-glue-role', 'CreatedOn':
datetime.datetime(2021, 1, 6, 19, 59, 19, 387000, tzinfo=tzlocal()),
'LastModifiedOn': datetime.datetime(2021, 2, 9, 21, 47, 31, 614000,
tzinfo=tzlocal()), 'ExecutionProperty': {'MaxConcurrentRuns': 1},
'Command': {'Name': 'pythonshell', 'ScriptLocation':
's3://test/01_pythonShellTest/test1/01_PythonShellTest1.py',
'PythonVersion': '3'}, 'DefaultArguments': {'--job-bookmark-option':
'job-bookmark-disable', '--job-language': 'python'}, 'MaxRetries': 0,
'AllocatedCapacity': 0, 'Timeout': 2880, 'MaxCapacity': 0.0625,
'GlueVersion': '1.0'},
{'Name': '01_pythonSHELL_14012021', 'Role': 'arn:aws:iam::1234:role/devedl-glue-role', 'CreatedOn': datetime.datetime(2021, 1, 14, 20, 22, 40,
965000, tzinfo=tzlocal()), 'LastModifiedOn': datetime.datetime(2021, 1,
14, 20, 22, 40, 965000, tzinfo=tzlocal()), 'ExecutionProperty':
{'MaxConcurrentRuns': 1}, 'Command': {'Name': 'pythonshell',
'ScriptLocation': 's3://test/01_pythonSHELL_14012021_123.py',
'PythonVersion': '3'}, 'DefaultArguments': {'--job-bookmark-option':
'job-bookmark-disable'}, 'MaxRetries': 0, 'AllocatedCapacity': 0,
'Timeout': 2880, 'MaxCapacity': 0.0625, 'GlueVersion': '1.0'}]}

결과 해설

첫 번째 출력은 계정에 등록된 Glue 작업 이름 목록(JobNames)과 페이지네이션을 위한 NextToken, 그리고 응답 메타데이터를 보여줍니다. 두 번째 출력은 batch_get_jobs를 통해 반환된 각 작업의 상세 정보로, 작업 이름, 실행에 사용되는 IAM 역할(Role), 생성 및 수정 시각, 최대 동시 실행 수(MaxConcurrentRuns), 스크립트가 저장된 S3 위치(ScriptLocation), 타임아웃, Glue 버전 등의 메타데이터를 포함합니다.

참고로, 작업 수가 많아 한 번의 API 호출로 모든 이름을 가져오지 못할 경우 NextToken 값을 활용해 다음 페이지를 반복적으로 조회하면 되며, batch_get_jobs 역시 한 번의 호출당 최대 100개의 작업 이름만 처리할 수 있으므로 대량의 작업을 다룰 때는 목록을 분할해서 호출하는 것이 좋습니다.