如何使用 Lambda 函数在爬网程序运行完成时自动启动 AWS Glue 作业?

上次更新时间:2020 年 3 月 13 日

我想要使用 AWS Lambda 函数在爬网程序运行完成时自动启动 AWS Glue 作业。该如何操作?

简短描述

要在爬网程序运行完成时启动作业,请创建 AWS Lambda 函数和 Amazon CloudWatch Events 规则。您可以修改此方法以自动化其他 AWS Glue 函数。

注意:您也可以使用 AWS Glue 工作流在爬网程序运行完成时自动启动作业。此方法需要您从 AWS Glue 控制台上的工作流页面启动爬网程序。有关更多信息,请参阅我如何使用 AWS Glue 工作流在爬网程序运行完成时自动启动作业?

解决方法

在完成以下步骤之前,请确保您拥有:

AWS Glue 提取、转换和加载 (ETL) 作业。 AWS Glue 爬网程序。 Lambda 的具有运行 AWS Glue 作业权限的 AWS Identity and Access Management (IAM) 角色。例如,为附加了 AWSGlueServiceRole 策略的 Lambda 设置服务关联角色。

创建 Lambda 函数

1.打开 Lambda 控制台。

2.选择创建函数
注意:如果您没有 Lambda 函数,则会出现开始使用页面。选择创建函数,然后继续下一步。

3.确保选择了从头开始创作,然后配置以下选项:
对于名称,输入函数名称。
对于运行时,选择其中一个 Python 选项。
对于角色,选择选择现有角色
对于现有角色,请选择有权运行 AWS Glue 作业的 IAM 角色。

4.选择创建函数

5.在函数代码部分中,粘贴类似以下内容的代码。请务必将 MyTestJob 替换为 AWS Glue ETL 作业的名称。

# Set up logging
import json
import os
import logging
logger = logging.getLogger()
logger.setLevel(logging.INFO)

# Import Boto 3 for AWS Glue
import boto3
client = boto3.client('glue')

# Variables for the job: 
glueJobName = "MyTestJob"

# Define Lambda function
def lambda_handler(event, context):
    logger.info('## TRIGGERED BY EVENT: ')
    logger.info(event)
    response = client.start_job_run(JobName = glueJobName)
    logger.info('## STARTED GLUE JOB: ' + glueJobName)
    logger.info('## GLUE JOB RUN ID: ' + response)
    return response

6.在页面的右上角,选择保存,然后选择测试

7.打开 AWS Glue 控制台并确认作业已启动。

创建 CloudWatch Events 规则

1.打开 CloudWatch 控制台。

2.在导航窗格中,选择规则,然后选择创建规则

3.在事件源部分中,选择事件模式,然后选择名为生成事件模式以按服务匹配事件的元素。从结果下拉列表中,选择自定义事件模式

4.在生成自定义事件模式框中,使用以下代码替换已有代码。请务必将 MyTestCrawl 替换为您的 AWS Glue 爬网程序的名称。

{
    "detail-type": ,
    "source": ,
    "detail": {
        "crawlerName": ,
        "state": 
    }
}

5.在页面右侧的目标部分,选择添加目标

6.在下拉列表中,选择 Lambda 函数(如果尚未选中)。

7.在函数下拉列表中,选择 Lambda 函数的名称。

8.在页面的右下角,选择配置详细信息

9.为您的 CloudWatch Events 规则输入名称描述,然后选择创建规则

要测试 Lambda 函数和 CloudWatch Events 规则,请运行 AWS Glue 爬网程序。然后,检查 AWS Glue ETL 作业的历史记录选项卡。运行状态应显示为正在启动正在运行

注意:CloudWatch Events 将尽最大努力发出。在极少数情况下,事件可能会次序混乱或缺失,Lambda 函数可能无法运行。