1

我有一个使用 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)
    }

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

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

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

此键和值在功能的测试模式中定义如下。

eventbridge 规则定义如下: 在此处输入图像描述

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

编辑:表更改事件的日志事件图片: 在此处输入图像描述

4

1 回答 1

3

此处event列出了 CloudWatch (CW) 事件/事件桥 (EB) 生成的对象。这些事件将在 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 事件:

在此处输入图像描述

于 2021-02-09T09:27:39.513 回答