在 DynamoDB 中请求表导出 - Amazon DynamoDB

在 DynamoDB 中请求表导出

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

注意

不支持申请方付款 Amazon S3 存储桶。

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

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

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

先决条件

启用 PITR

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

设置 S3 权限

可以将表数据导出到具有写入权限的任何 Amazon S3 存储桶。目标存储桶无需与源表位于同一 AWS 区域中,也无需与源表具有同一拥有者。您的 AWS 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 如何使用 AWS KMS使用自定义 KMS 密钥

请求使用 AWS Management Console 导出

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

注意

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

请求表导出
  1. 登录 AWS 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) 加密。您可以根据需要更改这些导出设置。

      注意

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

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

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

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

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

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

      注意

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

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

  6. 选择导出以开始。

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

获取 AWS Management Console 中以前导出的详细信息

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

请求使用 AWS CLI 导出

下面的示例演示如何使用 AWS 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
注意

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

获取 AWS 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

请求使用 AWS SDK 导出

通过您选择的 AWS 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' )

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

通过您选择的 AWS 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'] )