本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
在 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 则无法收录第二个文档。在这些情况下,应提供一个显式的映射模板,如下所示:
如果需要双精度,请使用字符串类型字段映射。不存在支持 38 位精度的等效数字类型 OpenSearch。 |
DynamoDB 支持数字。 |
数字集 | OpenSearch 自动将数字集映射到由长值或浮点值组成的数组中。与标量数字一样,这取决于摄取的第一个数字是整数还是小数。您可以像映射标量字符串一样提供数字集的映射。 |
DynamoDB 支持表示数字集的类型。 |
String |
OpenSearch 自动将字符串值映射为文本。在某些情况下(例如枚举值),您可以映射到关键字类型。 以下示例说明如何将
|
DynamoDB 支持字符串。 |
字符串集 |
OpenSearch 自动将字符串集映射到字符串数组中。您可以像映射标量字符串一样提供字符串集的映射。 |
DynamoDB 支持表示字符串集的类型。 |
二元 |
OpenSearch 自动将二进制数据映射为文本。您可以提供映射以将它们写成二进制字段 OpenSearch。 以下示例说明如何将
|
DynamoDB 支持二进制类型属性。 |
二进制集 |
OpenSearch 自动将二进制集作为文本映射到二进制数据数组中。您可以像映射标量二进制一样提供数字集的映射。 |
DynamoDB 支持表示二进制值集的类型。 |
布尔值 |
OpenSearch 将 DynamoDB 布尔类型映射为 OpenSearch 布尔类型。 |
DynamoDB 支持布尔类型属性。 |
Null |
OpenSearch 可以采集 DynamoDB 空类型的文档。它将该值作为空值保存在文档中。此类型没有映射,并且此字段未编制索引或不可搜索。 如果对空类型使用相同的属性名称,然后更改为其他类型(例如字符串),则会为第一个非空值 OpenSearch 创建动态映射。后续值仍然可以是 DynamoDB 空值。 |
DynamoDB 支持空类型属性。 |
Map |
OpenSearch 将 DynamoDB 映射属性映射到嵌套字段。嵌套字段内也适用相同的映射。 以下示例将嵌套字段中的字符串映射到中的关键字类型 OpenSearch:
|
DynamoDB 支持映射类型属性。 |
列出 |
OpenSearch 根据列表中的内容,为 DynamoDB 列表提供了不同的结果。 当列表包含所有相同类型的标量类型(例如,所有字符串的列表)时,则将该列表作为 OpenSearch 该类型的数组提取。这适用于字符串、数字、布尔值和空类型。其中每种类型的限制与该类型标量的限制相同。 您还可以使用与映射相同的映射,为映射列表提供映射。 您无法提供混合类型的列表。 |
DynamoDB 支持列表类型属性。 |
设置 |
OpenSearch 根据集合中的内容为 DynamoDB 集提供不同的结果。 当一个集合包含所有相同类型的标量类型(例如,所有字符串的集合)时,则将该集合作为该类型的数组 OpenSearch 摄取。这适用于字符串、数字、布尔值和空类型。其中每种类型的限制与该类型标量的限制相同。 您还可以使用与映射相同的映射,为映射集合提供映射。 您无法提供混合类型的集合。 |
DynamoDB 支持表示集合的类型。 |
我们建议您在摄取管道中配置死信队列 (DLQ)。 OpenSearch 如果您已配置队列,S OpenSearch ervice 会将所有由于动态映射失败而无法载入的失败文档发送到队列。
如果自动映射失败,则可以在管道配置中使用 template_type
和 template_content
来定义显式映射规则。或者,您可以在启动管道之前直接在搜索域或集合中创建映射模板。
限制
在为 DynamoDB 设置 OpenSearch 摄取管道时,请考虑以下限制:
-
OpenSearch 采集与 DynamoDB 的集成目前不支持跨区域接入。您的 DynamoDB 表 OpenSearch 和摄取管道必须相同。 AWS 区域
-
您的 DynamoDB 表 OpenSearch 和摄取管道必须相同。 AWS 账户
-
一个 OpenSearch 摄取管道仅支持一个 DynamoDB 表作为其来源。
-
DynamoDB Streams 仅在日志中存储最多 24 小时的数据。如果从大型表的初始快照中摄取数据需要 24 小时或更长时间,则会丢失一些初始数据。为了缓解这种数据丢失,请估计表的大小并配置适当的 OpenSearch 摄取管道计算单元。