Amazon DynamoDB
开发人员指南 (API Version 2012-08-10)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

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

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

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

下图概要显示了使用 AWS Data Pipeline 导出和导入 DynamoDB 数据的过程。

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

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

重要

当导出或导入 DynamoDB 数据时,所使用的基础 AWS 服务会产生额外成本:

  • AWS Data Pipeline - 管理导入/导出工作流程。

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

  • Amazon EMR - 运行托管 Hadoop 集群以在 DynamoDB 与 Amazon S3 之间执行读取和写入操作。集群配置是一个 m1.medium 实例主节点 (master node) 和一个 m1.medium 实例核心节点。

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

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

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

您还可以通过创建 IAM 策略并将其挂载到 IAM 用户或组来控制相关的访问权限。通过这些策略,您可以指定允许哪些用户导入和导出 DynamoDB 数据。

重要

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

为 AWS Data Pipeline 创建 IAM 角色

为了使用 AWS Data Pipeline,您的 AWS 账户中必须有以下 IAM 角色:

  • DataPipelineDefaultRole - 管道可为您执行的操作。

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

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

注意

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

  1. 登录 AWS 管理控制台 并通过以下网址打开 IAM 控制台 https://console.amazonaws.cn/iam/

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

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

    1. Role Name 字段中,键入 DataPipelineDefaultRole,然后单击 Next Step

    2. Select Role Type 面板的 AWS Service Roles 列表中,转到 AWS Data Pipeline,然后单击 Select

    3. Attach Policy 面板中,单击 AWSDataPipelineRole 策略旁边的框,然后单击 Next Step

    4. 检查面板中,单击创建角色

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

    1. Role Name 字段中,键入 DataPipelineDefaultResourceRole,然后单击 Next Step

    2. Select Role Type 面板的 AWS Service Roles 列表中,转到 Amazon EC2 Role for Data Pipeline,然后单击 Select

    3. Attach Policy 面板中,单击 AmazonEC2RoleforDataPipelineRole 策略旁边的框,然后单击 Next Step

    4. 检查面板中,单击创建角色

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

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

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

使用 AWS 托管策略授予完全访问权限

下面的过程介绍如何将 AWS 托管策略 AmazonDynamoDBFullAccesswithDataPipeline 附加到 IAM 用户。此托管策略提供对 AWS Data Pipeline 和 DynamoDB 资源的完全访问权限。

  1. 登录 AWS 管理控制台 并通过以下网址打开 IAM 控制台 https://console.amazonaws.cn/iam/

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

  3. Permissions 选项卡中,单击 Attach Policy

  4. Attach Policy 面板中,选择 AmazonDynamoDBFullAccesswithDataPipeline,然后单击 Attach Policy

注意

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

限制对特定 DynamoDB 表的访问权限

如果您需要限制访问权限,使用户只能导出或导入您的表的某个子集,则需要创建一个自定义的 IAM 策略文档。您可以使用 AWS 托管策略 AmazonDynamoDBFullAccesswithDataPipeline 作为自定义策略的起点,然后修改该策略,以便用户只能使用您指定的表。

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

  1. 登录 AWS 管理控制台 并通过以下网址打开 IAM 控制台 https://console.amazonaws.cn/iam/

  2. 从 IAM 控制台的控制面板,单击 Policies,然后单击 Create Policy

  3. Create Policy 面板中,转到 Copy an AWS Managed Policy,然后单击 Select

  4. Copy an AWS Managed Policy 面板中,转到 AmazonDynamoDBFullAccesswithDataPipeline,然后单击 Select

  5. Review Policy 面板中,执行以下操作:

    1. 检查自动生成的 Policy NameDescription。如果需要,可以修改这些值。

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

      Copy
      { "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...

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

      Copy
      "dynamodb:*",

      接下来,构造一个新的 Action,它仅允许对 ForumThreadReply 表进行访问:

      Copy
      { "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 替换为您的 AWS 账号。

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

      Copy
      { "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. 根据需要完成策略设置后,单击 Create Policy

创建策略后,您可以将策略挂载到 IAM 用户。

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

  2. Permissions 选项卡中,单击 Attach Policy

  3. Attach Policy 面板中,选择策略名称,然后单击 Attach Policy

注意

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

将 DynamoDB 的数据导出到 Amazon S3

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

重要

如果您以前从未使用过 AWS Data Pipeline,则需要在此步骤之前设置两个 IAM 角色。有关更多信息,请参阅 为 AWS Data Pipeline 创建 IAM 角色

  1. Sign in to the AWS 管理控制台 and open the AWS Data Pipeline console at https://console.amazonaws.cn/datapipeline/.

  2. 如果您在当前 AWS 区域中没有任何管道,请选择 Get started now

    如果您已经至少有一个管道,请选择 Create new pipeline

  3. Create Pipeline 页上,执行以下操作:

    1. Name 字段中为您的管道输入一个名称。例如:MyDynamoDBExportPipeline

    2. 对于 Source 参数,请选择 Build using a template。在模板下拉列表中,选择 Export DynamoDB table to S3

    3. Source DynamoDB table name 字段中,输入您要导出的 DynamoDB 表的名称。

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

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

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

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

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

      S3 Log FolderOutput S3 Folder 的 URI 格式相同。URI 必须解析为文件夹;日志文件不能写入 S3 存储桶的最高一层。

  4. 根据需要设置完毕后,单击 Activate

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

导出完成后,您可以转到 Amazon S3 控制台查看导出文件。该文件位于与表同名的文件夹内,并使用以下格式命名:YYYY-MM-DD_HH.MMAWS Data Pipeline 开发人员指南 中的验证数据导出文件中介绍了该文件的内部格式。

将 Amazon S3 中的数据导入到 DynamoDB

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

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

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

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

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

目标表可位于不同的 AWS 区域中。例如,假设您在 美国西部(俄勒冈) 区域中有一个 Customer 表并将其数据导出到 Amazon S3。然后,可将数据导入到 欧洲(爱尔兰) 区域中的相同 Customer 表。这称为跨区域 导出和导入。有关 AWS 区域的列表,请转至 AWS General Reference 中的区域和终端节点

请注意,AWS 管理控制台可帮助您一次导出多个源表。但是,一次只能导入一个表。

  1. Sign in to the AWS 管理控制台 and open the AWS Data Pipeline console at https://console.amazonaws.cn/datapipeline/.

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

  3. 选择 Create new pipeline

  4. Create Pipeline 页上,执行以下操作:

    1. Name 字段中为您的管道输入一个名称。例如:MyDynamoDBImportPipeline

    2. 对于 Source 参数,请选择 Build using a template。在模板下拉列表中选择 Import DynamoDB backup data from S3

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

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

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

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

      导入任务将在指定的 Amazon S3 位置查找文件。AWS Data Pipeline 开发人员指南 中的验证数据导出文件中介绍了该文件的内部格式。

    4. Target DynamoDB table name 字段中,键入您要将数据导入其中的 DynamoDB 表的名称。

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

      S3 Log FolderOutput S3 Folder 的 URI 格式相同。URI 必须解析为文件夹;日志文件不能写入 S3 存储桶的最高一层。

  5. 根据需要设置完毕后,单击 Activate

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

故障排除

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

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

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

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

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

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

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

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

  • 您可能已达到 AWS 账户中的资源限制,例如,Amazon EC2 实例的最大数目或 AWS Data Pipeline 管道的最大数目。有关更多信息,包括如何请求提高这些限制,请参阅 AWS General Reference 中的 AWS 服务限制

注意

有关对管道进行故障排除的更多详细信息,请转至 AWS Data Pipeline 开发人员指南 中的故障排除

AWS Data Pipeline 和 DynamoDB 的预定义模板

如果您希望更深入地了解 AWS Data Pipeline 的工作机制,我们建议您查阅 AWS Data Pipeline 开发人员指南。此指南包含创建和使用管道的分步式教程;您可以适用这些教程作为创建自己管道的起点。我们建议您阅读 DynamoDB 教程,该教程介绍了创建可根据需要自定义的导入和导出管道所需的步骤。请参阅 AWS Data Pipeline 开发人员指南 中的教程:使用 AWS Data Pipeline 执行 Amazon DynamoDB 导入和导出

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

在 DynamoDB 和 Amazon S3 之间导出数据

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