AWS Glue 작업이 재시도에 실패할 때 Lambda 함수를 사용하여 SNS 알림을 수신하려면 어떻게 해야 하나요?
최종 업데이트 날짜: 2023년 1월 12일
AWS Glue 작업이 재시도에 실패할 경우 Amazon Simple Notification Service(SNS) 알림으로 알림을 받고 싶습니다.
간략한 설명
AWS Glue용 Amazon EventBridge 이벤트는 Amazon SNS 알림을 생성하는 데 사용할 수 있지만, 특정 상황에서는 알림이 충분하지 않을 수 있습니다. 재시도 시 AWS Glue 작업 실패와 같은 특정 AWS Glue 이벤트에 대한 SNS 알림을 받으려면 AWS Lambda를 사용하면 됩니다. Lambda 함수를 만들어 다음을 수행할 수 있습니다.
- 수신 이벤트에서 특정 문자열을 확인합니다.
- 이벤트의 문자열이 Lambda 함수의 문자열과 일치하는 경우 Amazon SNS에 메시지를 게시합니다.
AWS Lambda 함수를 사용하여 AWS Glue 작업 중 재시도에 실패했을 때 SNS로부터 이메일을 수신하려면 다음을 수행합니다.
- Amazon SNS 주제를 생성합니다.
- AWS Lambda 함수를 생성합니다.
- Lambda 함수를 사용하여 이메일 알림을 시작하는 Amazon EventBridge 이벤트를 생성합니다.
해결 방법
다음이 있는지 확인합니다.
- AWS Glue 추출, 변환 및 적재(ETL) 작업
- SNS 알림을 게시할 권한이 부여된 AWS Lambda의 AWS Identity and Access Management(IAM) 역할
Amazon SNS 주제 생성
- Amazon SNS 콘솔을 엽니다.
- [주제(Topics)]를 선택한 다음 [주제 생성(Create topic)]을 선택합니다.
- [유형(Type)]에 [표준(Standard)]을 선택합니다.
- [이름(Name)]에 주제 이름을 입력합니다.
- (선택 사항) [표시 이름(Display name)]에 주제의 표시 이름을 입력합니다.
- [주제 생성(Create topic)]을 선택합니다.
주제가 생성됩니다. - [구독 생성(Create subscription)]을 선택합니다.
[주제 ARN(Topic ARN)]에 사용자가 생성한 주제를 선택합니다.
[프로토콜(Protocol)]에 원하는 프로토콜을 선택합니다.
[엔드포인트(Endpoint)]에 SNS 알림을 받으려는 주소를 입력합니다. - [구독 생성(Create subscription)]을 선택합니다.
구독이 생성됩니다.
AWS Lambda 함수 생성
1. Lambda 콘솔을 엽니다.
2. Create function(함수 생성)을 선택합니다.
3. [함수 생성(Create function)] 페이지에서 다음을 수행합니다.
[새로 작성(Author from scratch)]을 선택합니다.
Function name(함수 이름)에 함수 이름을 입력합니다.
Runtime(런타임)의 경우 Python 옵션 중 하나를 선택합니다(스크립트 호환성을 위해 Python 3.7을 사용하는 것이 가장 좋습니다).
Change default execution role(기본 실행 역할 변경) 드롭다운 목록을 확장합니다.
Execution role(실행 역할)에 Use an existing role(기존 역할 사용)을 선택합니다.
[기존 역할(Existing role)]에 SNS 알림을 보낼 권한이 있는 IAM 역할을 선택합니다.
4. Create function(함수 생성)을 선택합니다.
Lambda 함수가 생성됩니다.
5. [코드(Code)] 탭의 [코드 소스(Code source)] 섹션에서 [파일(File)]을 선택한 다음 [새 파일(New file)]을 선택합니다.
새 파일에 다음과 유사한 코드를 입력합니다.
# Import modules
import json
import logging
import boto3
# Set up logging
logger = logging.getLogger()
logger.setLevel(logging.INFO)
# Set up Boto3 client for SNS
client = boto3.client('sns')
# Variables for the SNS:
SNS_TOPIC_ARN = "arn:aws:sns:us-east-1:012345678901:Glue_Job_Failure_Notification"
# Define Lambda function
def lambda_handler(event, context):
logger.info(f"## INITIATED BY EVENT: \n{event['detail']}")
# Define variables based on the event
glue_job_name = event['detail']['jobName']
jobrun_id = event['detail']['jobRunId']
# Only send SNS notification if the event pattern contains _attempt_1
if event['detail']['jobRunId'].endswith('_attempt_1'):
logger.info(f'## GLUE JOB FAILED RETRY: {glue_job_name}')
message = "A Glue Job has failed after attempting to retry. "\
+ f"JobName: {glue_job_name}, JobRunID: {jobrun_id}"
logger.info(message)
client.publish(
TargetArn=SNS_TOPIC_ARN,
Message=json.dumps({'default': json.dumps(message)}),
Subject='An AWS Glue Job has failed',
MessageStructure='json')
참고: snsTopicARN을 SNS 주제의 ARN으로 바꿔야 합니다.
File(파일)을 선택한 다음 Save(저장)을 선택합니다.
Filename(파일 이름)에 원하는 파일 이름을 입력합니다.
6. [배포(Deploy)]를 선택합니다.
(선택 사항) 다음을 수행하여 이벤트를 테스트할 수 있습니다.
1. [테스트(Test)] 탭을 선택합니다.
[이름(Name)]에 이벤트 이름을 입력합니다. 다음과 유사한 JSON을 입력합니다.
{
"version": "0",
"id": "abcdef01-1234-5678-9abc-def012345678",
"detail-type": "Glue Job State Change",
"source": "aws.glue",
"account": "123456789012",
"time": "2017-09-07T06:02:03Z",
"region": "us-west-2",
"resources": [],
"detail": {
"jobName": "MyTestJob",
"severity": "ERROR",
"state": "FAILED",
"jobRunId": "jr_0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef_attempt_1",
"message": "JobName:MyTestJob and JobRunId:jr_0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef failed to execute with exception Role arn:aws:iam::123456789012:role/Glue_Role should be given assume role permissions for Glue Service."
}
}
참고: MyTestJob은 AWS Glue 작업의 이름으로 바꾸어야 합니다.
2. [변경 사항 저장(Save changes)]을 선택합니다.
3. [테스트(Test)]를 선택합니다.
4. 테스트가 완료된 후 열리는 [실행 결과(Execution result)]를 봅니다.
5. SNS 알림을 받는지 확인합니다.
Amazon EventBridge를 사용하여 이메일 알림 시작
1. EventBridge 콘솔을 엽니다.
2. 탐색 창에서 [규칙(Rules)]을 선택하고 [규칙 생성(Create rule)]을 선택합니다.
3. [규칙 생성(Create rule)] 페이지에서 다음을 수행합니다.
[이름(Name)]에 규칙 이름을 입력합니다.
(선택 사항) [설명 - 선택 사항(Description - optional)]에 규칙 설명을 입력합니다.
[패턴 정의(Define pattern)]에 [이벤트 패턴(Event pattern)]을 선택합니다.
[이벤트 일치 패턴(Event matching pattern)]에 [사용자 지정 패턴(Custom pattern)]을 선택합니다.
[이벤트 패턴(Event pattern)]에 다음 패턴이나 원하는 패턴을 입력합니다.
{
"detail-type": [
"Glue Job State Change"
],
"source": [
"aws.glue"
],
"detail": {
"state": [
"FAILED"
]
}
}
Save(저장)을 선택합니다.
[대상 선택(Select targets)] 섹션에서 다음을 수행합니다.
[대상(Target)]에 [Lambda 함수(Lambda function)]를 선택합니다.
[함수(Function)]에 생성한 함수를 선택합니다.
4. [생성(Create)]을 선택합니다.
AWS Glue 작업으로 알림 테스트
- AWS Glue 콘솔을 엽니다.
- 탐색 창에서 Jobs(작업)을 선택합니다.
- 알림을 테스트하려는 AWS Glue Job을 선택합니다.
- Action(작업) 드롭다운 목록을 선택한 다음 Edit job(작업 편집)을 선택합니다.
- [보안 구성, 스크립트 라이브러리 및 작업 파라미터(선택 사항)(Security configuration, script libraries, and job parameters (optional))]를 펼칩니다.
- [보안 구성(Security configuration)]에서 [재시도 횟수(Number of retries)]에 1을 입력합니다.
- Save(저장)을 선택합니다.
- Jobs(작업) 페이지에서 알림을 테스트하려는 AWS Glue 작업을 선택합니다.
- Action(작업) 드롭다운 목록을 선택한 다음 Edit Script(스크립트 편집)을 선택합니다.
- 작업이 실패하도록 코드 요소를 변경하세요. (예: 테이블 이름에 '_BROKEN'이라는 단어 추가).
- Save(저장)을 선택합니다.
- Jobs(작업) 페이지에서 알림을 테스트하려는 AWS Glue 작업을 선택합니다.
- Action(작업) 드롭다운 목록을 선택한 다음 Run job(작업 실행)을 선택합니다.
두 번째 시도가 실패하면 알림을 받아야 합니다. - 테스트가 완료되면 AWS Glue 작업을 편집하고 변경 사항을 취소하세요.