当 AWS Glue 作业重试失败时,如何使用 Lambda 函数接收 SNS 警报?

4 分钟阅读
0

我希望在 AWS Glue 作业重试失败时收到 Amazon Simple Notification Service(Amazon SNS)警报通知。

简短描述

AWS Glue 的 Amazon EventBridge 事件可用于创建 Amazon SNS 警报,但在某些情况下,警报可能不够具体。要接收某些 AWS Glue 事件的 SNS 通知,例如重试 AWS Glue 作业失败,您可以使用 AWS Lambda。您可以创建 Lambda 函数来执行以下操作:

  1. 检查传入事件中是否有特定字符串。
  2. 如果事件中的字符串与 Lambda 函数中的字符串匹配,则向 Amazon SNS 发布消息。

要在任何 AWS Glue 作业重试失败时使用 AWS Lambda 函数接收来自 SNS 的电子邮件,请执行以下操作:

  1. 创建 Amazon SNS 主题。
  2. 创建 AWS Lambda 函数。
  3. 创建使用 Lambda 函数发起电子邮件通知的 Amazon EventBridge 事件。

解决方法

确保您拥有:

  • AWS Glue 提取、转换和加载 (ETL) 作业
  • AWS Lambda 的具有发布 SNS 通知的权限的 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 (创建订阅)
    对于 Topic ARN (主题 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')

**注意:**务必要使用 SNS 主题的 ARN 替换 snsTopicARN
选择 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 function (Lambda 函数)
对于 Function (函数),选择您创建的函数。

4.    选择 Create (创建)

使用 AWS Glue 作业测试通知

  1. 打开 AWS Glue 控制台
  2. 在导航窗格上,选择 Jobs(作业)。
  3. 选择要在其中测试通知的 AWS Glue 作业。
  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 官方已更新 2 年前