有没有什么方法可以在 AWS Glue 作业结束时触发 AWS Lambda 函数?

Is there any way to trigger a AWS Lambda function at the end of an AWS Glue job?

目前我正在使用 AWS Glue 作业将数据加载到 RedShift,但在加载之后我需要 运行 可能使用 AWS Lambda 函数的一些数据清理任务。有什么方法可以在 Glue 作业结束时触发 Lambda 函数吗?可以使用 SNS 消息触发 Lambda 函数,但我找不到在 Glue 作业结束时发送 SNS 的方法。

没有。目前,您无法在 Glue 作业结束时触发 lambda 函数。原因是AWS在Lambda中还没有提供这个触发器。如果您在创建 lambda 函数后查看 AWS lambda 触发器列表,您会发现它有大部分 AWS 服务作为触发器,但没有 AWS Glue。所以,目前不可能,但将来可能。

但我想提一下,您实际上可以使用 lambda python 脚本来控制胶水脚本的流程。 (我使用 python 做到了,我相信可能有其他语言支持这个)。我的用例是,每当我在 S3 存储桶中上传任何对象时,它都会获取 lambda 函数触发器,我从中读取对象文件并开始我的胶水作业。一旦 Glue 作业的状态完成,我会将我的文件写回与此 Lambda 函数链接的 S3 存储桶。

Lambda 可以在 S3 put 上触发。您可以在 S3 上放置一个虚拟文件作为最后的粘合作业;这又会触发 lambda。我已经测试过了。

@oreoluwa 是对的,这可以使用 Cloudwatch Events 来完成。

来自 Cloudwatch 仪表板:

  • 点击左侧菜单中的'Rules'
  • 对于 'Event Source',选择 'Event Pattern' 并在 'Service Name' 中选择 'Glue'
  • 对于'Event Type'选择'Glue Job State Change'
  • 在页面右侧的 'Targets' 部分,单击 'Add Target' -> 'Lambda Function',然后选择您的函数。

您将在 Lambda 中获得的事件格式为:

{
    'version': '0',
    'id': 'a9bc90be-xx00-03e0-9bc5-a0a0a0a0a0a0',
    'detail-type': 'GlueJobStateChange',
    'source': 'aws.glue',
    'account': 'xxxxxxxxxx',
    'time': '2018-05-10T16: 17: 03Z',
    'region': 'us-east-2',
    'resources': [],
    'detail': {
        'jobName': 'xxxx_myjobname_yyyy',
        'severity': 'INFO',
        'state': 'SUCCEEDED',
        'jobRunId': 'jr_565465465446788dfdsdf546545454654546546465454654',
        'message': 'Jobrunsucceeded'
    }
}

由于 AWS Glue 已经开始支持 python,您可能可以按照以下路径来实现您想要的。下面的示例脚本显示了如何执行此操作 -

import sys
from awsglue.transforms import *
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job
import boto3   ## Step-2

## @params: [JOB_NAME]
args = getResolvedOptions(sys.argv, ['JOB_NAME'])

sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session
job = Job(glueContext)
job.init(args['JOB_NAME'], args)

## Do all ETL stuff here

## Once the ETL completes
lambda_client = boto3.client('lambda')  ## Step-3
response = lambda_client.invoke(FunctionName='string')  ## Step-4
  1. 创建一个基于 python 的 Glue 作业(在 Redshift 上执行 ETL)
  2. 在作业脚本中,导入boto3(需要将此包作为脚本库)
  3. 使用 boto3 连接到 lambda
  4. ETL 完成后,使用 boto3 lambda invoke() 调用 lambda 函数。

请确保您在创建 Glue 作业时使用的角色具有调用 lambda 函数的权限。

请参阅 lambda here 的 Boto3 文档。

@ace 和@adeel 提供了部分解决方案,但您可以通过使用以下事件模式创建 CloudWatch 规则来解决此问题:

{
  "source": [
    "aws.glue"
  ],
  "detail-type": [
    "Glue Job State Change"
  ],
  "detail": {
    "jobName": [
      "<YourJobName>"
    ],
    "state": [
      "SUCCEEDED"
    ]
  }
}