跳至內容

當 AWS Glue 作業重試失敗時,如何使用 Lambda 函數接收 SNS 警示?

4 分的閱讀內容
0

當我的 AWS Glue 作業重試失敗時,我想使用 AWS Lambda 函數接收 Amazon Simple Notification Service (Amazon SNS) 警示。

簡短描述

您可以建立一個 Lambda 函數,檢查傳入事件中是否存在特定字串。如果事件中的字串與 Lambda 函數中的字串相符,則該函數會發佈訊息到 Amazon SNS。

若要在 AWS Glue 作業重試失敗後接收 Amazon SNS 通知,請建立 Amazon SNS 主題和訂閱。建立 Lambda 函數。使用 Amazon EventBridge 發起電子郵件通知。

解決方法

先決條件:

  • 現有的 AWS Glue 擷取、轉換和載入 (ETL) 作業。
  • Lambda 的 AWS Identity and Access Management (IAM) 角色,包含發佈 Amazon SNS 通知的權限。

建立 Amazon SNS 主題和訂閱

請完成下列步驟:

  1. 開啟 Amazon SNS console (Amazon SNS 主控台)。
  2. 選擇 Topics (主題),然後選擇 Create topic (建立主題)。
  3. Type (類型) 中,選擇 Standard (標準)。
  4. Name (名稱) 中,輸入主題的名稱。
  5. (選用) 在 Display name (顯示名稱) 中,輸入主題的顯示名稱。
  6. 選擇 Create topic (建立主題)。
  7. Topic (主題) 頁面上,選擇 Create subscription (建立訂閱),然後完成以下步驟: 
    Topic ARN (主題 ARN) 中,選擇您的主題。 
    Protocol (通訊協定) 中,選擇通知方法,例如 Email (電子郵件)。
    Endpoint (端點) 中,輸入您要接收通知的電子郵件地址。
  8. 選擇 Create subscription (建立訂閱)。

建立 AWS Lambda 函數

請完成下列步驟:

  1. 開啟 Lambda console (Lambda 主控台)。

  2. 選擇 Create function (建立函數)。

  3. Create function (建立函數) 頁面上,完成下列步驟:
    選取 Author from scratch (從頭開始撰寫)。
    Function name (函數名稱) 中,輸入函數的名稱。
    Runtime (執行時期),選擇可用的 Python 版本。
    展開 Change default execution role (變更預設執行角色) 下拉式清單。
    對於執行角色,選擇使用現有角色
    Existing role (現有角色) 中,選取具有傳送 Amazon SNS 通知權限的 IAM 角色。

  4. 選擇 Create function (建立函數)。

  5. Code (程式碼) 索引標籤的 Code source (程式碼來源) 區段中,選擇 File (檔案),然後選擇 New file (新檔案)。

    為該檔案命名,然後輸入以下程式碼:

    import json
    import logging
    import boto3
    
    logger = logging.getLogger()
    logger.setLevel(logging.INFO)
    
    client = boto3.client('sns')
    
    SNS_TOPIC_ARN = "REPLACE_WITH_YOUR_SNS_TOPIC_ARN"
    
    def lambda_handler(event, context):
        logger.info(f"## INITIATED BY EVENT: \n{event['detail']}")
    
        glue_job_name = event['detail']['jobName']
        jobrun_id = event['detail']['jobRunId']
    
        if jobrun_id.endswith('_attempt_1'):
            logger.info(f'## GLUE JOB FAILED RETRY: {glue_job_name}')
            message = (
                f"A Glue job failed after retrying.\n"
                f"Job name: {glue_job_name}\n"
                f"JobRun ID: {jobrun_id}"
            )
            client.publish(
                TargetArn=SNS_TOPIC_ARN,
                Message=json.dumps({'default': json.dumps(message)}),
                Subject='AWS Glue Job Retry Failure Notification',
                MessageStructure='json'
            )

    **注意:**將 SNS_TOPIC_ARN 替換為您 Amazon SNS 主題的 ARN。

  6. 選擇 File (檔案),然後選擇 Save (儲存)。

  7. Filename (檔案名稱) 中,輸入檔案名稱。

  8. 選擇 Deploy (部署)。

(選用) 若要測試事件,請完成下列步驟:

  1. 選擇 Test (測試) 索引標籤。

  2. Event 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 作業名稱。

  3. 選擇 Save changes (儲存變更),然後選擇 Test (測試)。

  4. 查看出現的執行結果

  5. 確認您是否收到 Amazon SNS 警示。

使用 Amazon EventBridge 發起電子郵件通知

請完成下列步驟:

  1. 開啟 EventBridge 主控台

  2. 在導覽窗格中,選擇 Rules (規則),然後選擇 Create rule (建立規則)。

  3. Create rule (建立角色) 頁面上,完成下列步驟:
    Name (名稱) 中,輸入規則名稱。
    (選用) 在 Description (描述) 中,輸入規則的描述。
    對於定義模式,選擇事件模式
    Event matching pattern (事件相符模式) 中,選擇Custom pattern (自訂模式)。
    Event pattern (事件模式) 中,輸入以下模式或您自己的模式:

    {  
    "detail-type": [ "Glue Job State Change"],
      "source": ["aws.glue"],
      "detail": {
        "state": ["FAILED"]
      }
    }
  4. 選擇 Save (儲存)。

  5. Select targets (選取目標) 區段中,完成下列步驟:
    Target (目標) 中,選擇 Lambda function (Lambda 函數)。
    Function (函數) 中,選擇您的 Lambda 函數。

  6. 選擇 Next (下一步),然後選擇 Create rule (建立規則)。

使用 AWS Glue 作業測試失敗

請完成下列步驟:

  1. 開啟 AWS Glue console (AWS Glue 主控台)。
  2. 在導覽窗格中,選擇 Jobs (作業),然後選取您要測試的 AWS Glue 作業。
  3. 選擇 Actions (動作) 下拉式清單,然後選擇 Edit job (編輯作業)。
  4. 展開 Security configuration, script libraries, and job parameters (optional) (安全組態、指令碼程式庫和作業參數 (選用))。
  5. Security configuration (安全組態) 下,在 Number of retries (重試次數) 中輸入 1
  6. 選擇 Save (儲存)。
  7. Jobs (作業) 頁面上,選取 AWS Glue 作業。
  8. 選擇 Actions (動作) 下拉式清單,然後選擇 Edit script (編輯指令碼)。
  9. 變更程式碼的元素,使作業失敗。例如,在資料表名中新增「_BROKEN」。
  10. 選擇 Save (儲存)。
  11. Jobs (作業) 頁面上,選取 AWS Glue 作業。
  12. 選擇 Actions (動作) 下拉式清單,然後選擇 Run job (執行作業)。

在 AWS Glue 作業第二次失敗後,請確認您是否收到了 Amazon SNS 通知。檢查已設定的端點是否有通知。然後,刪除程式碼中變更的元素,以使作業失敗。

相關資訊

Amazon EventBridge 中的事件

設定 Amazon SNS 通知

對 Amazon EventBridge 進行疑難排解

AWS 官方已更新 1 年前