使用亚马逊 S3 作为目标 AWS Database Migration Service - AWS 数据库迁移服务

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

使用亚马逊 S3 作为目标 AWS Database Migration Service

您可以使用任何支持的数据库源将数据迁移到 Amazon S3。 AWS DMS 在 AWS DMS 任务中使用 Amazon S3 作为目标时,默认情况下,满载和更改数据捕获 (CDC) 数据都以逗号分隔值 (.csv) 格式写入。对于更紧凑的存储和更快速的查询选项,您还可以选择将数据写入 Apache Parquet (.parquet) 格式。

AWS DMS 使用增量十六进制计数器命名在满载期间创建的文件,例如,.csv 文件的 LOAD00001.csv、LOAD00002...、LOAD00009、LOAD0000A 等。 AWS DMS 使用时间戳命名 CDC 文件,例如 20141029-1134010000.csv。对于每个包含记录的源表,在指定的目标文件夹下 AWS DMS 创建一个文件夹(如果源表不为空)。 AWS DMS 将所有满载文件和 CDC 文件写入指定的 Amazon S3 存储桶。您可以使用MaxFileSize端点设置控制所 AWS DMS 创建文件的大小。

参数 bucketFolder 包含 .csv 或 .parquet 文件在上传到 S3 存储桶之前的存储位置。利用 .csv 文件,表数据使用以下格式存储在 S3 存储桶中,与完全加载文件一起显示。

database_schema_name/table_name/LOAD00000001.csv database_schema_name/table_name/LOAD00000002.csv ... database_schema_name/table_name/LOAD00000009.csv database_schema_name/table_name/LOAD0000000A.csv database_schema_name/table_name/LOAD0000000B.csv ...database_schema_name/table_name/LOAD0000000F.csv database_schema_name/table_name/LOAD00000010.csv ...

您可以使用额外连接属性指定列分隔符、行分隔符以及其他参数。有关额外连接属性的更多信息,请参阅此部分结尾的使用 Amazon S3 作为目标时的终端节点设置 AWS DMS

您可以使用 ExpectedBucketOwner Amazon S3 端点设置指定存储桶拥有者并防止狙击,如下所示。然后,当您发出测试连接或执行迁移的请求时,S3 会根据指定参数检查存储桶拥有者的账户 ID。

--s3-settings='{"ExpectedBucketOwner": "AWS_Account_ID"}'

当您使用使用 AWS DMS CDC 任务复制数据更改时,.csv 或.parquet 输出文件的第一列会指示行数据的更改方式,如以下.csv 文件所示。

I,101,Smith,Bob,4-Jun-14,New York U,101,Smith,Bob,8-Oct-15,Los Angeles U,101,Smith,Bob,13-Mar-17,Dallas D,101,Smith,Bob,13-Mar-17,Dallas

在本示例中,假设源数据库中有一个EMPLOYEE表。 AWS DMS 将数据写入.csv 或.parquet 文件,以响应以下事件:

  • 14 年 6 月 4 日,纽约办事处聘用了一名新员工 (Bob Smith,员工 ID 101)。在 .csv 或 .parquet 文件中,第一列中的 I 指示在源数据库的 EMPLOYEE 表中插入 (INSERT) 了一个新行。

  • 15 年 10 月 8 日,Bob 调到了洛杉矶办事处。在 .csv 或 .parquet 文件中,U 指示更新 (UPDATE) 了 EMPLOYEE 表中的相应行以反映 Bob 的新办公地点。该行的其余部分反映更新(UPDATE)后如何显示该 EMPLOYEE 表行。

  • 17 年 3 月 13 日,Bob 又调到了达拉斯办事处。在 .csv 或 .parquet 文件中,U 指示再次更新 (UPDATE) 了该行。该行的其余部分反映更新(UPDATE)后如何显示该 EMPLOYEE 表行。

  • 在达拉斯工作一段时间后,Bob 离开了公司。在 .csv 或 .parquet 文件中,D 指示在源表中删除 DELETE 了该行。该行的其余部分反映在删除之前如何显示该 EMPLOYEE 表行。

请注意,默认情况下,CDC 会 AWS DMS 存储每个数据库表的行更改,而不考虑事务顺序。如果要根据事务顺序将行更改存储在 CDC 文件中,则需要使用 S3 端点设置来指定此设置以及您希望在 S3 目标上存储 CDC 事务文件的文件夹路径。有关更多信息,请参阅 捕获数据更改(CDC)时包括 S3 目标上的事务顺序

要控制在执行数据复制任务期间向 Amazon S3 目标写入的频率,您可以配置 cdcMaxBatchIntervalcdcMinFileSize 额外连接属性。这可以提高分析数据的性能,而无需任何额外的开销操作。有关更多信息,请参阅使用 Amazon S3 作为目标时的终端节点设置 AWS DMS

将 Amazon S3 作为目标的先决条件

在使用 Amazon S3 作为目标之前,请检查是否满足以下条件:

  • 您用作目标的 S3 存储桶与您用于迁移数据的 DMS 复制实例位于同一 AWS 区域。

  • 您用于迁移的 AWS 账户具有 IAM 角色,该角色对用作目标的 S3 存储桶具有写入和删除权限。

  • 此角色已标记访问,以便您可以标记写入目标存储桶的任何 S3 对象。

  • IAM 角色已将 DMS(dms.amazonaws.com)添加为可信实体

  • 对于 AWS DMS 版本 3.4.7 及更高版本,DMS 必须通过 VPC 终端节点或公共路由访问源存储桶。有关 VPC 终端节点的信息,请参阅将 VPC 端点配置为 AWS DMS 源端点和目标端点

要设置此账户访问权限,请确保向用于创建迁移任务的用户账户分配的角色具有以下一系列权限。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:PutObject", "s3:DeleteObject", "s3:PutObjectTagging" ], "Resource": [ "arn:aws:s3:::buckettest2/*" ] }, { "Effect": "Allow", "Action": [ "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::buckettest2" ] } ] }

有关将 S3 作为目标使用验证的先决条件,请参阅S3 目标验证先决条件

将 Amazon S3 作为目标的限制

将 Amazon S3 作为目标时存在以下限制:

  • 不要为 S3 启用版本控制。如果您需要 S3 版本控制,请使用生命周期策略主动删除旧版本。否则,您可能会遇到由于 S3 list-object 调用超时而导致端点测试连接失败的情况。要为 S3 存储桶创建生命周期策略,请参阅管理存储生命周期。要删除 S3 对象的某个版本,请参阅从启用版本控制的存储桶中删除对象版本

  • 3.4.7 及更高版本支持启用了 VPC(网关 VPC)的 S3 存储桶。

  • 支持以下数据定义语言(DDL)命令以更改数据捕获(CDC):截断表、删除表、创建表、重命名表、添加列、删除列、重命名列、重命名列和更改列数据类型。请注意,在源数据库上添加、删除或重命名列时,目标 S3 存储桶中不会记录 ALTER 语句, AWS DMS 也不会更改先前创建的记录以匹配新结构。更改后,使用新的表结构 AWS DMS 创建任何新记录。

    注意

    截断 DDL 操作会删除 S3 存储桶中的所有文件和相应的表文件夹。您可以使用任务设置来禁用该行为,并配置 DMS 在更改数据捕获(CDC)期间处理 DDL 行为的方式。有关更多信息,请参阅 更改DDL处理的任务设置

  • 不支持完整 LOB 模式。

  • 不支持在完全加载期间对源表结构进行更改。支持在完全加载期间更改数据。

  • 将多个任务从同一源表复制到同一目标 S3 终端节点存储桶将导致这些任务写入到同一文件。如果您的数据源来自同一个表,我们建议您指定不同的目标端点(存储桶)。

  • S3 端点不支持 BatchApply。为 S3 目标使用“批应用”(例如,BatchApplyEnabled 目标元数据任务设置)可能会导致数据丢失。

  • 您可以将 DatePartitionEnabledaddColumnNamePreserveTransactionsCdcPath 一起使用。

  • AWS DMS 不支持使用转换规则将多个源表重命名为同一个目标文件夹。

  • 如果在完全加载阶段对源表进行大量写入,则 DMS 可能会将重复的记录写入 S3 存储桶或缓存的更改。

  • 如果为任务配置的 TargetTablePrepModeDO_NOTHING,并且任务在完全加载阶段突然停止并恢复,则 DMS 可能会将重复的记录写入 S3 存储桶。

  • 如果为目标端点配置的 PreserveTransactions 设置为 true,则重新加载表不会清除之前生成的 CDC 文件。有关更多信息,请参阅 捕获数据更改(CDC)时包括 S3 目标上的事务顺序

有关将 S3 作为目标使用验证的限制,请参阅使用 S3 目标验证的限制

安全性

要使用 Amazon S3 作为目标,在迁移中使用的账户必须具有对作为目标的 Amazon S3 存储桶的写入和删除访问权限。对于具有访问 Amazon S3 所需权限的 IAM 角色,指定该角色的 Amazon 资源名称(ARN)。

AWS DMS 支持一组针对 Amazon S3 的预定义授权,称为固定访问控制列表 (ACL)。每个标准 ACL 具有一组被授予者和权限,可用于为 Amazon S3 存储桶设置权限。您可以将 cannedAclForObjects 用于 S3 目标终端节点的连接字符串属性以指定标准 ACL。有关使用额外连接属性 cannedAclForObjects 的更多信息,请参阅使用 Amazon S3 作为目标时的终端节点设置 AWS DMS。有关 Amazon S3 标准 ACL 的更多信息,请参阅标准 ACL

用于迁移的 IAM 角色必须能够执行 s3:PutObjectAcl API 操作。

使用 Apache Parquet 存储 Amazon S3 对象

逗号分隔值(.csv)格式是 Amazon S3 目标对象的默认存储格式。对于更紧凑的存储和更快速的查询,您可以改用 Apache Parquet (.parquet) 作为存储格式。

Apache Parquet 是一种最初专为 Hadoop 设计的开源文件存储格式。有关 Apache Parquet 的更多信息,请参阅 https://parquet.apache.org/

要将 .parquet 设置为您的已迁移 S3 目标对象的存储格式,您可以使用以下机制:

Amazon S3 对象标记

您可以标记复制实例所创建的 Amazon S3 对象,方式是指定适当的 JSON 对象作为任务-表映射规则的一部分。有关 S3 对象标记的要求和选项(包括有效标签名称)的更多信息,请参阅《Amazon Simple Storage Service 用户指南》中的对象标记。有关使用 JSON 的表映射的更多信息,请参阅 使用 JSON 指定表选择和转换规则

您可以标记为指定表创建的 S3 对象,方式是使用 selection 规则类型的一个或多个 JSON 对象。然后,您可以使用 add-tag 操作在此 selection 对象后添加 post-processing 规则类型的一个或多个 JSON 对象。这些后处理规则标识要标记的 S3 对象并指定要添加到这些 S3 对象的标签的名称和值。

您可以在下表中找到要在 post-processing 规则类型的 JSON 对象中指定的参数。

参数 可能的值 描述
rule-type post-processing

一个将后处理操作应用于生成的目标对象的值。您可以指定一个或多个后处理规则以标记所选 S3 对象。

rule-id 一个数字值。 一个用于标识规则的唯一数字值。
rule-name 一个字母数字值。 一个用于标识规则的唯一名称。
rule-action add-tag 要应用于 S3 对象的后处理操作。您可以通过对 add-tag 操作使用单个 JSON 后处理对象来添加一个或多个标签。
object-locator

schema-name – 表架构的名称。

table-name – 表的名称。

规则应用于的每个架构和表的名称。您可以使用“%”百分比符号作为每个 object-locator 参数的值的全部或部分的通配符。因此,您可以匹配这些项目:

  • 单个架构中的单个表

  • 部分或全部架构中的单个表

  • 单个架构中的部分或全部表

  • 部分或全部架构中的部分或全部表

tag-set

key – 单个标签的任何有效名称。

value – 此标签的任何有效的 JSON 值。

要在匹配指定的 object-locator 的每个已创建 S3 对象上设置的一个或多个标签的名称和值。您可以在单个 tag-set 参数对象中最多指定 10 个键值对。有关 S3 对象标记的更多信息,请参阅《Amazon Simple Storage Service 用户指南》中的对象标记

您还可以使用 ${dyn-value}keyvalue 参数的值的全部或部分指定一个动态值。此处,${dyn-value} 可以是 ${schema-name}${table-name}。因此,您可以插入当前选定架构或表的名称作为参数值的完整内容或任何部分。

注意
重要

如果为 key 参数插入一个动态值,则可以使用 S3 对象的重复名称生成标签,具体取决于其使用方式。在这种情况下,仅将一个重复标签设置添加到对象。

在指定多个 post-processing 规则类型来标记一系列 S3 对象时,将仅使用来自一个后处理规则的一个 tag-set 对象来标记每个 S3 对象。用于标记给定 S3 对象的特定标记集是来自后处理规则的标记集,其关联对象定位器与该 S3 对象最匹配。

例如,假设两个后处理规则标识同一 S3 对象。另外,假设一个规则中的对象定位器使用通配符,而另一个规则中的对象定位器使用精确匹配来标识 S3 对象(不带通配符)。在这种情况下,与后处理规则关联的带精确匹配的标签集将用于标记 S3 对象。如果多个后处理规则同样匹配某个给定 S3 对象,则与第一个此类后处理规则关联的标签集将用于标记该对象。

例 将静态标签添加到为单个表和架构创建的 S3 对象

以下选择和后处理规则将三个标签(tag_1tag_2tag_3,分别带有相应的静态值 value_1value_2value_3)添加到创建的 S3 对象。此 S3 对象对应于带有名为 aat2 的架构的名为 STOCK 的源中的单个表。

{ "rules": [ { "rule-type": "selection", "rule-id": "5", "rule-name": "5", "object-locator": { "schema-name": "aat2", "table-name": "STOCK" }, "rule-action": "include" }, { "rule-type": "post-processing", "rule-id": "41", "rule-name": "41", "rule-action": "add-tag", "object-locator": { "schema-name": "aat2", "table-name": "STOCK" }, "tag-set": [ { "key": "tag_1", "value": "value_1" }, { "key": "tag_2", "value": "value_2" }, { "key": "tag_3", "value": "value_3" } ] } ] }
例 将静态和动态标签添加到为多个表和架构创建的 S3 对象

以下示例具有一个选择规则和两个后处理规则,其中来自源的输入包括所有表及其所有架构。

{ "rules": [ { "rule-type": "selection", "rule-id": "1", "rule-name": "1", "object-locator": { "schema-name": "%", "table-name": "%" }, "rule-action": "include" }, { "rule-type": "post-processing", "rule-id": "21", "rule-name": "21", "rule-action": "add-tag", "object-locator": { "schema-name": "%", "table-name": "%", }, "tag-set": [ { "key": "dw-schema-name", "value":"${schema-name}" }, { "key": "dw-schema-table", "value": "my_prefix_${table-name}" } ] }, { "rule-type": "post-processing", "rule-id": "41", "rule-name": "41", "rule-action": "add-tag", "object-locator": { "schema-name": "aat", "table-name": "ITEM", }, "tag-set": [ { "key": "tag_1", "value": "value_1" }, { "key": "tag_2", "value": "value_2" } ] } ] }

第一个后处理规则将带有相应的动态值(${schema-name}my_prefix_${table-name})的两个标签(dw-schema-namedw-schema-table)添加到目标中创建的几乎所有 S3 对象。例外情况是使用第二个后处理规则标识和标记的 S3 对象。因此,由通配符对象定位器标识的每个目标 S3 对象是使用标识其在源中对应的架构和表的标签创建的。

第二个后处理规则将 tag_1tag_2(分别带有相应的静态值 value_1value_2)添加到由精确匹配对象定位器标识的创建的 S3 对象。因此,该创建的 S3 对象对应于带有名为 aat 的架构的名为 ITEM 的源中的单个表。由于精确匹配,这些标签将替换第一个后处理规则中添加的此对象上的任何标签,这仅按通配符匹配 S3 对象。

例 将动态标签名称和值添加到 S3 对象

以下示例具有两个选择规则和一个后处理规则。在这里,源中的输入仅包括 retailwholesale 架构中的 ITEM 表。

{ "rules": [ { "rule-type": "selection", "rule-id": "1", "rule-name": "1", "object-locator": { "schema-name": "retail", "table-name": "ITEM" }, "rule-action": "include" }, { "rule-type": "selection", "rule-id": "1", "rule-name": "1", "object-locator": { "schema-name": "wholesale", "table-name": "ITEM" }, "rule-action": "include" }, { "rule-type": "post-processing", "rule-id": "21", "rule-name": "21", "rule-action": "add-tag", "object-locator": { "schema-name": "%", "table-name": "ITEM", }, "tag-set": [ { "key": "dw-schema-name", "value":"${schema-name}" }, { "key": "dw-schema-table", "value": "my_prefix_ITEM" }, { "key": "${schema-name}_ITEM_tag_1", "value": "value_1" }, { "key": "${schema-name}_ITEM_tag_2", "value": "value_2" } ] ] }

后处理规则的标签集将两个标签(dw-schema-namedw-schema-table)添加到为目标中的 ITEM 表创建的所有 S3 对象。第一个标签具有动态值 "${schema-name}",第二个标签具有静态值 "my_prefix_ITEM"。因此,每个目标 S3 对象是使用标识其在源中对应的架构和表的标签创建的。

此外,该标签集还添加带动态名称(${schema-name}_ITEM_tag_1"${schema-name}_ITEM_tag_2")的两个额外标签。这些标签具有相应的静态值 value_1value_2。因此,这些标签均针对当前架构 retailwholesale 进行命名。您无法在此对象中创建重复的动态标签名称,因为每个对象都为单个唯一的架构名称创建的。架构名称用于创建另一个唯一的标签名称。

创建用于加密 Amazon S3 目标对象的 AWS KMS 密钥

您可以创建和使用自定义 AWS KMS 密钥来加密您的 Amazon S3 目标对象。创建 KMS 密钥后,您可以在创建 S3 目标端点时,使用该密钥通过下列方法之一加密对象:

  • 当您使用 AWS CLI运行 create-endpoint 命令时对 S3 目标对象(采用默认的 .csv 文件存储格式)使用以下选项。

    --s3-settings '{"ServiceAccessRoleArn": "your-service-access-ARN", "CsvRowDelimiter": "\n", "CsvDelimiter": ",", "BucketFolder": "your-bucket-folder", "BucketName": "your-bucket-name", "EncryptionMode": "SSE_KMS", "ServerSideEncryptionKmsKeyId": "your-KMS-key-ARN"}'

    此处,your-KMS-key-ARN 是您的 KMS 密钥的 Amazon 资源名称 (ARN)。有关更多信息,请参阅 在 Amazon S3 目标上使用数据加密、parquet 文件和 CDC

  • 将额外连接属性 encryptionMode 设置为值 SSE_KMS,并将额外连接属性 serverSideEncryptionKmsKeyId 设置为您的 KMS 密钥的 ARN。有关更多信息,请参阅 使用 Amazon S3 作为目标时的终端节点设置 AWS DMS

要使用 KMS 密钥加密 Amazon S3 目标对象,您需要一个有权访问 Amazon S3 存储桶的 IAM 角色。随后,在附加到您创建的加密密钥的政策(密钥政策)中访问此 IAM 角色。您可以通过创建以下项在 IAM 控制台中执行此操作:

  • 一个具有访问 Amazon S3 存储桶的权限的策略。

  • 一个带有此策略的 IAM 角色。

  • 一个带引用此角色的密钥政策的 KMS 加密密钥。

以下过程介绍了如何执行此操作。

创建有权访问 Amazon S3 存储桶的 IAM policy
  1. 通过 https://console.aws.amazon.com/iam/ 打开 IAM 控制台。

  2. 在导航窗格中,选择 Policies (策略)Policies (策略) 页面随即打开。

  3. 选择创建策略。此时将打开创建策略页面。

  4. 选择 Service (服务),然后选择 S3。此时会显示操作权限列表。

  5. 选择全部展开以展开列表并至少选择以下权限:

    • ListBucket

    • PutObject

    • DeleteObject

    选择所需的任何其他权限,然后选择 Collapse all (全部折叠) 以折叠列表。

  6. 选择 Resources (资源) 以指定要访问的资源。至少选择所有资源以提供一般 Amazon S3 资源访问权限。

  7. 添加所需的任何其他条件或权限,然后选择 Review policy (查看策略)。在 Review policy (查看策略) 页面上查看您的结果。

  8. 如果这些设置是您所需的,请输入策略名称(例如,DMS-S3-endpoint-access)及任何其他描述,然后选择 Create policy (创建策略)Policies (策略) 页面随即打开,并显示一条指示您的策略已创建的消息。

  9. Policies (策略) 列表中搜索并选择策略名称。此时会显示 Summary (摘要) 页面,并显示与以下内容类似的策略的 JSON。

    { "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "s3:PutObject", "s3:ListBucket", "s3:DeleteObject" ], "Resource": "*" } ] }

现在,您已创建新策略来访问 Amazon S3 资源以使用指定名称(例如 DMS-S3-endpoint-access)进行加密。

创建具有此策略的 IAM 角色
  1. 在 IAM 控制台上的导航窗格中,选择角色Roles (角色) 详细信息页面随即打开。

  2. 选择创建角色Create role (创建角色) 页面随即打开。

  3. 选择 AWS 服务作为可信实体后,选择 DMS 作为使用 IAM 角色的服务。

  4. 选择下一步: 权限Attach permissions policies (附加权限策略) 视图将显示在 Create role (创建角色) 页面中。

  5. 查找并选择您在上一过程中创建的 IAM 角色的 IAM policy(DMS-S3-endpoint-access)。

  6. 选择下一步:标签Add tags (添加标签) 视图将显示在 Create role (创建角色) 页面中。您可以在此处添加所需的任何标签。

  7. 选择下一步: 审核Review (查看) 视图将显示在 Create role (创建角色) 页面中。在这里,您可以验证结果。

  8. 如果这些设置是您所需的,请输入角色名称(必填,例如 DMS-S3-endpoint-access-role)及任何其他描述,然后选择 Create role (创建角色)Roles (角色) 详细信息页面随即打开,并显示一条指示您的角色已创建的消息。

现在,您已创建新角色来访问 Amazon S3 资源以使用指定名称(例如,DMS-S3-endpoint-access-role)进行加密。

创建具有引用您的 IAM 角色的密钥政策的 KMS 加密密钥
注意

有关 AWS DMS 如何使用 AWS KMS 加密密钥的更多信息,请参阅设置加密密钥并指定 AWS KMS 权限

  1. 登录 AWS Management Console 并打开 AWS Key Management Service (AWS KMS) 控制台,网址为 https://console.aws.amazon.com/kms

  2. 要更改 AWS 区域,请使用页面右上角的区域选择器。

  3. 在导航窗格中,选择客户托管密钥

  4. 选择 Create key。此时会打开 Configure key (配置密钥) 页面。

  5. 对于 Key type (密钥类型),选择 Symmetric (对称)

    注意

    创建此密钥时,您只能创建对称密钥,因为所有 AWS 服务(例如 Amazon S3)都只能使用对称加密密钥。

  6. 选择 Advanced Options。对于 Key material origin (密钥材料来源),请确保选择了 KMS,然后选择 Next (下一步)。此时会打开 Add labels (添加标签) 页面。

  7. 对于 Create alias and description (创建别名和描述),输入密钥的别名(例如 DMS-S3-endpoint-encryption-key)和任何其他描述。

  8. 对于 Tags (标签),添加要用于帮助标识密钥并跟踪其使用情况的任何标签,然后选择 Next (下一步)。此时会打开 Define key administrative permissions (定义密钥管理权限) 页面,其中显示了可供选择的用户和角色的列表。

  9. 添加要管理密钥的用户和角色。确保这些用户和角色具有管理密钥所需的权限。

  10. 对于 Key deletion (密钥删除),选择密钥管理员是否能删除密钥,然后选择 Next (下一步)。此时会打开 Define Key Usage Permissions (定义密钥使用权限) 页面,其中显示了可供选择的用户和角色的附加列表。

  11. 对于此账户,选择要对 Amazon S3 目标执行加密操作的可用用户。此外,还应选择您之前在角色中创建的角色以启用访问权限来加密 Amazon S3 目标对象,例如 DMS-S3-endpoint-access-role

  12. 如果要添加未列出的其他账户以获得相同访问权限,请在 “其他 AWS 账户” 中选择 “添加其他 AWS 账户”,然后选择 “下一步”。此时会打开 Review and edit key policy (查看和编辑密钥策略) 页面,其中显示了密钥策略的 JSON,您可以通过键入到现有 JSON 来查看和编辑该策略。在此处,您可以看到密钥策略引用您在上一步中选择的角色和用户(例如,AdminUser1)的位置。您还可以查看不同委托人(用户和角色)所允许的不同密钥操作,如以下示例所示。

    { "Id": "key-consolepolicy-3", "Version": "2012-10-17", "Statement": [ { "Sid": "Enable IAM User Permissions", "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::111122223333:root" ] }, "Action": "kms:*", "Resource": "*" }, { "Sid": "Allow access for Key Administrators", "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::111122223333:role/Admin" ] }, "Action": [ "kms:Create*", "kms:Describe*", "kms:Enable*", "kms:List*", "kms:Put*", "kms:Update*", "kms:Revoke*", "kms:Disable*", "kms:Get*", "kms:Delete*", "kms:TagResource", "kms:UntagResource", "kms:ScheduleKeyDeletion", "kms:CancelKeyDeletion" ], "Resource": "*" }, { "Sid": "Allow use of the key", "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::111122223333:role/DMS-S3-endpoint-access-role", "arn:aws:iam::111122223333:role/Admin", "arn:aws:iam::111122223333:role/User1" ] }, "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:DescribeKey" ], "Resource": "*" }, { "Sid": "Allow attachment of persistent resources", "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::111122223333:role/DMS-S3-endpoint-access-role", "arn:aws:iam::111122223333:role/Admin", "arn:aws:iam::111122223333:role/User1" ] }, "Action": [ "kms:CreateGrant", "kms:ListGrants", "kms:RevokeGrant" ], "Resource": "*", "Condition": { "Bool": { "kms:GrantIsForAWSResource": true } } } ]
  13. 选择完成加密密钥页面随即打开,并显示一条指示您的 KMS 密钥已创建的消息。

现在,您已创建一个具有指定别名(例如,DMS-S3-endpoint-encryption-key)的新 KMS 密钥。使用此密钥可以 AWS DMS 加密 Amazon S3 目标对象。

使用基于日期的文件夹分区

AWS DMS 当您使用 Amazon S3 作为目标终端节点时,支持基于事务提交日期的 S3 文件夹分区。通过使用基于日期的文件夹分区,您可以将数据从单个源表写入 S3 存储桶中的时间层次结构文件夹结构中。通过在创建 S3 目标端点时对文件夹进行分区,您可以:

  • 更好地管理您的 S3 对象

  • 限制每个 S3 文件夹的大小

  • 优化数据湖查询或其他后续操作

创建 S3 目标端点时,您可以启用基于日期的文件夹分区。在迁移现有数据和复制持续更改(完全加载 + CDC)或仅复制数据更改(仅 CDC)时,您可以启用它。使用以下目标端点设置:

  • DatePartitionEnabled – 指定基于日期的分区。将该布尔选项设置为 true 时,可根据事务提交日期对 S3 存储桶文件夹进行分区。

    不能将此设置与 PreserveTransactionsCdcPath 一起使用。

    默认值为 false

  • DatePartitionSequence – 标识文件夹分区期间使用的日期格式顺序。将此 ENUM 选项设置为 YYYYMMDDYYYYMMDDHHYYYYMMMMYYYYDDDDMMYYYY。默认值为 YYYYMMDD。在 DatePartitionEnabled 设置为 true. 时使用此设置。

  • DatePartitionDelimiter – 指定要在文件夹分区期间使用的分隔日期分隔符。将此 ENUM 选项设置为 SLASHDASHUNDERSCORENONE。默认值为 SLASH。在 DatePartitionEnabled 设置为 true 时使用此设置。

以下示例说明如何启用基于日期的文件夹分区,并使用数据分区顺序和分隔符的默认值。它使用以下--s3-settings '{json-settings}'选项 AWS CLI。 create-endpoint命令。

--s3-settings '{"DatePartitionEnabled": true,"DatePartitionSequence": "YYYYMMDD","DatePartitionDelimiter": "SLASH"}'

使用 Amazon S3 作为目标时并行加载分区源 AWS DMS

您可以配置将已分区数据源并行完全加载到 Amazon S3 目标。该方法可缩短将已分区数据从支持的源数据库引擎迁移到 S3 目标的加载时间。为缩短已分区源数据的加载时间,您可以创建映射到源数据库中每个表的分区的 S3 目标子文件夹。这些分区绑定子文件夹允许 AWS DMS 运行并行进程来填充目标上的每个子文件夹。

要配置 S3 目标的并行完全加载,S3 支持表映射 table-settings 规则的三种 parallel-load 规则类型:

  • partitions-auto

  • partitions-list

  • ranges

有关这些并行加载规则类型的更多信息,请参阅表和集合设置规则和操作

对于 partitions-autopartitions-list 规则类型, AWS DMS 使用源端点中的各分区名称来标识目标子文件夹结构,如下所示。

bucket_name/bucket_folder/database_schema_name/table_name/partition_name/LOADseq_num.csv

此时,S3 目标上用于迁移和存储数据的子文件夹路径包括一个额外的 partition_name 子文件夹,并与同名的源分区相对应。之后,该 partition_name 子文件夹存储一个或多个 LOADseq_num.csv 文件,其中包含从指定源分区迁移的数据。此处,seq_num 是.csv 文件名的序列号后缀,例如名为 LOAD00000001.csv 的 .csv 文件中的序列号后缀 00000001

但是,MongoDB 和 DocumentDB 等部分数据库引擎没有分区的概念。对于这些数据库引擎, AWS DMS 将正在运行的源段索引作为前缀添加到目标.csv 文件名中,如下所示。

.../database_schema_name/table_name/SEGMENT1_LOAD00000001.csv .../database_schema_name/table_name/SEGMENT1_LOAD00000002.csv ... .../database_schema_name/table_name/SEGMENT2_LOAD00000009.csv .../database_schema_name/table_name/SEGMENT3_LOAD0000000A.csv

此处,文件 SEGMENT1_LOAD00000001.csvSEGMENT1_LOAD00000002.csv 以相同的运行源段索引前缀 SEGMENT1 命名。之所以这样命名,是因为这两个 .csv 文件的迁移源数据与同一个运行源段索引相关联。另一方面,存储在每个目标 SEGMENT2_LOAD00000009.csvSEGMENT3_LOAD0000000A.csv 文件中的迁移数据与不同的运行源段索引相关联。每个文件的文件名都以其运行段索引的名称作为前缀,即 SEGMENT2SEGMENT3

对于 ranges 并行加载类型,您可以使用 table-settings 规则的 columnsboundaries 设置来定义列名和列值。使用这些规则,您可以指定与分段名称对应的分区,如下所示。

"parallel-load": { "type": "ranges", "columns": [ "region", "sale" ], "boundaries": [ [ "NORTH", "1000" ], [ "WEST", "3000" ] ], "segment-names": [ "custom_segment1", "custom_segment2", "custom_segment3" ] }

此处,segment-names 设置定义了三个分区的名称,以便在 S3 目标上并行迁移数据。所迁移数据以并行方式加载并按顺序存储在分区子文件夹下的 .csv 文件中,如下所示。

.../database_schema_name/table_name/custom_segment1/LOAD[00000001...].csv .../database_schema_name/table_name/custom_segment2/LOAD[00000001...].csv .../database_schema_name/table_name/custom_segment3/LOAD[00000001...].csv

在这里,将一系列.csv 文件 AWS DMS 存储在三个分区子文件夹中的每个子文件夹中。各个分区子文件夹中的一系列 .csv 文件从 LOAD00000001.csv 开始递增命名,直至所有数据已完成迁移。

在某些情况下,您可能不会使用 segment-names 设置为 ranges 并行加载类型明确命名分区子文件夹。在这种情况下, AWS DMS 应用在其table_name子文件夹下创建每个系列的.csv 文件的默认值。此时, AWS DMS 在各系列 .csv 文件的文件名前面加上运行源段索引的名称,如下所示。

.../database_schema_name/table_name/SEGMENT1_LOAD[00000001...].csv .../database_schema_name/table_name/SEGMENT2_LOAD[00000001...].csv .../database_schema_name/table_name/SEGMENT3_LOAD[00000001...].csv ... .../database_schema_name/table_name/SEGMENTZ_LOAD[00000001...].csv

使用 Amazon S3 作为目标时的终端节点设置 AWS DMS

您可以使用端点设置来配置 Amazon S3 目标数据库,这与使用额外连接属性类似。您可以在使用 AWS DMS 控制台创建目标端点时指定设置,或者使用中的create-endpoint命令和 --s3-settings '{"EndpointSetting": "value", ...}' JSON 语法。AWS CLI

下表显示了将 Amazon S3 作为目标时您可以使用的端点设置。

选项 描述
CsvNullValue

一个可选参数,用于指定如何 AWS DMS 处理空值。在处理 null 值时,您可以使用此参数在写入目标时将用户定义的字符串作为 null 传递。例如,当目标列可以为空时,您可以使用此选项来区分空字符串值和空值。因此,如果您将此参数值设置为空字符串(“” 或 “),则会将空字符串 AWS DMS 视为空值,而不是NULL

默认值:NULL

有效值:任何有效的字符串

例如:--s3-settings '{"CsvNullValue": " "}'

AddColumnName

一个可选参数,当设置为 truey 时,可用于将列名称信息添加到 .csv 输出文件中。

此参数不能与 PreserveTransactionsCdcPath 一起使用。

默认值:false

有效值:truefalseyn

例如:--s3-settings '{"AddColumnName": true}'

AddTrailingPaddingCharacter

使用 S3 目标端点设置 AddTrailingPaddingCharacter 为字符串数据添加填充。默认值为 false

类型:布尔值

例如:--s3-settings '{"AddTrailingPaddingCharacter": true}'

BucketFolder

一个可选参数,用于在 S3 桶中设置文件夹的名称。如果提供此参数,则在路径 BucketFolder/schema_name/table_name/ 中创建目标对象作为 .csv 或 .parquet 文件。如果未指定此参数,则使用的路径为 schema_name/table_name/

例如:--s3-settings '{"BucketFolder": "testFolder"}'

BucketName

在其中将 S3 目标对象创建为 .csv 或 .parquet 文件的 S3 存储桶的名称。

例如:--s3-settings '{"BucketName": "buckettest"}'

CannedAclForObjects

该值允许 AWS DMS 为在 S3 存储桶中创建的对象指定预定义(固定)访问控制列表作为.csv 或.parquet 文件。有关 Amazon S3 标准 ACL 的更多信息,请参阅《Amazon S3 开发人员指南》中的标准 ACL

默认值:NONE

该属性的有效值为:NONE、PRIVATE、PUBLIC_READ、PUBLIC_READ_WRITE、AUTHENTICATED_READ、AWS_EXEC_READ、BUCKET_OWNER_READ、BUCKET_OWNER_FULL_CONTROL。

例如:--s3-settings '{"CannedAclForObjects": "PUBLIC_READ"}'

CdcInsertsOnly

一个在更改数据捕获 (CDC) 加载期间仅将 INSERT 操作写入逗号分隔值 (.csv) 或列式存储 (.parquet) 输出文件的可选参数。默认情况下(false 设置),.csv 或 .parquet 记录中的第一个字段包含字母 I (INSERT)、U (UPDATE) 或 D (DELETE)。该字母表示是在源数据库中插入、更新还是删除行,以将 CDC 加载到目标。如果将 cdcInsertsOnly 设置为 truey,则仅将来自源数据库的 INSERT 迁移到 .csv 或 .parquet 文件。

仅对于 .csv 格式,记录这些 INSERTS 的方式取决于 IncludeOpForFullLoad 的值。如果将 IncludeOpForFullLoad 设置为 true,则每条 CDC 记录的第一个字段都将设置为 I 以指示源上的 INSERT 操作。如果将 IncludeOpForFullLoad 设置为 false,则写入每条 CDC 记录(不带用于指示源上的 INSERT 操作的第一个字段)。有关这些参数的协作方式的更多信息,请参阅指示迁移的 S3 数据中的源数据库操作

默认值:false

有效值:truefalseyn

例如:--s3-settings '{"CdcInsertsOnly": true}'

CdcInsertsAndUpdates

启用更改数据捕获 (CDC) 加载以将 INSERT 和 UPDATE 操作写入 .csv 或 .parquet(列式存储)输出文件。默认设置为 false,但当 cdcInsertsAndUpdates 设置为 truey 时,源数据库中的 INSERT 和 UPDATE 将迁移到 .csv 或 .parquet 文件。

仅对于 .csv 文件格式,记录这些 INSERT 和 UPDATE 的方式取决于 includeOpForFullLoad 参数的值。如果 includeOpForFullLoad 设置为 true,则每条 CDC 记录的第一个字段都将设置为 IU 以指示源上的 INSERT 和 UPDATE 操作。但如果 includeOpForFullLoad 设置为 false,则 CDC 记录在不指示源上的 INSERT 和 UPDATE 操作的情况下写入。

有关这些参数的协作方式的更多信息,请参阅指示迁移的 S3 数据中的源数据库操作

注意

对于同一终端节点,CdcInsertsOnlycdcInsertsAndUpdates 不同时设置为 true。对于同一终端节点,将 cdcInsertsOnlycdcInsertsAndUpdates 设置为 true,但不能同时设置这两者。

默认值:false

有效值:truefalseyn

例如:--s3-settings '{"CdcInsertsAndUpdates": true}'

CdcPath

指定 CDC 文件的文件夹路径。对于 S3 来源,如果任务捕获更改数据,则该设置是必需的,否则,该设置是可选的。如果设置了 CdcPath,则 DMS 将通过该路径读取 CDC 文件,然后将数据更改复制到目标端点。对于 S3 目标,如果将 PreserveTransactions 设置为 true,DMS 会验证是否已将此参数设置为 S3 目标上的文件夹路径,使 DMS 可在其中保存 CDC 加载的事务顺序。DMS 在 S3 目标工作目录或 BucketFolderBucketName 指定的 S3 目标位置中创建此 CDC 文件夹路径。

此参数不能与 DatePartitionEnabledAddColumnName 一起使用。

类型:字符串

例如,如果您将 CdcPath 指定为 MyChangedData,且将 BucketName 指定为 MyTargetBucket,但没有指定 BucketFolder,DMS 会创建如下 CDC 文件夹路径:MyTargetBucket/MyChangedData

如果您指定相同的 CdcPath,并将 BucketName 指定为 MyTargetBucketBucketFolder 指定为 MyTargetData,DMS 创建如下 CDC 文件夹路径:MyTargetBucket/MyTargetData/MyChangedData

注意

3.4.2 及更高 AWS DMS 版本支持此设置。

按事务顺序捕获数据更改时,无论目标上的 S DataFormat 3 设置值如何,DMS 始终将行更改存储在.csv 文件中。DMS 不会使用 .parquet 文件按事务顺序保存数据更改。

CdcMaxBatchInterval

最大间隔长度条件(以秒为单位),之后将文件输出到 Amazon S3。

默认值:60 秒

指定 CdcMaxBatchInterval 并指定 CdcMinFileSize 时,文件写入由首先满足的参数条件触发。

CdcMinFileSize

将文件输出到 Amazon S3 所要达到的最小文件大小条件(以千字节为单位)。

默认值:32000 KB

指定 CdcMinFileSize 并指定 CdcMaxBatchInterval 时,文件写入由首先满足的参数条件触发。

PreserveTransactions

如果设置为 true,DMS 将在 CdcPath 指定的 Amazon S3 目标上保存更改数据捕获(CDC)的事务顺序。

此参数不能与 DatePartitionEnabledAddColumnName 一起使用。

类型:布尔值

按事务顺序捕获数据更改时,无论目标上的 S DataFormat 3 设置值如何,DMS 始终将行更改存储在.csv 文件中。DMS 不会使用 .parquet 文件按事务顺序保存数据更改。

注意

3.4.2 及更高 AWS DMS 版本支持此设置。

IncludeOpForFullLoad

一个在完全加载期间仅将 INSERT 操作写入逗号分隔值 (.csv) 输出文件的可选参数。

对于完全加载,只能插入记录。默认情况下,(false 设置),这些输出文件中没有记录完全加载的信息,以指示行已插入源数据库。如果将 IncludeOpForFullLoad 设置为 truey,则在 .csv 文件的第一个字段中将 INSERT 记录为 I 注释。

注意

此参数与 CdcInsertsOnlyCdcInsertsAndUpdates 结合使用,以仅输出到 .csv 文件。有关这些参数的协作方式的更多信息,请参阅指示迁移的 S3 数据中的源数据库操作

默认值:false

有效值:truefalseyn

例如:--s3-settings '{"IncludeOpForFullLoad": true}'

CompressionType

一个可选参数,当设置为 GZIP 时,用于使用 GZIP 压缩目标 .csv 或 .parquet 文件。当此参数设置为默认值时,它会使文件保持未压缩状态。

默认值:NONE

有效值:GZIPNONE

示例:--s3-settings '{"CompressionType": "GZIP"}'

CsvDelimiter

.csv 源文件中用于分隔列的分隔符。默认值为逗号(,)。

例如:--s3-settings '{"CsvDelimiter": ","}'

CsvRowDelimiter

.csv 源文件中用于分隔行的分隔符。默认值为换行符 (\n)。

例如:--s3-settings '{"CsvRowDelimiter": "\n"}'

MaxFileSize

一个值,指定在完整加载期间,迁移到 S3 目标时所要创建的任意 .csv 文件的最大大小(以 KB 为单位)。

默认值:1048576 KB (1 GB)

有效值:1–1048576

例如:--s3-settings '{"MaxFileSize": 512}'

Rfc4180

一个可选参数,用于设置行为以符合 RFC,仅适用于使用 .csv 文件格式迁移到 Amazon S3 的数据。将此值设置为truey使用 Amazon S3 作为目标时,如果数据中包含引号、逗号或换行符,则用一对额外的双引号 (“) AWS DMS 将整列括起来。数据中的每个引号将被重复两次。此格式符合 RFC 4180。

默认值:true

有效值:truefalseyn

例如:--s3-settings '{"Rfc4180": false}'

EncryptionMode

要用于加密复制到 S3 的 .csv 或 .parquet 对象文件的服务器端加密模式。有效值为 SSE_S3(S3 服务器端加密)或 SSE_KMS(KMS 密钥加密)。如果您选择 SSE_KMS,请将 ServerSideEncryptionKmsKeyId 参数设置为要用于加密的 KMS 密钥的 Amazon 资源名称 (ARN)。

注意

您也可以使用 CLI modify-endpoint 命令将现有端点的 EncryptionMode 属性值从 SSE_KMS 更改为 SSE_S3。但您不能将 EncryptionMode 值从 SSE_S3 更改为 SSE_KMS

默认值:SSE_S3

有效值:SSE_S3SSE_KMS

示例:--s3-settings '{"EncryptionMode": SSE_S3}'

ServerSideEncryptionKmsKeyId

如果您将 EncryptionMode 设置为 SSE_KMS,请将此参数设置为 KMS 密钥的 Amazon 资源名称(ARN)。您可以通过在为您的账户创建的密钥列表中选择密钥别名来找到此 ARN。 AWS KMS 在创建密钥时,您必须将特定策略和角色与此 KMS 密钥关联。有关更多信息,请参阅 创建用于加密 Amazon S3 目标对象的 AWS KMS 密钥

例如:--s3-settings '{"ServerSideEncryptionKmsKeyId":"arn:aws:kms:us-east-1:111122223333:key/11a1a1a1-aaaa-9999-abab-2bbbbbb222a2"}'

DataFormat

用于创建 S3 对象的 AWS DMS 文件的输出格式。对于 Amazon S3 目标, AWS DMS 支持.csv 或.parquet 文件。.parquet 文件具有一种二进制列式存储格式,并具有有效的压缩选项和更快的查询性能。有关 .parquet 文件的更多信息,请参阅 https://parquet.apache.org/

默认值:csv

有效值:csvparquet

示例:--s3-settings '{"DataFormat": "parquet"}'

EncodingType

Parquet 编码类型。编码类型选项包括:

  • rle-dictionary - 此词典编码使用位压缩和运行长度编码的组合以更高效地存储重复值。

  • plain - 无编码。

  • plain-dictionary - 此词典编码构建给定列中遇到的值的词典。该词典存储在每个列数据块的词典页面中。

默认值:rle-dictionary

有效值:rle-dictionaryplainplain-dictionary

例如:--s3-settings '{"EncodingType": "plain-dictionary"}'

DictPageSizeLimit

.parquet 文件中的词典页面允许的最大大小(以字节为单位)。如果词典页面超出此值,则该页面使用纯编码。

默认值:1024000(1 MB)

有效值:任何有效的整数值

例如:--s3-settings '{"DictPageSizeLimit": 2,048,000}'

RowGroupLength

.parquet 文件的一个行组中的行数。

默认值:10024 (10 KB)

有效值:任何有效整数

例如:--s3-settings '{"RowGroupLength": 20,048}'

DataPageSize

.parquet 文件中的数据页面允许的最大大小(以字节为单位)。

默认值:1024000(1 MB)

有效值:任何有效整数

例如:--s3-settings '{"DataPageSize": 2,048,000}'

ParquetVersion

.parquet 文件格式的版本。

默认值:PARQUET_1_0

有效值:PARQUET_1_0PARQUET_2_0

示例:--s3-settings '{"ParquetVersion": "PARQUET_2_0"}'

EnableStatistics

设置为 truey 以启用有关 .parquet 文件页面和行组的统计数据。

默认值:true

有效值:truefalseyn

例如:--s3-settings '{"EnableStatistics": false}'

TimestampColumnName

一个可选参数,用于在 S3 目标终端节点数据中包含时间戳列。

AWS DMS 当您设置TimestampColumnName为非空值时,在迁移数据的.csv 或.parquet 对象文件中包含一个附加STRING列。

对于完全加载,此时间戳列的每个行均包含一个时间戳,用于指示 DMS 将数据从源传输到目标的时间。

对于 CDC 加载,时间戳列的每个行均包含该行在源数据库中的提交的时间戳。

此时间戳列值的字符串格式为 yyyy-MM-dd HH:mm:ss.SSSSSS。默认情况下,此值是以微秒为单位的时间精度。对于 CDC 负载,精度的舍入取决于 DMS 支持的源数据库的提交时间戳。

在将 AddColumnName 参数设置为 true 时,DMS 还包含设置为 TimestampColumnName 的非空值的时间戳列的名称。

例如:--s3-settings '{"TimestampColumnName": "TIMESTAMP"}'

UseTaskStartTimeForFullLoadTimestamp

设置为 true 时,此参数使用任务开始时间作为时间戳列值,而不是将数据写入目标的时间。对于完全加载,当 UseTaskStartTimeForFullLoadTimestamp 设置为 true 时,时间戳列的每一行都包含任务的开始时间。对于 CDC 加载,时间戳列的每个行均包含事务提交时间。

UseTaskStartTimeForFullLoadTimestamp 被设置为 false 时,时间戳列中的满载时间戳会随着数据到达目标的时间而递增。

默认值:false

有效值:truefalse

例如:--s3-settings '{"UseTaskStartTimeForFullLoadTimestamp": true}'

UseTaskStartTimeForFullLoadTimestamp: true 有助于使完全加载的 S3 目标 TimestampColumnName 可与 CDC 加载的 TimestampColumnName 一起排序。

ParquetTimestampInMillisecond

一个可选参数,指定写入 .parquet 格式 S3 对象文件的任意 TIMESTAMP 列值的精度。

当此属性设置为true或时y,将所有TIMESTAMP列以毫秒精度 AWS DMS 写入.parquet 格式的文件中。否则,DMS 以微秒为精度写入它们。

目前, Amazon Athena 和 AWS Glue 只能处理值的毫秒精度。TIMESTAMP对于 .parquet 格式的 S3 端点对象文件,仅在您计划使用 Athena 或 AWS Glue查询或处理数据时,才设置此属性。

注意
  • AWS DMS 以微秒精度以.csv 格式写入到 S3 文件中的任何TIMESTAMP列值。

  • 此属性的设置对通过设置 TimestampColumnName 属性插入的时间戳列的字符串格式没有任何影响。

默认值:false

有效值:truefalseyn

例如:--s3-settings '{"ParquetTimestampInMillisecond": true}'

GlueCatalogGeneration

要生成 AWS Glue Data Catalog,请将此端点设置设置为true

默认值:false

有效值:truefalse

例如:--s3-settings '{"GlueCatalogGeneration": true}'

注意:请勿将 GlueCatalogGenerationPreserveTransactionsCdcPath 一起使用。

AWS Glue Data Catalog 与 Amazon S3 目标一起使用 AWS DMS

AWS Glue 是一项提供简单数据分类方法的服务,由名为 AWS Glue Data Catalog的元数据存储库组成。您可以 AWS Glue Data Catalog 与您的 Amazon S3 目标终端节点集成,并通过其他 AWS 服务(例如亚马逊 Athena)查询亚马逊 S3 数据。Amazon Redshift 可以使用, AWS Glue 但 AWS DMS 不支持将其作为预建选项。

要生成数据目录,请将GlueCatalogGeneration端点设置设置为true,如以下 AWS CLI 示例所示。

aws dms create-endpoint --endpoint-identifier s3-target-endpoint --engine-name s3 --endpoint-type target--s3-settings '{"ServiceAccessRoleArn": "your-service-access-ARN", "BucketFolder": "your-bucket-folder", "BucketName": "your-bucket-name", "DataFormat": "parquet", "GlueCatalogGeneration": true}'

对于包含 csv 类型数据的完全加载复制任务,将 IncludeOpForFullLoad 设置为 true

注意:请勿将 GlueCatalogGenerationPreserveTransactionsCdcPath 一起使用。C AWS Glue rawler 无法协调存储在指定文件下的不同架构。CdcPath

要让 Amazon Athena 为您的 Amazon S3 数据编制索引,并且您能够通过 Amazon Athena 使用标准 SQL 查询来查询数据,附加到端点的 IAM 角色必须具有以下策略:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetBucketLocation", "s3:GetObject", "s3:ListBucket", "s3:ListBucketMultipartUploads", "s3:ListMultipartUploadParts", "s3:AbortMultipartUpload" ], "Resource": [ "arn:aws:s3:::bucket123", "arn:aws:s3:::bucket123/*" ] }, { "Effect": "Allow", "Action": [ "glue:CreateDatabase", "glue:GetDatabase", "glue:CreateTable", "glue:DeleteTable", "glue:UpdateTable", "glue:GetTable", "glue:BatchCreatePartition", "glue:CreatePartition", "glue:UpdatePartition", "glue:GetPartition", "glue:GetPartitions", "glue:BatchGetPartition" ], "Resource": [ "arn:aws:glue:*:111122223333:catalog", "arn:aws:glue:*:111122223333:database/*", "arn:aws:glue:*:111122223333:table/*" ] }, { "Effect": "Allow", "Action": [ "athena:StartQueryExecution", "athena:GetQueryExecution", "athena:CreateWorkGroup" ], "Resource": "arn:aws:athena:*:111122223333:workgroup/glue_catalog_generation_for_task_*" } ] }
参考信息
  • 有关更多信息 AWS Glue,请参阅《AWS Glue 开发者指南》中的概念

  • 有关更多信息, AWS Glue Data Catalog 请参阅《AWS Glue 开发人员指南》中的组件

在 Amazon S3 目标上使用数据加密、parquet 文件和 CDC

您可以使用 S3 目标终端节点设置来配置以下内容:

  • 用于加密 S3 目标对象的自定义 KMS 密钥。

  • 作为 S3 目标对象的存储格式的 Parquet 文件。

  • 将数据捕获(CDC)更改为包括 S3 目标上的事务顺序。

  • AWS Glue Data Catalog 与您的亚马逊 S3 目标终端节点集成,并通过其他服务(例如亚马逊 Athena)查询亚马逊 S3 数据。

AWS KMS 数据加密的密钥设置

以下示例说明如何配置自定义 KMS 密钥以加密 S3 目标对象。要开始,您可以运行以下 create-endpoint CLI 命令。

aws dms create-endpoint --endpoint-identifier s3-target-endpoint --engine-name s3 --endpoint-type target --s3-settings '{"ServiceAccessRoleArn": "your-service-access-ARN", "CsvRowDelimiter": "\n", "CsvDelimiter": ",", "BucketFolder": "your-bucket-folder", "BucketName": "your-bucket-name", "EncryptionMode": "SSE_KMS", "ServerSideEncryptionKmsKeyId": "arn:aws:kms:us-east-1:111122223333:key/72abb6fb-1e49-4ac1-9aed-c803dfcc0480"}'

此处,--s3-settings 选项所指定的 JSON 对象定义了两个参数。一个是带值 SSE_KMSEncryptionMode 参数。另一个是带值 arn:aws:kms:us-east-1:111122223333:key/72abb6fb-1e49-4ac1-9aed-c803dfcc0480ServerSideEncryptionKmsKeyId 参数。此值是自定义 KMS 密钥的 Amazon 资源名称 (ARN)。对于 S3 目标,您还可以指定其他设置。这些设置标识服务器访问角色,为默认 CSV 对象存储格式提供分隔符,并提供存储桶位置和名称来存储 S3 目标对象。

默认情况下,使用 S3 服务器端加密进行 S3 数据加密。对于上一示例中的 S3 目标,这也等同于指定其终端节点设置,如以下示例所示。

aws dms create-endpoint --endpoint-identifier s3-target-endpoint --engine-name s3 --endpoint-type target --s3-settings '{"ServiceAccessRoleArn": "your-service-access-ARN", "CsvRowDelimiter": "\n", "CsvDelimiter": ",", "BucketFolder": "your-bucket-folder", "BucketName": "your-bucket-name", "EncryptionMode": "SSE_S3"}'

有关使用 S3 服务器端加密的更多信息,请参阅使用服务器端加密保护数据

注意

您也可以使用 CLI modify-endpoint 命令将现有端点的 EncryptionMode 参数值从 SSE_KMS 更改为 SSE_S3。但您不能将 EncryptionMode 值从 SSE_S3 更改为 SSE_KMS

使用 .parquet 文件存储 S3 目标对象的设置

用于创建 S3 目标对象的默认格式为 .csv 文件。以下示例显示用于指定 .parquet 文件作为创建 S3 目标对象的格式的某些终端节点设置。您可以指定带所有默认值的 .parquet 文件格式,如以下示例所示。

aws dms create-endpoint --endpoint-identifier s3-target-endpoint --engine-name s3 --endpoint-type target --s3-settings '{"ServiceAccessRoleArn": "your-service-access-ARN", "DataFormat": "parquet"}'

在这里,DataFormat 参数设置为 parquet 以启用带所有 S3 默认值的格式。这些默认值包括一个词典编码 ("EncodingType: "rle-dictionary"),该编码使用位压缩和运行长度编码的组合以更高效地存储重复值。

您可以为选项添加默认值之外的其他设置,如以下示例所示。

aws dms create-endpoint --endpoint-identifier s3-target-endpoint --engine-name s3 --endpoint-type target --s3-settings '{"ServiceAccessRoleArn": "your-service-access-ARN", "BucketFolder": "your-bucket-folder", "BucketName": "your-bucket-name", "CompressionType": "GZIP", "DataFormat": "parquet", "EncodingType: "plain-dictionary", "DictPageSizeLimit": 3,072,000, "EnableStatistics": false }'

在这里,除了几个标准 S3 存储桶选项的参数和 DataFormat 参数外,将设置以下额外的 .parquet 文件参数:

  • EncodingType – 设置为一个词典编码(plain-dictionary),该编码将每个列中遇到的值存储在词典页面的每列数据块中。

  • DictPageSizeLimit – 最大词典页面大小设置为 3 MB。

  • EnableStatistics – 禁用用来启用有关 Parquet 文件页面和行组的统计数据集合的默认值。

捕获数据更改(CDC)时包括 S3 目标上的事务顺序

默认情况下,在 AWS DMS 运行 CDC 任务时,它会将源数据库(或数据库)中记录的所有行更改存储在每个表的一个或多个文件中。包含同一表更改的每组文件都位于与该表关联的单个目标目录中。 AWS DMS 创建的目标目录与迁移到 Amazon S3 目标终端节点的数据库表一样多。文件存储在 S3 目标上的这些目录中,而不考虑事务顺序。有关文件命名惯例、数据内容和格式的更多信息,请参阅使用亚马逊 S3 作为目标 AWS Database Migration Service

要以同时捕获事务顺序的方式捕获源数据库的更改,您可以指定 S3 端点设置,这些设置 AWS DMS 将所有数据库表的行更改存储在一个或多个根据事务大小创建的.csv 文件中。这些 .csv 事务文件包含按事务顺序依次列出的、每个事务中涉及的所有表的所有行更改。这些事务文件一起保存在您同样在 S3 目标上指定的单个事务目录中。在每个事务文件中,每处行更改的事务操作以及数据库和源表的标识都作为行数据的一部分存储,如下所示。

operation,table_name,database_schema_name,field_value,...

其中,operation 是对已更改行的事务操作,table_name 是在其中更改该行的数据库表的名称,database_schema_name 是该表所在数据库架构的名称,而 field_value 是为该行指定数据的一个或多个字段值中的第一个。

事务文件之后的示例显示了涉及两个表的一个或多个事务中更改的行。

I,Names_03cdcad11a,rdsTempsdb,13,Daniel U,Names_03cdcad11a,rdsTempsdb,23,Kathy D,Names_03cdcad11a,rdsTempsdb,13,Cathy I,Names_6d152ce62d,rdsTempsdb,15,Jane I,Names_6d152ce62d,rdsTempsdb,24,Chris I,Names_03cdcad11a,rdsTempsdb,16,Mike

其中,每行的事务操作由第一列中的 I(插入)、U(更新)或 D(删除)表示。表名是第二列的值(例如,Names_03cdcad11a)。数据库架构的名称是第三列的值(例如,rdsTempsdb)。其余列将使用您自己的行数据填充(例如,13,Daniel)。

此外,根据以下命 AWS DMS 名惯例,使用时间戳命名其在 Amazon S3 目标上创建的事务文件。

CDC_TXN-timestamp.csv

其中,timestamp 是创建事务文件的时间,如以下示例所示。

CDC_TXN-20201117153046033.csv

文件名中的该时间戳可确保按照您在事务目录中列出相关事务的事务顺序来创建和列出事务文件。

注意

按事务顺序捕获数据更改时,无论目标上的 DataFormat S3 设置值如何, AWS DMS 始终将行更改存储在.csv 文件中。 AWS DMS 不会使用.parquet 文件按交易顺序保存数据更改。

要控制在执行数据复制任务期间向 Amazon S3 目标写入的频率,您可以配置 CdcMaxBatchIntervalCdcMinFileSize 设置。这可以提高分析数据的性能,而无需任何额外的开销操作。有关更多信息,请参阅使用 Amazon S3 作为目标时的终端节点设置 AWS DMS

告知 AWS DMS 要按事务顺序存储所有行更改
  1. 将目标上的 PreserveTransactions S3 设置设为 true

  2. 将目标上CdcPath的 S3 设置设置为 AWS DMS 要存储.csv 事务文件的相对文件夹路径。

    AWS DMS 在默认 S3 目标存储桶和工作目录下,或者在目标上使用和 BucketFolder S3 设置指定的存储桶BucketName和存储桶文件夹下创建此路径。

指示迁移的 S3 数据中的源数据库操作

将记录 AWS DMS 迁移到 S3 目标时,它可以在每条迁移的记录中创建一个额外的字段。此额外字段指示应用于源数据库中的记录的操作。如何 AWS DMS 创建和设置第一个字段取决于迁移任务类型以及includeOpForFullLoadcdcInsertsOnly、和的设置cdcInsertsAndUpdates

对于完全加载,当 includeOpForFullLoadtrue 时, AWS DMS 始终在每条 .csv 记录中额外创建第一个字段。该字段包含字母 I (INSERT),指示该行已插入源数据库中。对于 CDC 加载时cdcInsertsOnlyfalse(默认), AWS DMS 也始终在每条.csv 或.parquet 记录中创建一个额外的第一个字段。此字段包含字母 I (INSERT)、U (UPDATE) 或 D (DELETE),指示是否在源数据库中插入、更新或删除行。

在下表中,您可以了解 includeOpForFullLoadcdcInsertsOnly 属性的设置如何协作以影响所迁移记录的设置。

使用这些参数设置 DMS 将目标记录设置为 .csv 和 .parquet 输出的后续记录
includeOpForFullLoad cdcInsertsOnly 对于完全加载 对于 CDC 加载
true true 添加的第一个字段值设置为 I 添加的第一个字段值设置为 I
false false 无添加的字段 添加的第一个字段值设置为 IUD
false true 无添加的字段 无添加的字段
true false 添加的第一个字段值设置为 I 添加的第一个字段值设置为 IUD

在将 includeOpForFullLoadcdcInsertsOnly 设置为同一值时,将根据控制当前迁移类型的记录设置的属性来设置目标记录。该属性为 includeOpForFullLoad(对于完全加载)和 cdcInsertsOnly(对于 CDC 加载)。

includeOpForFullLoad和设置cdcInsertsOnly为不同的值时, AWS DMS 会使 CDC 和满载的目标记录设置保持一致。它通过使 CDC 加载的记录设置符合 includeOpForFullLoad 指定的任何早期完全加载的记录设置来实现此目的。

换句话说,假设将完全加载设置为添加第一个字段来指示插入的记录。在此情况下,将以下 CDC 加载设置为添加第一个字段,该字段指示在源中适当插入、更新或删除的记录。相反,假设将完全加载设置为 添加第一个字段来指示插入的记录。在此情况下,CDC 加载也将设置为不向每条记录添加第一个字段,而不管其在源中的相应记录操作如何。

同样,DMS 如何创建和设置附加的第一个字段取决于 includeOpForFullLoadcdcInsertsAndUpdates 的设置。在下表中,您可以了解 includeOpForFullLoadcdcInsertsAndUpdates 属性的设置如何协作以影响采用此格式的迁移记录的设置。

使用这些参数设置 DMS 将目标记录设置为 .csv 输出的后续记录
includeOpForFullLoad cdcInsertsAnd更新 对于完全加载 对于 CDC 加载
true true 添加的第一个字段值设置为 I 添加的第一个字段值设置为 IU
false false 无添加的字段 添加的第一个字段值设置为 IUD
false true 无添加的字段 添加的第一个字段值设置为 IU
true false 添加的第一个字段值设置为 I 添加的第一个字段值设置为 IUD

S3 Parquet 的目标数据类型

下表显示了使用时支持的 Parquet 目标数据类型 AWS DMS 以及 AWS DMS 数据类型的默认映射。

有关 AWS DMS 数据类型的更多信息,请参见AWS Database Migration Service 的数据类型

AWS DMS 数据类型

S3 parquet 数据类型

BYTES BINARY
DATE DATE32
TIME TIME32
DATETIME TIMESTAMP
INT1 INT8
INT2 INT16
INT4 INT32
INT8 INT64
NUMERIC DECIMAL
REAL4 FLOAT
REAL8 DOUBLE
STRING STRING
UINT1 UINT8
UINT2 UINT16
UINT4 UINT32
UINT8 UINT64
WSTRING STRING
BLOB BINARY
NCLOB STRING
CLOB STRING
BOOLEAN BOOL