使用导出和导入 DynamoDB 数据 Amazon Data Pipeline - Amazon DynamoDB
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

使用导出和导入 DynamoDB 数据 Amazon Data Pipeline

您可以使用 Amazon Data Pipeline 将数据从 DynamoDB 表导出到 Amazon S3 存储桶中的文件。也可以使用该控制台将 Amazon S3 中的数据导入到同一 Amazon 区域或不同区域的 DynamoDB 表。

注意

DynamoDB 控制台现在原生支持从 Amazon S3 导入以及导出到 Amazon S3。这些流程与 Amazon Data Pipeline 导入流程不兼容。有关更多信息,请参阅从 Amazon S3 导入从 Amazon S3 导出以及博客文章将 Amazon DynamoDB 表数据导出到 Amazon S3 中的数据湖

导出和导入数据的功能在很多情况下有用。例如,假设要维持基准数据集用于测试。您可以将基准数据放入 DynamoDB 表,将表导出到 Amazon S3。运行应用程序修改测试数据后,可以将基准数据从 Amazon S3 导入回 DynamoDB 表,“重置”数据集。另一个示例是数据意外删除,或者甚至意外 DeleteTable 操作。在这类情况下,可以用以前导出到 Amazon S3 的文件还原数据。甚至可以从一个 Amazon 区域的 DynamoDB 复制数据,在 Amazon S3 中存储数据,然后将数据从 Amazon S3 导入到另一个区域的完全相同 DynamoDB 表。第二个区域中的应用程序随后可以访问最近的 DynamoDB 端点,使用自己的数据副本,降低网络延迟。

重要

DynamoDB 备份和还原是一项全托管功能。可以备份数 MB 到数百 TB 数据的表,不会影响生产应用程序的性能和可用性。只需单击一下即可恢复您的表格, Amazon Web Services Management Console 也可以调用一次 API。我们强烈建议您使用 DynamoDB 的本机备份和还原功能,而不是使用。 Amazon Data Pipeline有关更多信息,请参阅使用 DynamoDB 的按需备份和还原

下图概述使用 Amazon Data Pipeline 导出和导入 DynamoDB 数据的过程。

要导出 DynamoDB 表,您可以使用 Amazon Data Pipeline 控制台创建新的管道。管道将启动 Amazon EMR 集群以执行实际导出。Amazon EMR 从 DynamoDB 读取数据,将数据写入 Amazon S3 存储桶中的导出文件。

此过程与导入类似,区别在于从 Amazon S3 存储桶读取数据并写入 DynamoDB 表。

重要

导出或导入 DynamoDB 数据时,所使用的 Amazon 底层服务将产生额外费用:

  • Amazon Data Pipeline— 为您管理导入/导出工作流程。

  • Amazon S3— 包含从 DynamoDB 导出或导入到 DynamoDB 的数据。

  • Amazon EMR— 运行托管 Hadoop 集群,在 DynamoDB 与 Amazon S3 之间执行读取和写入操作。集群配置是一个 m3.xlarge 实例主节点和一个 m3.xlarge 实例核心节点。

有关更多信息,请参阅 Amazon Data Pipeline 定价Amazon EMR 定价Amazon S3 定价

导出和导入数据的先决条件

使用导 Amazon Data Pipeline 出和导入数据时,必须指定允许管道执行的操作以及管道可以消耗哪些资源。允许的操作和资源是使用 Amazon Identity and Access Management (IAM) 角色定义的。

还可以通过创建 IAM policy 并将其附加到用户、角色或组来控制访问权限。通过这些策略,可以指定允许哪些用户导入和导出 DynamoDB 数据。

重要

如果用户想在 Amazon 外部进行交互,则需要编程访问权限 Amazon Web Services Management Console。 Amazon API 和 Amazon Command Line Interface 所需的访问密钥。可能的话,创建临时凭证,该凭证由一个访问密钥 ID、一个秘密访问密钥和一个指示凭证何时到期的安全令牌组成。

要向用户授予编程式访问权限,请选择以下选项之一。

哪个用户需要编程式访问权限? 目的 方式
IAM 使用短期凭证签署对 Amazon CLI 或 Amazon API 的编程请求(直接或使用 Amazon 软件开发工具包)。 按照 IAM 用户指南中的将临时证书与 Amazon 资源配合使用中的说明进行操作。
IAM

(不推荐使用)

使用长期凭证签署对 Amazon CLI 或 Amazon API 的编程请求(直接或使用 Amazon 软件开发工具包)。
按照《IAM 用户指南》管理 IAM 用户的访问密钥中的说明进行操作。

为 Amazon Data Pipeline 创建 IAM 角色

要使用 Amazon Data Pipeline,您的 Amazon 账户中必须存在以下 IAM 角色:

  • DataPipelineDefaultRole— 您的管道可以代表您执行的操作。

  • DataPipelineDefaultResourceRole— 管道将代表您配置的 Amazon 资源。为了导出和导入 DynamoDB 数据,这些资源包括 Amazon EMR 集群和与该集群关联的 Amazon EC2 实例。

如果你 Amazon Data Pipeline 以前从未使用过,则需要DataPipelineDefaultResourceRole自己创DataPipelineDefaultRole作。创建这些角色后,您可以随时使用它们来导出或导入 DynamoDB 数据。

注意

如果您之前曾使用 Amazon Data Pipeline 控制台创建过管道 DataPipelineDefaultRole,则当时DataPipelineDefaultResourceRole是为您创建的。您无需执行其他任何操作;可以跳过本节,开始使用 DynamoDB 控制台创建管道。有关更多信息,请参阅 将数据从 DynamoDB 导出到 Amazon S3将数据从 Amazon S3 导入 DynamoDB

  1. 登录 Amazon Web Services Management Console 并打开 IAM 控制台,网址为 https://console.aws.amazon.com/iam/

  2. 从 IAM 控制台控制面板,单击角色

  3. 单击创建角色,然后执行以下操作:

    1. Amazon Service 信任实体中,选择 Data Pipeline

    2. 选择使用案例面板中,选择 Data Pipeline,然后选择下一步:权限

    3. 请注意,自动附加 AWSDataPipelineRole 策略。选择下一步:审核

    4. 角色名称字段中,键入 DataPipelineDefaultRole 作为角色名称,然后选择创建角色

  4. 单击创建角色,然后执行以下操作:

    1. Amazon Service 信任实体中,选择 Data Pipeline

    2. 选择使用案例面板中,选择 Data Pipeline 的 EC2 角色,然后选择下一步:权限

    3. 请注意,自动附加 AmazonEC2RoleForDataPipelineRole 策略。选择下一步:审核

    4. 角色名称字段中,键入 DataPipelineDefaultResourceRole 作为角色名称,然后选择创建角色

创建这些角色后,可以使用 DynamoDB 控制台开始创建管道。有关更多信息,请参阅 将数据从 DynamoDB 导出到 Amazon S3将数据从 Amazon S3 导入 DynamoDB

使用向用户和群组授予执行导出和导入任务的权限 Amazon Identity and Access Management

如果要允许其他用户、角色或组导出和导入 DynamoDB 表数据,可以创建一个 IAM policy,并将其附加到您指定的用户或组。该策略只包含执行这些任务所需的权限。

授予完全访问权限

以下过程介绍如何将 Amazon 托管策略AmazonDynamoDBFullAccessAWSDataPipeline_FullAccess和 Amazon EMR 内联策略附加到用户。这些托管策略提供对 Amazon Data Pipeline 和访问 DynamoDB 资源的完全访问权限,并与 Amazon EMR 内联策略配合使用,允许用户执行本文档中描述的操作。

注意

为了限制建议权限的范围,上面的内联策略强制使用标记 dynamodbdatapipeline。如果希望在没有此限制的情况下使用此文档,可以删除建议策略的 Condition 部分。

  1. 登录 Amazon Web Services Management Console 并打开 IAM 控制台,网址为 https://console.aws.amazon.com/iam/

  2. 从 IAM 控制台控制面板,单击用户,选择要修改的用户。

  3. 权限选项卡中,单击附加策略

  4. 授予权限区域中,选择直接附加现有策略

  5. 选择 AmazonDynamoDBFullAccessAWSDataPipeline_FullAccess,然后单击下一步:审计

  6. 单击添加更多权限

  7. 权限选项卡上,单击添加内联策略

  8. 创建策略页面上,单击 JSON 选项卡。

  9. 粘贴下面的内容。

    { "Version": "2012-10-17", "Statement": [ { "Sid": "EMR", "Effect": "Allow", "Action": [ "elasticmapreduce:DescribeStep", "elasticmapreduce:DescribeCluster", "elasticmapreduce:RunJobFlow", "elasticmapreduce:TerminateJobFlows" ], "Resource": "*", "Condition": { "Null": { "elasticmapreduce:RequestTag/dynamodbdatapipeline": "false" } } } ] }
  10. 单击审计策略

  11. 在名称字段键入 EMRforDynamoDBDataPipeline

  12. 单击创建策略

注意

可以使用类似过程将此托管策略附加到组而不是附加到用户。

将访问权限限定为特定的 DynamoDB 表

如果您想限制访问权限,以便用户只能导出或导入您的表的子集,则需要创建自定义的 IAM 策略文档。可以使用 授予完全访问权限 介绍的过程作为自定义策略的起点,修改策略,使用户只能使用您指定的表。

例如,假设要允许用户仅导出和导入 ForumThreadReply 表。此过程介绍如何创建自定义策略,使用户可以使用这些表,不能使用其他表。

  1. 登录 Amazon Web Services Management Console 并打开 IAM 控制台,网址为 https://console.aws.amazon.com/iam/

  2. 从 IAM 控制台控制面板单击策略,然后单击创建策略

  3. 在 “创建策略” 面板中,转至 “复制 Amazon 托管策略”,然后单击 “选择”

  4. 在 “复制 Amazon 托管策略” 面板中,转至AmazonDynamoDBFullAccess并单击 “选择”

  5. 检查策略面板中,执行以下操作:

    1. 检查自动生成的策略名称说明。如果需要,可以修改这些值。

    2. 策略文档文本框中,编辑策略以限制对特定表的访问。默认情况下,该策略允许对所有表执行所有 DynamoDB 操作:

      { "Version": "2012-10-17", "Statement": [ { "Action": [ "cloudwatch:DeleteAlarms", "cloudwatch:DescribeAlarmHistory", "cloudwatch:DescribeAlarms", "cloudwatch:DescribeAlarmsForMetric", "cloudwatch:GetMetricStatistics", "cloudwatch:ListMetrics", "cloudwatch:PutMetricAlarm", "dynamodb:*", "sns:CreateTopic", "sns:DeleteTopic", "sns:ListSubscriptions", "sns:ListSubscriptionsByTopic", "sns:ListTopics", "sns:Subscribe", "sns:Unsubscribe" ], "Effect": "Allow", "Resource": "*", "Sid": "DDBConsole" }, ...remainder of document omitted...

      要限制该策略,请首先删除下面的行:

      "dynamodb:*",

      然后构造一个新的 Action,仅允许访问 ForumThreadReply 表:

      { "Action": [ "dynamodb:*" ], "Effect": "Allow", "Resource": [ "arn:aws:dynamodb:us-west-2:123456789012:table/Forum", "arn:aws:dynamodb:us-west-2:123456789012:table/Thread", "arn:aws:dynamodb:us-west-2:123456789012:table/Reply" ] },
      注意

      us-west-2 替换为您的 DynamoDB 表所在的区域。123456789012用您的 Amazon 账号替换。

      最后,将新的 Action 添加到策略文档:

      { "Version": "2012-10-17", "Statement": [ { "Action": [ "dynamodb:*" ], "Effect": "Allow", "Resource": [ "arn:aws:dynamodb:us-west-2:123456789012:table/Forum", "arn:aws:dynamodb:us-west-2:123456789012:table/Thread", "arn:aws:dynamodb:us-west-2:123456789012:table/Reply" ] }, { "Action": [ "cloudwatch:DeleteAlarms", "cloudwatch:DescribeAlarmHistory", "cloudwatch:DescribeAlarms", "cloudwatch:DescribeAlarmsForMetric", "cloudwatch:GetMetricStatistics", "cloudwatch:ListMetrics", "cloudwatch:PutMetricAlarm", "sns:CreateTopic", "sns:DeleteTopic", "sns:ListSubscriptions", "sns:ListSubscriptionsByTopic", "sns:ListTopics", "sns:Subscribe", "sns:Unsubscribe" ], "Effect": "Allow", "Resource": "*", "Sid": "DDBConsole" }, ...remainder of document omitted...
  6. 设置需要的策略后,单击创建策略

创建策略后,您可以将策略附加到用户。

  1. 从 IAM 控制台控制面板,单击用户,选择要修改的用户。

  2. 权限选项卡中单击附加策略

  3. 附加策略面板中选择策略名称,单击附加策略

注意

可以使用类似过程将策略附加到角色或组而不是附加到用户。

将数据从 DynamoDB 导出到 Amazon S3

本节介绍如何将一个或多个 DynamoDB 表的数据导出到 Amazon S3 存储桶。需要先创建 Amazon S3 存储桶,然后才能执行导出。

重要

如果您 Amazon Data Pipeline 以前从未使用过,则需要先设置两个 IAM 角色,然后再执行此过程。有关更多信息,请参阅为 Amazon Data Pipeline 创建 IAM 角色

  1. 登录 Amazon Web Services Management Console 并打开 Amazon Data Pipeline 控制台,网址为 https://console.aws.amazon.com/datapipeline/

  2. 如果您在当前 Amazon 区域中还没有任何管道,请选择立即开始

    或者如果已经有至少一个管道,请选择创建新管道

  3. 创建管道页执行以下操作:

    1. 名称字段中,键入管道名称。例如:MyDynamoDBExportPipeline

    2. 对于参数,请选择使用模板构建。从模板下拉列表选择将 DynamoDB 表导出至 S3

    3. 源 DynamoDB 表名称字段中,键入要导出的 DynamoDB 表名称。

    4. 输出 S3 文件夹文本框中,输入将写入导出文件的 Amazon S3 URI。例如:s3://mybucket/exports

      该 URI 的格式为 s3://bucketname/folder,其中:

      • bucketname 是 Amazon S3 存储桶的名称。

      • folder 是该存储桶中文件夹的名称。如果文件夹不存在,将自动创建。如果没有为文件夹指定名称,将为其分配 s3://bucketname/region/tablename 格式的名称。

    5. 日志的 S3 位置文本框中,输入将写入导出日志文件的 Amazon S3 URI。例如:s3://mybucket/logs/

      S3 日志文件夹输出 S3 文件夹的 URI 格式相同。URI 必须解析为文件夹;日志文件不能写入 S3 存储桶的顶层。

  4. 添加具有键 dynamodbdatapipeline 和值 true 的标签。

  5. 根据需要设置完后,单击激活

此时将创建管道;此过程可能需要几分钟才能完成。您可以在 Amazon Data Pipeline 控制台中监控进度。

导出完成后,可以转到 Amazon S3 控制台查看导出文件。输出文件名是一个不带扩展名的标识符值,如以下示例:ae10f955-fb2f-4790-9b11-fbfea01a871e_000000。该文件的内部格式在《Amazon Data Pipeline 开发人员指南》的 “文件结构” 中进行了介绍

将数据从 Amazon S3 导入 DynamoDB

本节假设已导出 DynamoDB 表的数据,已将导出文件写入 Amazon S3 存储桶。该文件的内部格式在《Amazon Data Pipeline 开发人员指南》的 “文件结构” 中进行了介绍。请注意,这是 DynamoDB 可以使用的唯一文件格式。 Amazon Data Pipeline

我们将从中导出数据的原始表称为源表,将接收导入数据的表称为目标表。如果满足以下所有条件,则可以从 Amazon S3 的导出文件导入数据:

  • 目标表已存在。(导入过程不会为您创建该表。)

  • 目标表具有与源表相同的键架构。

目标表不必是空的。但是,导入过程将替换表中与导出文件项目具有相同键的数据项目。例如,假设您有一个 Cust om er 表 CustomerId,其密钥为,并且该表中只有三个项目(CustomerId1、2 和 3)。如果导出文件也包含 CustomerID 1、2 和 3 的数据项目,则目标表中的项目将替换为导出文件中的相应项目。如果导出文件还包含 CustomerId4 的数据项,则该项将被添加到表中。

目标表可以位于不同的 Amazon 区域。例如,假设 US West (Oregon) 区域有一个 Customer 表,将其数据导出到 Amazon S3。然后可以将该数据导入 Europe (Ireland) 区域相同的 Customer 表。这称为跨区域导出和导入。有关 Amazon 区域的列表,请参阅《Amazon Web Services 一般参考》中的 区域和终端节点

请注意, Amazon Web Services Management Console 允许您一次导出多个源表。但是,一次只能导入一个表。

  1. 登录 Amazon Web Services Management Console 并打开 Amazon Data Pipeline 控制台,网址为 https://console.aws.amazon.com/datapipeline/

  2. (可选)如果要执行跨区域导入,请转到窗口右上角,选择目标区域。

  3. 选择创建新管道

  4. 创建管道页执行以下操作:

    1. 名称字段中,键入管道名称。例如:MyDynamoDBImportPipeline

    2. 对于参数,请选择使用模板构建。在模板下拉列表中,选择从 S3 导入 DynamoDB 备份数据

    3. 输入 S3 文件夹文本框中,输入导出文件所在的 Amazon S3 URI。例如:s3://mybucket/exports

      该 URI 的格式为 s3://bucketname/folder,其中:

      • bucketname 是 Amazon S3 存储桶的名称。

      • folder 是包含导出文件的文件夹名称。

      导入任务将在指定的 Amazon S3 位置查找文件。此文件的内部格式详见 Amazon Data Pipeline 开发人员指南验证数据导出文件

    4. 目标 DynamoDB 表名称字段中,键入要将数据导入其中的 DynamoDB 表名称。

    5. 日志的 S3 位置文本框中,输入将写入导入日志文件的 Amazon S3 URI。例如:s3://mybucket/logs/

      S3 日志文件夹输出 S3 文件夹的 URI 格式相同。URI 必须解析为文件夹;日志文件不能写入 S3 存储桶的顶层。

    6. 添加具有键 dynamodbdatapipeline 和值 true 的标签。

  5. 根据需要设置完后,单击激活

此时将创建管道;此过程可能需要几分钟才能完成。导入任务将在创建管道后立即开始。

故障排除

本节介绍 DynamoDB 导出的一些基本失败模式和问题排查方法。

如果导出或导入期间发生错误, Amazon Data Pipeline 控制台的管道状态将显示为 ERROR。如果发生这种情况,请单击失败管道的名称,转到其详细信息页面。即会显示有关管道中所有步骤的详细信息以及每个步骤的状态。尤其要检查您看到的所有执行堆栈跟踪。

最后,请转到 Amazon S3 存储桶,查找写入到这里的任何导出或导入日志文件。

下面是一些可能引起管道故障的常见问题以及纠正措施。要对管道进行诊断,请将看到的错误与下面说明的问题进行比较。

  • 若要导入,请确保目标表已存在,并且目标表具有与源表相同的键架构。必须满足这些条件,否则导入将失败。

  • 确保管道具有标签 dynamodbdatapipeline;否则,Amazon EMR API 调用将失败。

  • 确保已创建指定的 Amazon S3 存储桶,对其具有读取和写入权限。

  • 管道可能已超出其执行超时。(创建管道时设置此参数。) 例如,可能将执行超时设置为 1 小时,但导出任务可能需要比这更长的时间。尝试删除并重新创建管道,这次设置更长的执行超时间隔。

  • 如果从执行导出所用的原始存储桶之外的其他 Amazon S3 存储桶(包含导出备份)恢复,请更新清单文件。

  • 您可能不具有执行导出或导入的正确权限。有关更多信息,请参阅导出和导入数据的先决条件

  • 您可能已达到 Amazon 账户中的资源配额,例如 Amazon EC2 实例的最大数量或最大 Amazon Data Pipeline 管道数量。有关更多信息,包括如何请求增加这些配额,请参阅《Amazon Web Services 一般参考》的 Amazon 服务配额

注意

有关排除管道故障的更多详细信息,请转到 Amazon Data Pipeline 开发人员指南故障排除

Amazon Data Pipeline 和 DynamoDB 的预定义模板

如果您想更深入地了解 Amazon Data Pipeline 工作原理,我们建议您查阅Amazon Data Pipeline 开发人员指南。本指南包含创建和使用管道的 step-by-step教程;您可以使用这些教程作为创建自己的管道的起点。我们建议阅读 Amazon Data Pipeline 教程,该教程介绍创建可根据要求自定义的导入和导出管道所需的步骤。请参阅 Amazon Data Pipeline 开发人员指南中的教程:使用 Amazon Data Pipeline 导入和导出 Amazon DynamoDB

Amazon Data Pipeline 提供了多个用于创建管道的模板;以下模板与 DynamoDB 相关。

在 DynamoDB 和 Amazon S3 之间导出数据

注意

DynamoDB 控制台现在支持自己的导出到 Amazon S3 流程,但它与导入流程不兼容 Amazon Data Pipeline 。有关更多信息,请参阅 DynamoDB 数据导出到 Amazon S3:工作方式 和博客文章 Export Amazon DynamoDB table data to your data lake in Amazon S3, no code writing required(将 Amazon DynamoDB 表数据导出到 Amazon S3 的数据湖,无需编写代码)。

Amazon Data Pipeline 控制台提供了两个预定义的模板,用于在 DynamoDB 和 Amazon S3 之间导出数据。有关这些模板的更多信息,请参阅 Amazon Data Pipeline 开发人员指南