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

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

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

注意

DynamoDB 控制台现在支持自己的导出到 Amazon S3 流程,但它不兼容 Amazon Data Pipeline 导入流程。有关更多信息,请参见 将 DynamoDB 表数据导出到 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 策略并附加到 IAM 用户、角色或组,控制访问权限。通过这些策略,可以指定允许哪些用户导入和导出 DynamoDB 数据。

重要

执行导出和导入的 IAM 用户必须具有有效 Amazon 访问密钥 ID 和私有密钥。有关更多信息,请参见 IAM 用户指南 中的管理 IAM 用户的访问密钥

为 Amazon Data Pipeline 创建 IAM 角色

要使用 Amazon Data Pipeline,Amazon 账户中必须有以下 IAM 角色:

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

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

如果之前从未使用过 Amazon Data Pipeline,则需要自己创建 DataPipelineDefaultRoleDataPipelineDefaultResourceRole。创建这些角色后,任何时候需要导出或导入 DynamoDB 数据时都可以使用。

注意

如果以前使用 Amazon Data Pipeline 控制台创建过管道,则当时已经创建 DataPipelineDefaultRoleDataPipelineDefaultResourceRole。您无需执行其他任何操作;可以跳过本节,开始使用 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

授予 IAM 用户和组执行导出和导入任务的权限

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

授予完全访问权

以下过程介绍如何将 Amazon 托管策略 AmazonDynamoDBFullAccessAWSDataPipeline_FullAccess 和 Amazon EMR 内联策略附加到 IAM 用户。这些托管策略提供对 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 策略文档。可以使用 授予完全访问权 介绍的过程作为自定义策略的起点,修改策略,使用户只能使用您指定的表。

例如,假设要允许 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. 设置需要的策略后,单击创建策略

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

  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_000000Amazon Data Pipeline 开发人员指南验证数据导出文件介绍此文件的内部格式。

将数据从 Amazon S3 导入 DynamoDB

本节假设已导出 DynamoDB 表的数据,已将导出文件写入 Amazon S3 存储桶。Amazon Data Pipeline 开发人员指南验证数据导出文件介绍此文件的内部格式。请注意,这是 DynamoDB 可以使用 Amazon Data Pipeline 导入的唯一文件格式。

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

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

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

目标表不必是空的。但是,导入过程将替换表中与导出文件项目具有相同键的数据项目。例如,假设有一个 Customer 表,键为 CustomerId,表中只有三个项目(CustomerId 1、2 和 3)。如果导出文件也包含 CustomerID 1、2 和 3 的数据项目,则目标表中的项目将替换为导出文件中的相应项目。如果导出文件还包含 CustomerId 4 的数据项目,则将向表中添加该项目。

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

请注意,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. 根据需要设置完后,单击激活

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

Troubleshooting

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

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

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

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

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

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

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

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

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

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

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

注意

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

Amazon Data Pipeline 和 DynamoDB 的预定义模板

如果希望更深入了解 Amazon Data Pipeline 的工作方式,我们建议查阅 Amazon Data Pipeline 开发人员指南。此指南包含创建和使用管道的分步式教程;您可以将这些教程作为创建自己管道的起点。我们建议阅读 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 和博客帖子将 Amazon DynamoDB 表数据导出到 Amazon S3 的数据湖,无需编写代码

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