【问题标题】:Using an EventBridge event pattern string in a lambda function在 lambda 函数中使用 EventBridge 事件模式字符串
【发布时间】:2021-02-05 13:31:18
【问题描述】:

我有一个使用 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 规则的定义如下:

如何将事件模式中的值传递给变量? 我是否需要配置测试模式才能将结果输入event

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

【问题讨论】:

  • 函数触发时print(event)的结果是什么。您还可以显示触发 lambda 的 EB 规则吗?
  • 当然。我会用图片更新帖子。
  • 请查看更新后的帖子@Marcin
  • 谢谢,但我的意思是print(event),当您的函数实际被 EB 调用时,而不是当您在控制台中测试它时。 event 对象在这两种情况下都会有所不同。
  • 我明白了。该规则处于活动状态,我通过表更改触发它,但不知道在哪里可以看到此print(event) 信息。你知道我在哪里可以查到吗?也许是 CloudWatch?

标签: amazon-web-services aws-glue aws-event-bridge


【解决方案1】:

由 CloudWatch (CW) 事件/事件桥 (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 事件:

【讨论】:

  • 谢谢。我仍然无法在 CloudWatch 中找到可以看到 print(event) 的位置。我在 Cloudwatch > Log Groups 下找到了我的事件(表更改),但我看不到信息。我将使用表更改事件的日志事件图片更新帖子。
  • @ire CloudWatch 日志。您的函数应该有一个log group。如果它不存在,则它要么未触发,要么您的 lambda 执行角色缺少 CW 权限。你能检查一下吗?
  • 我在主帖中附上了日志事件的图片。很有可能是权限问题。现在将对此进行调查并通知您。
  • @ire 我还更新了答案,说明如何在 lambda 控制台中使用 Glue 的示例 EB 事件作为测试。使用 event 更容易测试您的功能。
  • 让它在我的用例上工作:) 一旦它允许我会给予奖励
猜你喜欢
  • 2021-09-02
  • 2022-10-21
  • 2023-01-28
  • 2021-05-13
  • 1970-01-01
  • 1970-01-01
  • 2014-10-04
  • 2021-08-21
  • 2011-03-17
相关资源
最近更新 更多