AWS Glue 작업이 재시도에 실패할 때 Lambda 함수를 사용하여 SNS 알림을 수신하려면 어떻게 해야 하나요?

5분 분량
0

AWS Glue 작업이 재시도에 실패할 경우 Amazon Simple Notification Service(SNS) 알림으로 알림을 받고 싶습니다.

간략한 설명

AWS Glue용 Amazon EventBridge 이벤트는 Amazon SNS 알림을 생성하는 데 사용할 수 있지만, 특정 상황에서는 알림이 충분하지 않을 수 있습니다. 재시도 시 AWS Glue 작업 실패와 같은 특정 AWS Glue 이벤트에 대한 SNS 알림을 받으려면 AWS Lambda를 사용하면 됩니다. Lambda 함수를 만들어 다음을 수행할 수 있습니다.

  1. 수신 이벤트에서 특정 문자열을 확인합니다.
  2. 이벤트의 문자열이 Lambda 함수의 문자열과 일치하는 경우 Amazon SNS에 메시지를 게시합니다.

AWS Lambda 함수를 사용하여 AWS Glue 작업 중 재시도에 실패했을 때 SNS로부터 이메일을 수신하려면 다음을 수행합니다.

  1. Amazon SNS 주제를 생성합니다.
  2. AWS Lambda 함수를 생성합니다.
  3. Lambda 함수를 사용하여 이메일 알림을 시작하는 Amazon EventBridge 이벤트를 생성합니다.

해결 방법

다음이 있는지 확인합니다.

  • AWS Glue 추출, 변환 및 적재(ETL) 작업
  • SNS 알림을 게시할 권한이 부여된 AWS Lambda의 AWS Identity and Access Management(IAM) 역할

Amazon SNS 주제 생성

  1. Amazon SNS 콘솔을 엽니다.
  2. [주제(Topics)]를 선택한 다음 [주제 생성(Create topic)]을 선택합니다.
  3. [유형(Type)]에 [표준(Standard)]을 선택합니다.
  4. [이름(Name)]에 주제 이름을 입력합니다.
  5. (선택 사항) [표시 이름(Display name)]에 주제의 표시 이름을 입력합니다.
  6. [주제 생성(Create topic)]을 선택합니다.
    주제가 생성됩니다.
  7. [구독 생성(Create subscription)]을 선택합니다.
    [주제 ARN(Topic ARN)]에 사용자가 생성한 주제를 선택합니다.
    [프로토콜(Protocol)]에 원하는 프로토콜을 선택합니다.
    [엔드포인트(Endpoint)]에 SNS 알림을 받으려는 주소를 입력합니다.
  8. [구독 생성(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 작업으로 알림 테스트

  1. AWS Glue 콘솔을 엽니다.
  2. 탐색 창에서 Jobs(작업)을 선택합니다.
  3. 알림을 테스트하려는 AWS Glue Job을 선택합니다.
  4. Action(작업) 드롭다운 목록을 선택한 다음 Edit job(작업 편집)을 선택합니다.
  5. [보안 구성, 스크립트 라이브러리 및 작업 파라미터(선택 사항)(Security configuration, script libraries, and job parameters (optional))]를 펼칩니다.
  6. [보안 구성(Security configuration)]에서 [재시도 횟수(Number of retries)]에 1을 입력합니다.
  7. Save(저장)을 선택합니다.
  8. Jobs(작업) 페이지에서 알림을 테스트하려는 AWS Glue 작업을 선택합니다.
  9. Action(작업) 드롭다운 목록을 선택한 다음 Edit Script(스크립트 편집)을 선택합니다.
  10. 작업이 실패하도록 코드 요소를 변경하세요. (예: 테이블 이름에 '_BROKEN'이라는 단어 추가).
  11. Save(저장)을 선택합니다.
  12. Jobs(작업) 페이지에서 알림을 테스트하려는 AWS Glue 작업을 선택합니다.
  13. Action(작업) 드롭다운 목록을 선택한 다음 Run job(작업 실행)을 선택합니다.
    두 번째 시도가 실패하면 알림을 받아야 합니다.
  14. 테스트가 완료되면 AWS Glue 작업을 편집하고 변경 사항을 취소하세요.

관련 정보

Amazon SNS 알림 설정

Amazon EventBridge 브리지 문제 해결

AWS 공식
AWS 공식업데이트됨 일 년 전