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

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

在 DynamoDB 中请求表导出

DynamoDB 表导出允许将表数据导出到 Amazon S3 桶,同时使您可以使用其它 Amazon 服务(如 Athena、Amazon Glue、Amazon SageMaker、Amazon EMR 和 Amazon Lake Formation)对数据执行分析和复杂的查询。可以使用 Amazon Web Services Management Console、Amazon CLI 或 DynamoDB API 请求表导出。

DynamoDB 同时支持完整导出和增量导出:

  • 使用完整导出,可以在从时间点故障恢复(PITR)时段内的任何时间点,将表的完整快照导出到 Amazon S3 桶。

  • 通过增量导出,您可以将 DynamoDB 表中在 PITR 时段的指定时间段内已更改、更新或删除的数据导出到 AmazonS3 桶中。

先决条件

启用 PITR

要使用“导出到 S3”功能,您需要针对表启用 PITR。有关如何启用 PITR 的详细信息,请参阅时间点故障恢复。如果您请求导出未启用 PITR 的表,则请求将失败,并显示一条异常消息:“调用 ExportTableToPointInTime 操作时出现错误(PointInTimeRecoveryUnavailableException):未为表“my-dynamodb-table”启用时间点故障恢复”。

设置 S3 权限

可以将表数据导出到具有写入权限的任何 Amazon S3 存储桶。目标桶无需与原表位于同一 Amazon区域中,也无需与原表具有同一拥有者。您的 Amazon Identity and Access Management(IAM)策略需要允许您执行 S3 操作(s3:AbortMultipartUploads3:PutObjects3:PutObjectAcl)和 DynamoDB 导出操作(dynamodb:ExportTableToPointInTime)。以下是一个示例策略,该策略将授予您的用户执行导出到 S3 桶的权限。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowDynamoDBExportAction", "Effect": "Allow", "Action": "dynamodb:ExportTableToPointInTime", "Resource": "arn:aws:dynamodb:us-east-1:111122223333:table/my-table" }, { "Sid": "AllowWriteToDestinationBucket", "Effect": "Allow", "Action": [ "s3:AbortMultipartUpload", "s3:PutObject", "s3:PutObjectAcl" ], "Resource": "arn:aws:s3:::your-bucket/*" } ] }

如果您需要写入其它账户中的 S3 桶,或者您没有写入权限,则 S3 桶拥有者需要添加桶策略以允许您从 DynamoDB 导出到该桶。以下是有关目标 S3 桶的策略示例。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "ExampleStatement", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:user/Dave" }, "Action": [ "s3:AbortMultipartUpload", "s3:PutObject", "s3:PutObjectAcl" ], "Resource": "arn:aws:s3:::awsexamplebucket1/*" } ] }

导出时撤消这些权限将导致部分文件。

注意

如果您要导出到的目标表或桶使用了客户管理的密钥加密,则该 KMS 密钥的策略必须赋予 DynamoDB 使用该密钥的权限。此权限是通过触发导出任务的 IAM 用户/角色授予的。有关加密的更多信息,包括最佳实践,请参阅 DynamoDB 如何使用 Amazon KMS使用自定义 KMS 密钥

请求使用 Amazon Web Services Management Console 导出

下面的示例演示如何使用 DynamoDB 控制台导出名为 MusicCollection 的现有表。

注意

此过程假定已启用时间点恢复。要在 MusicCollection 表中启用,在表的概述选项卡的表详细信息部分,为时间点恢复选择启用

请求表导出
  1. 登录 Amazon Web Services Management Console,打开 DynamoDB 控制台:https://console.aws.amazon.com/dynamodb/

  2. 在控制台左侧的导航窗格中,选择流和导出

  3. 选择导出到 S3 按钮。

  4. 选择源表和目标 S3 存储桶。如果目标存储桶为您的账户所拥有,则您可以使用 Browse S3(浏览 S3)按钮查找它。否则,使用 s3://bucketname/prefix format. 输入存储桶的 URL,prefix 是一个可选文件夹,有助于您的目标存储桶保持井然有序。

  5. 选择完整导出增量导出完整导出会按照您指定的时间点输出表的完整表快照。增量导出会输出在指定的导出期间对表所做的更改。您的输出经过压缩,以便只包含导出期间项目的最终状态。即使该项目在同一导出期间内有多个更新,也只会在导出中出现一次。

    Full export
    1. 选择要从中导出完整表快照的时间点。这可以是 PITR 时段内的任何时间点。或者,您可以选择当前时间以导出最新的快照。

    2. 对于导出的文件格式,请在 DynamoDB JSONAmazon Ion 之间进行选择。默认表将从时间点恢复窗口中的最新可还原时间以 DynamoDB JSON 格式导出,并使用 Amazon S3 密钥 (SSE-S3) 加密。您可以根据需要更改这些导出设置。

      注意

      如果选择使用 Amazon Key Management Service (Amazon KMS) 保护的密钥对导出进行加密,则密钥必须与目标 S3 存储桶位于同一区域。

    Incremental export
    1. 选择要针对其导出增量数据的导出期间。在 PITR 时段中选择开始时间。导出期间持续时间必须至少为 15 分钟,且不超过 24 小时。导出期间的开始时间包含在内,结束时间不包括在内。

    2. 绝对模式相对模式之间进行选择。

      1. 绝对模式将导出您指定的时间段内的增量数据。

      2. 相对模式将在相对于导出任务提交时间的导出期间内导出增量数据。

    3. 对于导出的文件格式,请在 DynamoDB JSONAmazon Ion 之间进行选择。默认表将从时间点恢复窗口中的最新可还原时间以 DynamoDB JSON 格式导出,并使用 Amazon S3 密钥 (SSE-S3) 加密。您可以根据需要更改这些导出设置。

      注意

      如果选择使用 Amazon Key Management Service (Amazon KMS) 保护的密钥对导出进行加密,则密钥必须与目标 S3 存储桶位于同一区域。

    4. 对于导出视图类型,选择新旧映像仅限新映像。新映像提供项目的最新状态。旧映像提供项目在指定的“开始日期和时间”之前的状态。原定设置为新旧映像。有关新映像和旧映像的更多信息,请参阅增量导出输出

  6. 单击导出按钮开始导出。

导出的数据在事务上不一致。这意味着您的事务操作可能会在两个导出输出之间发生损坏。您可能会看到由事务操作修改的一个项目子集反映在导出中,而同一事务中的另一个修改子集未反映在同一个导出请求中。但是,导出最终是一致的。如果事务在导出过程中损坏,则可以保证在下一次连续导出中具有剩余的事务,而没有重复。用于导出的时间段基于内部系统时钟,可能与应用程序的本地时钟相差一分钟。

获取 Amazon Web Services Management Console 中以前导出的详细信息

通过单击导航侧边栏中的导出到 S3 部分,可以找到您过去运行的导出任务的信息。此部分包含过去 90 天内创建的所有导出的列表。选择“导出”选项卡中列出任务的 ARN 将检索该导出的信息,包括您选择的任何高级配置设置。请注意,尽管导出任务元数据会在 90 天后过期,列表中没有早于该日期的作业,但 S3 存储桶中的数据元将保持存储桶策略允许的时间。导出时,DynamoDB 不删除 S3 存储桶中创建的任何对象。

请求使用 Amazon CLI 导出

下面的示例演示如何使用 Amazon CLI 将现有表 MusicCollection 导出到 S3 存储桶 ddb-export-musiccollection

注意

此过程假定已启用时间点恢复。要为 MusicCollection 表启用,请运行下面的命令。

aws dynamodb update-continuous-backups \ --table-name MusicCollection \ --point-in-time-recovery-specification PointInTimeRecoveryEnabled=True
Full export

下面的命令将 MusicCollection 导出具有前缀 2020-Nov 的 S3 存储桶 ddb-export-musiccollection-9012345678。表数据将从时间点恢复窗口的特定时间以 DynamoDB JSON 格式导出,并使用 Amazon S3 key (SSE-S3) 加密。

注意

如果请求跨账户表导出,请务必包含 --s3-bucket-owner 选项。

aws dynamodb export-table-to-point-in-time \ --table-arn arn:aws:dynamodb:us-west-2:123456789012:table/MusicCollection \ --s3-bucket ddb-export-musiccollection-9012345678 \ --s3-prefix 2020-Nov \ --export-format DYNAMODB_JSON \ --export-time 1604632434 \ --s3-bucket-owner 9012345678 \ --s3-sse-algorithm AES256
Incremental export

以下命令通过提供新的 --export-type--incremental-export-specification 来执行增量导出。用您自己的值替代任何斜体内容。时间指定为自纪元以来的秒数。

aws dynamodb export-table-to-point-in-time \ --table-arn arn:aws:dynamodb:REGION:ACCOUNT:table/TABLENAME \ --s3-bucket BUCKET --s3-prefix PREFIX \ --incremental-export-specification ExportFromTime=1693569600,ExportToTime=1693656000,ExportViewType=NEW_AND_OLD_IMAGES \ --export-type INCREMENTAL_EXPORT
注意

如果选择使用 Amazon Key Management Service (Amazon KMS) 保护的密钥对导出进行加密,则密钥必须与目标 S3 存储桶位于同一区域。

获取 Amazon CLI 中以前导出的详细信息

可以使用 list-exports 命令,查找有关以前运行的导出请求的信息。此命令返回过去 90 天创建的所有导出的列表。请注意,尽管导出任务元数据会在 90 天后过期,list-exports 命令不再返回早于该日期的作业,但 S3 存储桶中的数据元将保持存储桶策略允许的时间。导出时,DynamoDB 不删除 S3 存储桶中创建的任何对象。

导出的状态为 PENDING,直到成功或失败。如果成功,则状态将更改为 COMPLETED。如果失败,则状态将更改为 FAILED,并带有 failure_messagefailure_reason

下面的示例使用可选 table-arn 参数,仅列出特定表的导出。

aws dynamodb list-exports \ --table-arn arn:aws:dynamodb:us-east-1:123456789012:table/ProductCatalog

要检索有关特定导出任务的详细信息(包括任何高级配置设置),请使用 describe-export 命令。

aws dynamodb describe-export \ --export-arn arn:aws:dynamodb:us-east-1:123456789012:table/ProductCatalog/export/01234567890123-a1b2c3d4

请求使用 Amazon SDK 导出

通过您选择的 Amazon SDK,使用这些代码片段请求导出表。

Python

完整导出

import boto3 from datetime import datetime # remove endpoint_url for real use client = boto3.client('dynamodb') # https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/dynamodb/client/export_table_to_point_in_time.html client.export_table_to_point_in_time( TableArn='arn:aws:dynamodb:us-east-1:0123456789:table/TABLE', ExportTime=datetime(2023, 9, 20, 12, 0, 0), S3Bucket='bucket', S3Prefix='prefix', S3SseAlgorithm='AES256', ExportFormat='DYNAMODB_JSON' )

增量导出

import boto3 from datetime import datetime client = boto3.client('dynamodb') client.export_table_to_point_in_time( TableArn='arn:aws:dynamodb:us-east-1:0123456789:table/TABLE', IncrementalExportSpecification={ 'ExportFromTime': datetime(2023, 9, 20, 12, 0, 0), 'ExportToTime': datetime(2023, 9, 20, 13, 0, 0), 'ExportViewType': 'NEW_AND_OLD_IMAGES' }, ExportType='INCREMENTAL_EXPORT', S3Bucket='bucket', S3Prefix='prefix', S3SseAlgorithm='AES256', ExportFormat='DYNAMODB_JSON' )

使用 Amazon SDK 获取有关以前导出的详细信息

通过您选择的 Amazon SDK,使用这些代码片段获取有关以前表导出的详细信息。

Python

完整导出

import boto3 client = boto3.client('dynamodb') # https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/dynamodb/client/list_exports.html print( client.list_exports( TableArn='arn:aws:dynamodb:us-east-1:0123456789:table/TABLE', ) )

增量导出

import boto3 client = boto3.client('dynamodb') # https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/dynamodb/client/describe_export.html print( client.describe_export( ExportArn='arn:aws:dynamodb:us-east-1:0123456789:table/TABLE/export/01695353076000-06e2188f', )['ExportDescription'] )