在 Amaz OpenSearch on DynamoDB 上使用采集管道 - 亚马逊 OpenSearch 服务

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

在 Amaz OpenSearch on DynamoDB 上使用采集管道

您可以将 OpenSearch 采集管道与 DynamoDB 配合使用,将 DynamoDB 表事件(例如创建、更新和删除)流式传输到亚马逊服务域和集合。 OpenSearch OpenSearch Ingestion 管道整合了变更数据捕获 (CDC) 基础架构,以提供一种高规模、低延迟的方式来持续流式传输 DynamoDB 表中的数据。

您可以通过两种方式使用 DynamoDB 作为处理数据的来源:有或没有完整初始快照

完整的初始快照是 DynamoDB 使用恢复 (PITR) 功能拍摄的表point-in-time 的备份。DynamoDB 将此快照上传到 Amazon S3。从那里,In OpenSearch gestion 管道将其发送到域中的一个索引,或者将其分区到域中的多个索引。为了保持 DynamoDB 中的数据一致 OpenSearch 性,管道将 DynamoDB 表中的所有创建、更新和删除事件与保存在一个或多个索引中的文档同步。 OpenSearch

当您使用完整的初始快照时,您的 OpenSearch 摄取管道会首先提取快照,然后开始从 DynamoDB Streams 读取数据。它最终会赶上并保持 DynamoDB 和之间近乎实时的数据一致性。 OpenSearch选择此选项时,必须在表中同时启用 PITR 和 DynamoDB 流。

您也可以使用 OpenSearch Ingestion 与 DynamoDB 的集成在没有快照的情况下流式传输事件。如果您已经拥有来自其他机制的完整快照,或者您只想通过 DynamoDB Streams 从 DynamoDB 表中流式传输当前事件,请选择此选项。选择此选项时,只需要在表中启用 DynamoDB 流。

有关此集成的更多信息,请参阅开发人员指南中的 DynamoDB 零 ETL 与 OpenSearch 亚马逊服务的集成。Amazon DynamoDB

先决条件

要设置管道,您必须有一个已启用 DynamoDB Streams 的 DynamoDB 表。您的流应使用 NEW_IMAGE 流视图类型。但是,NEW_AND_OLD_IMAGES如果这种流视图类型适合您的用例, OpenSearch Ingestion 管道也可以使用流式传输事件。

如果您使用的是快照,则还必须在表上启用 point-in-time 恢复。有关更多信息,请参阅 Amazon DynamoD B 开发者指南中的创建表启用 point-in-time 恢复和启用流。

步骤 1:配置管道角色

设置 DynamoDB 表后,设置要在管道配置中使用的管道角色,并在该角色中添加以下 DynamoDB 权限:

{ "Version": "2012-10-17", "Statement": [ { "Sid": "allowRunExportJob", "Effect": "Allow", "Action": [ "dynamodb:DescribeTable", "dynamodb:DescribeContinuousBackups", "dynamodb:ExportTableToPointInTime" ], "Resource": [ "arn:aws:dynamodb:us-east-1:{account-id}:table/my-table" ] }, { "Sid": "allowCheckExportjob", "Effect": "Allow", "Action": [ "dynamodb:DescribeExport" ], "Resource": [ "arn:aws:dynamodb:us-east-1:{account-id}:table/my-table/export/*" ] }, { "Sid": "allowReadFromStream", "Effect": "Allow", "Action": [ "dynamodb:DescribeStream", "dynamodb:GetRecords", "dynamodb:GetShardIterator" ], "Resource": [ "arn:aws:dynamodb:us-east-1:{account-id}:table/my-table/stream/*" ] }, { "Sid": "allowReadAndWriteToS3ForExport", "Effect": "Allow", "Action": [ "s3:GetObject", "s3:AbortMultipartUpload", "s3:PutObject", "s3:PutObjectAcl" ], "Resource": [ "arn:aws:s3:::my-bucket/{exportPath}/*" ] } ] }

您也可以使用 AWS KMS 客户管理的密钥对导出数据文件进行加密。要解密导出的对象,请在管道的导出配置中指定 s3_sse_kms_key_id 作为密钥 ID,格式如下:arn:aws:kms:us-west-2:{account-id}:key/my-key-id。以下策略包括使用客户托管密钥所需的权限:

{ "Sid": "allowUseOfCustomManagedKey", "Effect": "Allow", "Action": [ "kms:GenerateDataKey", "kms:Decrypt" ], "Resource": arn:aws:kms:us-west-2:{account-id}:key/my-key-id }

步骤 2:创建管道

然后,您可以配置如下所示的 OpenSearch 采集管道,将 DynamoDB 指定为来源。此示例管道使用 PITR 快照从 table-a 中摄取数据,然后从 DynamoDB Streams 摄取事件。LATEST 的起始位置指示管道应从 DynamoDB Streams 读取最新数据。

version: "2" cdc-pipeline: source: dynamodb: tables: - table_arn: "arn:aws:dynamodb:us-west-2:{account-id}:table/table-a" export: s3_bucket: "my-bucket" s3_prefix: "export/" stream: start_position: "LATEST" aws: region: "us-west-2" sts_role_arn: "arn:aws:iam::{account-id}:role/pipeline-role" sink: - opensearch: hosts: ["https://search-mydomain.us-east-1.es.amazonaws.com"] index: "${getMetadata(\"table_name\")}" index_type: custom normalize_index: true document_id: "${getMetadata(\"primary_key\")}" action: "${getMetadata(\"opensearch_action\")}" document_version: "${getMetadata(\"document_version\")}" document_version_type: "external"

您可以使用预配置的 DynamoDB 蓝图来创建此管道。有关更多信息,请参阅 使用蓝图创建管道

数据一致性

OpenSearch Ingestion 支持 end-to-end 确认以确保数据的持久性。管道读取快照或流时,它会动态创建分区以进行并行处理。当管道在摄取 OpenSearch 域或集合中的所有记录后收到确认信息时,该管道会将该分区标记为已完成。

如果要收录到 OpenSearch 无服务器搜索集合中,可以在管道中生成文档 ID。如果要采集到 OpenSearch 无服务器时间序列集合中,请注意该管道不会生成文档 ID。

In OpenSearch gestion 管道还将传入的事件操作映射到相应的批量索引操作中,以帮助采集文档。这样可以保持数据的一致性,因此 DynamoDB 中的每个数据更改都与中的相应文档更改保持一致。 OpenSearch

映射数据类型

OpenSearch 服务将每个传入文档中的数据类型动态映射到 DynamoDB 中的相应数据类型。下表显示了 S OpenSearch ervice 如何自动映射各种数据类型。

数据类型 OpenSearch DynamoDB
数字

OpenSearch 自动映射数值数据。如果该数字是整数,则将其 OpenSearch 映射为长值。如果数字是小数,则将其 OpenSearch 映射为浮点值。

OpenSearch 根据第一个发送的文档动态映射各种属性。如果您在 DynamoDB 中为同一属性混合了多种数据类型(例如整数和小数),则映射可能会失败。

例如,如果您的第一个文档的属性为整数,而后来的文档具有与小数相同的属性, OpenSearch 则无法收录第二个文档。在这些情况下,应提供一个显式的映射模板,如下所示:

{ "template": { "mappings": { "properties": { "MixedNumberAttribute": { "type": "float" } } } } }

如果需要双精度,请使用字符串类型字段映射。不存在支持 38 位精度的等效数字类型 OpenSearch。

DynamoDB 支持数字

数字集 OpenSearch 自动将数字集映射到由长值或浮点值组成的数组中。与标量数字一样,这取决于摄取的第一个数字是整数还是小数。您可以像映射标量字符串一样提供数字集的映射。

DynamoDB 支持表示数字集的类型。

String

OpenSearch 自动将字符串值映射为文本。在某些情况下(例如枚举值),您可以映射到关键字类型。

以下示例说明如何将PartType名为的 DynamoDB 属性映射到关键字。 OpenSearch

{ "template": { "mappings": { "properties": { "PartType": { "type": "keyword" } } } } }

DynamoDB 支持字符串

字符串集

OpenSearch 自动将字符串集映射到字符串数组中。您可以像映射标量字符串一样提供字符串集的映射。

DynamoDB 支持表示字符串集的类型。
二元

OpenSearch 自动将二进制数据映射为文本。您可以提供映射以将它们写成二进制字段 OpenSearch。

以下示例说明如何将ImageData名为的 DynamoDB 属性映射到 OpenSearch 二进制字段。

{ "template": { "mappings": { "properties": { "ImageData": { "type": "binary" } } } } }
DynamoDB 支持二进制类型属性
二进制集

OpenSearch 自动将二进制集作为文本映射到二进制数据数组中。您可以像映射标量二进制一样提供数字集的映射。

DynamoDB 支持表示二进制值集的类型。
布尔值

OpenSearch 将 DynamoDB 布尔类型映射为 OpenSearch 布尔类型。

DynamoDB 支持布尔类型属性

Null

OpenSearch 可以采集 DynamoDB 空类型的文档。它将该值作为空值保存在文档中。此类型没有映射,并且此字段未编制索引或不可搜索。

如果对空类型使用相同的属性名称,然后更改为其他类型(例如字符串),则会为第一个非空值 OpenSearch 创建动态映射。后续值仍然可以是 DynamoDB 空值。

DynamoDB 支持空类型属性
Map

OpenSearch 将 DynamoDB 映射属性映射到嵌套字段。嵌套字段内也适用相同的映射。

以下示例将嵌套字段中的字符串映射到中的关键字类型 OpenSearch:

{ "template": { "mappings": { "properties": { "AdditionalDescriptions": { "properties": { "PartType": { "type": "keyword" } } } } } } }
DynamoDB 支持映射类型属性
列出

OpenSearch 根据列表中的内容,为 DynamoDB 列表提供了不同的结果。

当列表包含所有相同类型的标量类型(例如,所有字符串的列表)时,则将该列表作为 OpenSearch 该类型的数组提取。这适用于字符串、数字、布尔值和空类型。其中每种类型的限制与该类型标量的限制相同。

您还可以使用与映射相同的映射,为映射列表提供映射。

您无法提供混合类型的列表。

DynamoDB 支持列表类型属性

设置

OpenSearch 根据集合中的内容为 DynamoDB 集提供不同的结果。

当一个集合包含所有相同类型的标量类型(例如,所有字符串的集合)时,则将该集合作为该类型的数组 OpenSearch 摄取。这适用于字符串、数字、布尔值和空类型。其中每种类型的限制与该类型标量的限制相同。

您还可以使用与映射相同的映射,为映射集合提供映射。

您无法提供混合类型的集合。

DynamoDB 支持表示集合的类型。

我们建议您在摄取管道中配置死信队列 (DLQ)。 OpenSearch 如果您已配置队列,S OpenSearch ervice 会将所有由于动态映射失败而无法载入的失败文档发送到队列。

如果自动映射失败,则可以在管道配置中使用 template_typetemplate_content 来定义显式映射规则。或者,您可以在启动管道之前直接在搜索域或集合中创建映射模板。

限制

在为 DynamoDB 设置 OpenSearch 摄取管道时,请考虑以下限制:

  • OpenSearch 采集与 DynamoDB 的集成目前不支持跨区域接入。您的 DynamoDB 表 OpenSearch 和摄取管道必须相同。 AWS 区域

  • 您的 DynamoDB 表 OpenSearch 和摄取管道必须相同。 AWS 账户

  • 一个 OpenSearch 摄取管道仅支持一个 DynamoDB 表作为其来源。

  • DynamoDB Streams 仅在日志中存储最多 24 小时的数据。如果从大型表的初始快照中摄取数据需要 24 小时或更长时间,则会丢失一些初始数据。为了缓解这种数据丢失,请估计表的大小并配置适当的 OpenSearch 摄取管道计算单元。