

# 将 DynamoDB 与 Amazon EventBridge 集成
<a name="eventbridge-for-dynamodb"></a>

Amazon DynamoDB 提供用于捕获变更数据的 DynamoDB Streams，可帮助捕获 DynamoDB 表中的项目级更改。DynamoDB Streams 可以调用 Lambda 函数来处理这些更改，从而支持与其他服务和应用程序进行事件驱动型集成。DynamoDB Streams 还支持筛选，可实现高效且有针对性的事件处理。

DynamoDB Streams 支持每个分片最多[同时有两个使用者](ServiceQuotas.md#limits-dynamodb-streams)，并支持通过 [Lambda 事件筛选](https://docs.aws.amazon.com/lambda/latest/dg/invocation-eventfiltering.html)功能进行筛选，以便仅处理符合特定条件的项目。有些客户可能要求支持两个以上使用者。其他人可能需要在处理更改事件之前扩充事件数据，或者使用更高级的筛选和路由功能。

将 DynamoDB 与 EventBridge 集成可以满足这些要求。

Amazon EventBridge 是一项无服务器服务，使用事件将应用程序组件连接在一起，可让您更轻松地构建可扩展的事件驱动型应用程序。EventBridge 通过 EventBridge Pipes 提供与 Amazon DynamoDB 的原生集成，可帮助将数据从 DynamoDB 轻松传输到 EventBridge 总线。然后，该总线可以通过一组规则和目标将事件传输到多个应用程序和服务。

**Topics**
+ [工作原理](#eventbridge-for-dynamodb-how-it-works)
+ [通过控制台创建集成](#eventbridge-for-dynamodb-create-integration-console)
+ [后续步骤](#eventbridge-for-dynamodb-next-steps)

## 工作原理
<a name="eventbridge-for-dynamodb-how-it-works"></a>

通过将 DynamoDB 与 EventBridge 管道集成，可以使用 DynamoDB Streams 在 DynamoDB 表中捕获按时间排序的项目级更改序列。以这种方式捕获的每条记录都包含表中修改的数据。

![\[显示如何将 DynamoDB Streams 与 Amazon EventBridge 总线集成的图片。\]](http://docs.aws.amazon.com/zh_cn/amazondynamodb/latest/developerguide/images/eventbridge-dynamodb.png)


EventBridge 管道从 DynamoDB Streams 接收事件并将其路由到诸如 EventBridge 总线 [事件总线是接收事件并将其传送到目的地（也称为目标）的路由器] 之类的目标。交付取决于哪些规则与事件内容相匹配。该管道还能够筛选特定事件，以及在将事件数据发送到目标之前对其进行扩充。

虽然 EventBridge 支持[多种目标类型](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-targets.html)，但在实施扇出设计时，常见的选择是使用 Lambda 函数作为目标。以下示例演示了如何与 Lambda 函数目标进行集成。

## 通过控制台创建集成
<a name="eventbridge-for-dynamodb-create-integration-console"></a>

按照以下步骤，通过 AWS 管理控制台来创建集成。

1. 按照《DynamoDB 开发人员指南》的[启用流](Streams.md#Streams.Enabling)部分中的步骤，在源表上启用 DynamoDB Streams。如果源表上已启用 DynamoDB Streams，请验证当前使用者是否少于两个。使用者可能是 Lambda 函数、DynamoDB 全局表、与 Amazon OpenSearch Service 进行零 ETL 集成的 Amazon DynamoDB，或者是直接从流中读取数据（例如通过 DynamoDB Streams Kinesis 适配器）的应用程序。

1. 按照《EventBridge 用户指南》中[创建 Amazon EventBridge 事件总线](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-create-event-bus.html)部分中的步骤，创建 EventBridge 事件总线。

   1. 创建事件总线后，启用**架构发现**。

1. 按照《EventBridge 用户指南》中[创建 Amazon EventBridge 管道](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-pipes-create.html)部分中的步骤，创建 EventBridge 管道。

   1. 配置源时，在**源**字段中选择 *DynamoDB*，然后在 **DynamoDB Streams** 字段中选择源表流的名称。

   1. 配置目标时，在**目标服务**字段中选择 *EventBridge 事件总线*，在**事件总线作为目标**字段中，选择在步骤 2 中创建的事件总线。

1. 向源 DynamoDB 表中写入项目示例以触发事件。这将允许 EventBridge 从该项目示例推断出架构。此架构可用于创建路由事件的规则。例如，如果您要实施涉及[重载属性](bp-gsi-overloading.md)的设计模式，可能需要根据排序键的值触发不同的规则。有关如何向 DynamoDB 写入项目的详细信息，请参阅《DynamoDB 开发人员指南》中的[使用项目和属性](WorkingWithItems.md#WorkingWithItems.WritingData)部分。

1. 按照《Lambda 开发人员指南》中[使用 Python 构建 Lambda 函数](https://docs.aws.amazon.com/lambda/latest/dg/lambda-python.html)部分中的步骤，创建一个用作目标的 Python Lambda 函数示例。在创建函数时，可以使用下面的代码示例来演示集成。调用时，它将打印与可以在 CloudWatch 日志中查看的事件一起接收的 `NewImage` 和 `OldImage`。

   ```
   import json
   
   def lambda_handler(event, context):
       dynamodb = event.get('detail', {}).get('dynamodb', {})
       new_image = dynamodb.get('NewImage')
       old_image = dynamodb.get('OldImage')
       
       if new_image:
           print("NewImage:", json.dumps(new_image, indent=2))
       if old_image:
           print("OldImage:", json.dumps(old_image, indent=2))
       
       return {'statusCode': 200, 'body': json.dumps(event)}
   ```

1. 按照《EventBridge 用户指南》中，介绍如何对事件做出发应的[创建规则](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-create-rule.html)部分中的步骤，创建可将事件路由到新 Lambda 函数的 EventBridge 规则。

   1. 定义规则详细信息时，选择您在步骤 2 中创建的事件总线的名称作为**事件总线**。

   1. 构建事件模式时，请遵循**现有架构**指南。在这里，您可以为事件选择*发现的架构*注册表和已发现的架构。这将允许您配置特定于您的用例的事件模式，以便仅路由与特定属性匹配的消息。例如，如果您希望只匹配 SK 以 `“user#”` 开头的 DynamoDB 项，则可以使用如下配置。  
![\[显示 EventBridge 规则的图片，其中仅显示排序键以 “user#”开头的 DynamoDB 项。\]](http://docs.aws.amazon.com/zh_cn/amazondynamodb/latest/developerguide/images/eventbridge-rule-example.png)

   1. 根据架构完成模式设计后，单击**以 JSON 格式生成事件模式**。相反，如果要匹配 DynamoDB Streams 中显示的所有事件，请使用以下 JSON 生成事件模式。

      ```
      {
        "source": ["aws.dynamodb"]
      }
      ```

   1. 选择目标时，请按照 AWS 服务指南操作。在“选择目标”字段中，选择“Lambda 函数”。在“函数”字段中，选择您在步骤 5 中创建的 Lambda 函数。

1. 现在，您可以按照《EventBridge 用户指南》中[在事件总线中启动或停止架构发现](https://docs.aws.amazon.com/eventbridge/latest/userguide/event-bus-update.html#event-bus-update-schema)部分中的步骤，停止在事件总线中发现架构。

1. 在源 DynamoDB 表中写入第二个项目示例以触发事件。验证是否在每个步骤中成功处理了该事件。

   1. 按照《EventBridge 用户指南》中**监控 Amazon EventBridge**部分中的步骤，查看事件总线的 CloudWatch 指标 [PutEventsApproximateSuccessCount](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-monitoring.html)。

   1. 按照《Lambda 开发人员指南》中[监控 Lambda 函数和排查其故障](https://docs.aws.amazon.com/lambda/latest/dg/lambda-monitoring.html)部分中的步骤，查看 Lambda 函数的函数日志。如果 Lambda 函数使用提供的代码示例，您应该会在 CloudWatch Logs 日志组中看到来自 DynamoDB Streams 的打印的 `NewImage` 和 `OldImage`。

   1. 按照《Lambda 开发人员指南》中[监控 Lambda 函数和排查其故障](https://docs.aws.amazon.com/lambda/latest/dg/lambda-monitoring.html)部分中的步骤，查看 Lambda 函数的**错误计数和成功率（%）**指标。

## 后续步骤
<a name="eventbridge-for-dynamodb-next-steps"></a>

此示例提供了将单个 Lambda 函数作为目标的基本集成。要更好地了解更复杂的配置（例如，如何创建多个规则、创建多个目标、与其他服务集成以及扩充事件），请参阅完整的 EventBridge 用户指南：[开始使用 EventBridge](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-get-started.html)。

**注意**  
请注意可能与您的应用程序相关的任何 EventBridge 配额。虽然 DynamoDB Streams 容量能够随您的表而扩展，但 EventBridge 配额是单独提供的。在大型应用程序中，需要注意的常见配额是**每秒事务中的调用节流限制**和**每秒事务中的 PutEvents 节流限制**。这些配额指定了可以发送到目标的调用次数以及每秒可以放入总线的事件数。