在 lambda 函数中使用 EventBridge 事件模式字符串

问题描述

我有一个使用 Python 的 lambda 函数。 它与 EventBridge 规则相关联,该规则在每次 glue 表发生更改时触发。

输出的事件模式如下所示:

{
    "version":"0","detail":{
        "databaseName":"flights-db","typeOfChange":"UpdateTable","tableName":"flightscsv"
    }
}

我想将此输出中的 tableNamedatabaseName 值作为变量放入函数中。

我的 Lambda 函数

import json
import boto3

def lambda_handler(event,context):
    boto3_version = boto3.__version__

    return_statement = 'Boto3 version: ',boto3_version,\
                       'Event output: ',event

    return {
        'statusCode': 200,'body': json.dumps(return_statement)
    }

我希望在我的 return 语句中从 event 获得事件模式输出,但事实并非如此。

测试此函数时,event 的返回输出为:

{\"key1\": \"value1\",\"key2\": \"value2\",\"key3\": \"value3\"}

这个键和值在函数的测试模式中是这样定义的。

eventbridge 规则定义如下:

enter image description here

如何将事件模式中的值获取到变量中? 我是否需要配置测试模式才能将结果导入 event

编辑: 表更改事件的日志事件图片

enter image description here

解决方法

由 CloudWatch (CW) Events / Event Bridge (EB) 生成的 event 对象列在 here 中。当 EB 将要触发这些事件时,这些事件将传递给您的函数。

您的 EB 事件模式应该是:

{
  "source": ["aws.glue"],"detail-type": ["Glue Data Catalog Table State Change"]
}

以上内容应与胶水目录中任何表格的更改相匹配。 event 应与以下类似:

{
    "version": "0","id": "2617428d-715f-edef-70b8-d210da0317a0","detail-type": "Glue Data Catalog Table State Change","source": "aws.glue","account": "123456789012","time": "2019-01-16T18:16:01Z","region": "eu-west-1","resources": [
        "arn:aws:glue:eu-west-1:123456789012:table/d1/t1"
    ],"detail": {
        "databaseName": "d1","changedPartitions": [
            "[C.pdf,dir3]","[D.doc,dir4]"
        ],"typeOfChange": "BatchCreatePartition","tableName": "t1"
    }
}

因此,要获得 tableNamedatabaseName,您的 lambda 函数可以是:

import json
import boto3

def lambda_handler(event,context):
    boto3_version = boto3.__version__

    print(event)

    table_name = event['detail']['tableName']
    database_name = event['detail']['databaseName']

    print(table_name,database_name)

    return_statement = {
        'boto3_version': boto3_version,'table_name': table_name,'database_name': database_name
    }

    return {
        'statusCode': 200,'body': json.dumps(return_statement)
    }

为了进行测试,您可以在 lambda 测试窗口中设置示例 EB 事件:

enter image description here