AWS Database Migration Service
用户指南 (版本 API Version 2016-01-01)
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

将 Amazon S3 用作 AWS Database Migration Service 的目标

您可以使用 AWS DMS 从任意支持的数据库源将数据迁移到 Amazon S3。在使用 Amazon S3 作为 AWS DMS 任务中的目标时,默认情况下,完全加载和更改数据捕获 (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 存储桶。

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

<schema_name>/<table_name>/LOAD00000001.csv <schema_name>/<table_name>/LOAD00000002.csv ... <schema_name>/<table_name>/LOAD00000009.csv <schema_name>/<table_name>/LOAD0000000A.csv <schema_name>/<table_name>/LOAD0000000B.csv ... <schema_name>/<table_name>/LOAD0000000F.csv <schema_name>/<table_name>/LOAD00000010.csv ...

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

在使用 AWS DMS 复制数据更改时,.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 表行。

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

使用 Amazon S3 作为目标之前,请确认:

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

  • 您在迁移中使用的 AWS 账户拥有一个 IAM 角色,此角色具有对作为目标的 S3 存储桶的写入和删除访问权限。

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

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

{ "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*" ] } ] }

将 Amazon S3 作为目标的限制

以下限制适用于作为目标的 Amazon S3 中的文件:

  • 只支持以下数据定义语言 (DDL) 命令:TRUNCATE TABLE,DROP TABLE 和 CREATE TABLE。

  • 不支持完整 LOB 模式。

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

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

安全性

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

对于 Amazon S3,AWS DMS 支持一组预定义的授权(称为标准访问控制列表 (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 进行命名。您无法在此对象中创建重复的动态标签名称,因为每个对象都为单个唯一的架构名称创建的。架构名称用于创建另一个唯一的标签名称。

创建 AWS KMS 密钥以加密 Amazon S3 目标对象

您可以创建并使用自定义 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 作为 AWS DMS 的目标时的终端节点设置

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

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

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

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

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

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

创建有权访问 Amazon S3 存储桶的 IAM 策略

  1. 通过以下网址打开 IAM 控制台:https://console.amazonaws.cn/iam/

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

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

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

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

    • ListBucket

    • PutObject

    • DeleteObject

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

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

  7. 添加所需的任何其他条件或权限,然后选择 Review policy (查看策略)。在 Revew 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": "*" } ] }

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

创建带有此策略的 IAM 角色

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

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

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

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

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

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

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

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

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

创建带引用您的 IAM 角色的密钥策略的 KMS 加密密钥

  1. 在 IAM 控制台上,在导航窗格中选择 Encryption keys (加密密钥)

    如果这是您首次访问此选项,则将显示 AWS Key Management Service 的简介,并且您可以选择 Get Started Now (立即开始使用) 以开始。否则,Encryption keys (加密密钥) 页面将打开。

  2. 选择 Create keyCreate Alias and Description (创建别名和描述) 页面随即打开。

  3. 输入密钥的别名(例如,DMS-S3-endpoint-encryption-key)及任何其他描述。

  4. 选择 Advanced Options。在 Advanced Options (高级选项) 部分中,确保为 Key Material Origin (密钥材料来源) 选中 KMS,然后选择 Next Step (下一步)Add tags (添加标签) 页面随即打开。

  5. 添加要用于帮助标识密钥并跟踪其使用情况的任何标签,然后选择 Next Step (下一步)Define Key Administrative Permissions (定义密钥管理权限) 页面随即打开,并显示可供选择的用户和角色的列表。

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

  7. 选择密钥管理员是否能删除密钥,然后选择 Next Step (下一步)Define Key Usage Permissions (定义密钥使用权限) 页面随即打开,并显示可供选择的用户和角色的附加列表。

  8. 选择您之前在 Roles (角色) 中创建的角色以启用访问权来加密 S3 目标对象,例如 DMS-S3-endpoint-access-role。然后选择 Next Step

    Preview Key Policy (预览密钥策略) 页面随即打开,并显示可查看的密钥策略的 JSON。在此处,您可以看到密钥策略引用您在上一步中选择的角色的位置。您还可以查看不同的委托人(用户和角色)所允许的不同的密钥操作,如以下示例所示。

    { "Id": "key-consolepolicy-3", "Version": "2012-10-17", "Statement": [ { "Sid": "Enable IAM User Permissions", "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::944454115380:root" ] }, "Action": "kms:*", "Resource": "*" }, { "Sid": "Allow access for Key Administrators", "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::944454115380: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::944454115380:role/DMS-S3-endpoint-access-role" ] }, "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::944454115380:role/DMS-S3-endpoint-access-role" ] }, "Action": [ "kms:CreateGrant", "kms:ListGrants", "kms:RevokeGrant" ], "Resource": "*", "Condition": { "Bool": { "kms:GrantIsForAWSResource": true } } } ]
  9. 选择 FinishEncryption keys (加密密钥) 页面随即打开,并显示一条指示您的主加密密钥已创建的消息。

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

注意

您还可以结合使用 AWS Key Management Service 与 IAM 角色和策略来创建和管理 KMS 密钥。有关更多信息,请参阅 Key Management Service (KMS):开发人员指南

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

您可以使用终端节点设置来配置 Amazon S3 目标,这与使用额外连接属性类似。您可以在 AWS CLI 中使用 create-endpoint 命令创建目标终端节点时通过 --s3-settings 'json-settings' 选项指定这些设置。此处,json-settings 是包含用于指定设置的参数的 JSON 对象。例如,您还可以指定一个包含相同 json-settings 对象的 .json 文件,如下所示:--s3-settings file:///your-file-path/my_s3_settings.json。在这里,my_s3_settings.json 是包含相同 json-settings object 的 .json 文件的名称。

请注意,终端节点设置的参数名称与同等额外连接属性的名称相同,但终端节点设置的参数名称的开头为大写形式。另请注意,并非使用额外连接属性的所有 S3 目标终端节点设置都可使用 create-endpoint 命令的 --s3-settings 选项提供。有关对 create-endpoint 的 AWS CLI 调用中的可用设置的更多信息,请参阅 AWS DMS 的 AWS CLI Command Reference 中的 create-endpoint。有关这些设置的更多信息,请参阅将 Amazon S3 作为 AWS DMS 目标时的额外连接属性中的等效额外连接属性。

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

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

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

用于数据加密的 KMS 密钥设置

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

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:944454115380:key/72abb6fb-1e49-4ac1-9aed-c803dfcc0480"}'

此处,--s3-settings 选项所指定的 JSON 对象定义了两个参数。一个是带值 SSE_KMSEncryptionMode 参数。另一个是带值 arn:aws:kms:us-east-1:944454115380: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 服务器端加密的更多信息,请参阅使用服务器端加密保护数据

使用 .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 文件页面和行组的统计数据集合的默认值。

将 Amazon S3 作为 AWS DMS 目标时的额外连接属性

您可以指定以下选项作为额外的连接属性。如果您具有多个连接属性设置,请用分号将它们彼此分开,并且不需要额外的空格。

选项 描述
addColumnName

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

默认值:false

有效值:truefalseyn

示例:

addColumnName=true;

bucketFolder

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

示例:

bucketFolder=testFolder;

bucketName

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

示例:

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。

示例:

cannedAclForObjects=PUBLIC_READ;

cdcInsertsOnly

一个仅将 INSERT 操作写入逗号分隔值 (.csv) 或列式存储 (.parquet) 输出文件的可选参数。默认情况下,.csv 或 .parquet 记录中的第一个字段包含字母 I(插入)、U(更新)或 D(删除),以指示是否已在源数据库中插入、更新或删除行。如果 cdcInsertsOnly 设置为 truey,则仅在 .csv 或 .parquet 文件中记录 INSERT,而不添加任何 I 注释。

默认值:false

有效值:truefalseyn

示例:

cdcInsertsOnly=true;

compressionType

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

默认值:NONE

有效值:GZIPNONE

示例:

compressionType=GZIP;

csvDelimiter

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

示例:

csvDelimiter=,;

csvRowDelimiter

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

示例:

csvRowDelimiter=\n;

maxFileSize

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

默认值:1048576 KB (1 GB)

有效值:1–1048576

示例:

maxFileSize=512

rfc4180

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

默认值:true

有效值:truefalseyn

示例:

rfc4180=false;

encryptionMode

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

默认值:SSE_S3

有效值:SSE_S3SSE_KMS

示例:

encryptionMode=SSE_S3;

serverSideEncryptionKmsKeyId

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

示例:

serverSideEncryptionKmsKeyId=arn:aws:kms:us-east-1:944454115380:key/72abb6fb-1e49-4ac1-9aed-c803dfcc0480;

dataFormat

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

默认值:csv

有效值:csvparquet

示例:

dataFormat=parquet;

encodingType

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

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

  • plain – 无编码。

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

默认值:rle-dictionary

有效值:rle-dictionaryplainplain-dictionary

示例:

encodingType=plain-dictionary;

dictPageSizeLimit

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

默认值:1024000 (1 MB)

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

示例:

dictPageSizeLimit=2,048,000;

rowGroupLength

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

默认值:10024 (10 KB)

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

示例:

rowGroupLength=20,048;

dataPageSize

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

默认值:1024000 (1 MB)

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

示例:

dataPageSize=2,048,000;

parquetVersion

.parquet 文件格式的版本。

默认值:PARQUET_1_0

有效值:PARQUET_1_0 或 PARQUET_2_0

示例:

parquetVersion=PARQUET_2_0;

enableStatistics

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

默认值:true

有效值:truefalseyn

示例:

enableStatistics=false;