Help us improve the AWS re:Post Knowledge Center by sharing your feedback in a brief survey. Your input can influence how we create and update our content to better support your AWS journey.
当 AWS Glue 作业重试失败时,如何使用 Lambda 函数接收 SNS 提醒?
我想在我的 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 主题和订阅
完成以下步骤:
- 打开 Amazon SNS 控制台。
- 选择 Topics(主题),然后选择 Create topic(创建主题)。
- 对于 Type(类型),选择 Standard(标准)。
- 对于 Name(名称),为主题输入名称。
- (可选)对于 Display name(显示名称),输入主题的显示名称。
- 选择 Create topic(创建主题)。
- 在 Topic(主题)页面上,选择 Create subscription(创建订阅),然后完成以下步骤:
对于 Topic ARN(主题 ARN),选择您的主题。
对于 Protocol(协议),选择通知方式,例如 Email(电子邮件)。
对于 Endpoint(端点),输入要用来接收 Amazon SNS 通知的地址。 - 选择 Create subscription(创建订阅)。
创建 AWS Lambda 函数
完成以下步骤:
-
打开 Lambda 控制台。
-
选择 Create function(创建函数)。
-
在 Create function(创建函数)页面上,完成以下步骤:
选择 Author from scratch(从头开始编写)。
对于 Function name(函数名称),输入您的函数的名称。
对于 Runtime(运行时),选择可用的 Python 版本。
展开 Change default execution role(更改默认执行角色)下拉列表。
对于执行角色,选择使用现有角色。
对于 Existing role(现有角色),选择有权发送 Amazon SNS 通知的 IAM 角色。 -
选择 Create function(创建函数)。
-
在 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。
-
选择 File(文件),然后选择 Save(保存)。
-
对于 Filename(文件名),输入文件名。
-
选择 Deploy(部署)。
(可选)要测试事件,请完成以下步骤:
-
选择 Test(测试)选项卡。
-
对于 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 作业名称。
-
选择 Save changes(保存更改),然后选择 Test(测试)。
-
查看显示的 Execution result(执行结果)。
-
验证是否收到 Amazon SNS 提醒。
使用 Amazon EventBridge 发起电子邮件通知
完成以下步骤:
-
打开 EventBridge 控制台。
-
在导航窗格中,选择 Rules(规则),然后选择 Create rule(创建规则)。
-
在 Create rule(创建规则)页面上,完成以下步骤:
对于 Name(名称),输入规则名称。
(可选)对于 Description(描述),输入规则的描述。
对于 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(函数),选择您的 Lambda 函数。 -
选择 Next(下一步),然后选择 Create rule(创建规则)。
使用 AWS Glue 作业测试失败
完成以下步骤:
- 打开 AWS Glue 控制台。
- 在导航窗格中,选择 Jobs(作业),然后选择要测试的 AWS Glue 作业。
- 选择 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 作业第二次失败后,验证是否收到 Amazon SNS 通知。检查您配置的端点是否有通知。然后,移除您在代码中更改的元素,以免作业失败。
