이 글에서는 Python의 boto3 라이브러리를 사용해 AWS 계정에서 실행 중인 워크플로(workflow)를 중지하는 방법을 알아봅니다.
문제 정의
Python에서 boto3 라이브러리를 활용하여 AWS Glue의 특정 워크플로 실행을 중지하는 것이 목표입니다.
해결 접근 방법
1단계: 예외 처리를 위해 boto3와 botocore의 예외 클래스를 임포트합니다.
2단계: 이 함수에는 workflow_name(워크플로 이름)과 run_id(실행 ID) 두 가지 필수 파라미터가 필요합니다.
3단계: boto3 라이브러리를 사용해 AWS 세션을 생성합니다. 기본 프로필에 region_name이 설정되어 있지 않다면, 세션 생성 시 명시적으로 리전 이름을 전달해야 합니다.
4단계: glue 서비스를 위한 AWS 클라이언트를 생성합니다.
5단계: stop_workflow_run 함수를 호출하고, Name 파라미터에는 workflow_name을, RunId 파라미터에는 run_id를 전달합니다.
6단계: 함수는 응답 메타데이터를 반환하며 해당 워크플로 실행을 중지합니다.
7단계: 워크플로 중지 과정에서 문제가 발생할 경우를 대비해 일반 예외(generic exception)도 함께 처리합니다.
예제 코드
다음 코드는 실행 중인 워크플로를 중지합니다.
import boto3
from botocore.exceptions import ClientError
def stop_a_workflow(workflow_name, run_id):
session = boto3.session.Session()
glue_client = session.client('glue')
try:
response = glue_client.stop_workflow_run(Name=workflow_name, RunId=run_id)
return response
except ClientError as e:
raise Exception("boto3 client error in stop_a_workflow: " + e.__str__())
except Exception as e:
raise Exception("Unexpected error in stop_a_workflow: " + e.__str__())
print(stop_a_workflow("test-daily", "wr_64e880240692fddd5e1b19aed587f856bc20a96f54bc"))출력 결과
{'RunId': 'wr_64e880240692fddd5e1b19aed587f856bc20a96f54bc', 'ResponseMetadata': {'RequestId': '782e953b-8ee3-4876-9b2c-cd35e147b513', 'HTTPStatusCode': 200, 'HTTPHeaders': {'date': 'Sun, 28 Mar 2021 08:11:02 GMT', 'content-type': 'application/x-amz-json-1.1', 'content-length': '79', 'connection': 'keep-alive', 'x-amzn-requestid': '782e953b-********************************13'}, 'RetryAttempts': 0}}코드 설명
위 코드가 정상적으로 실행되면 HTTP 상태 코드 200과 함께 응답 메타데이터가 반환되며, 지정한 run_id에 해당하는 워크플로 실행이 즉시 중지됩니다. 만약 존재하지 않는 워크플로 이름이나 잘못된 run_id를 전달하면 ClientError가 발생하고, 이는 사용자 정의 예외 메시지로 변환되어 출력됩니다.