[AWS] Glue Job 실패 시 슬랙으로 알람보내기

넘실넘실·2025년 1월 29일

1. Lambda Function

import json
import os
import urllib.request

SLACK_CHANNEL = os.environ['SLACK_CHANNEL']
HOOK_URL = os.environ['HOOK_URL']

def send_message(message: str):
    send_data = {
        "text": message,
    }
    send_text = json.dumps(send_data)
    request = urllib.request.Request(
        HOOK_URL,
        data=send_text.encode('utf-8'), 
    )
    response = urllib.request.urlopen(request)
    print("[SLACK-RESPONSE]", response)
    
def get_job_link(event_convert: dict) -> str:
    region = event_convert["region"]
    job_name = event_convert["detail"]["jobName"]
    job_id = event_convert["detail"]["jobRunId"]
    job_link = f"https://{region}.console.aws.amazon.com/gluestudio/home?region={region}#/job/{job_name}/run/{job_id}"
    return job_link
    
def lambda_handler(event, context):
    # TODO implement
    event_convert = json.loads(event["Records"][0]["Sns"]["Message"]) 
    message = get_job_link(event_convert=event_convert)
    send_message(message=message)

2. Amazon SNS Topic

  • Amazon SNS 주제를 생성하고 구독 버튼을 클릭하여 위의 lambda 함수의 arn 추가

3. Amazon EventBridge Rule

  1. 규칙 생성 버튼 클릭 후 규칙 유형 이벤트 패턴이 있는 규칙 체크 후 다음 버튼
  2. 이벤트 패턴을 다음과 같이 입력
  • 이벤트 소스: AWS 서비스
  • AWS 서비스: Glue
  • 이벤트 유형: Glue Job State Change
  • 다음과 같이 detail 추가
{
  ...
  "detail": {
    "jobName": ["job_name1", "job_name2"],
    "state": [알림 받을 STATE]
  }
}
  • 예시
{
  ...
  "detail": {
    "jobName": ["agg-daily", "agg-hourly"],
    "state": ["FAILED", "TIMEOUT"]
  }
}
  1. 대상 유형은 AWS SNS, 주제는 생성한 SNS 주제를 선택하여 생성

📑 reference

profile
어쩌다보니 데이터쟁이

0개의 댓글