DynamoDB でテーブルのエクスポートをリクエストする
DynamoDB テーブルのエクスポートを使用すると、テーブルデータを Amazon S3 バケットにエクスポートできます。これにより、Athena、AWS Glue、Amazon SageMaker AI、Amazon EMR、および AWS Lake Formation などの他の AWS のサービスを使用して、データに対して分析や複雑なクエリの実行が許可されます。テーブルのエクスポートをリクエストするには、AWS マネジメントコンソール、AWS CLI、または DynamoDB API のいずれかを使用します。
Amazon S3 のリクエスタ支払いバケットはサポートされていません。
DynamoDB はフルエクスポートと増分エクスポートの両方をサポートしています。
前提条件
PITR を有効にする
S3 へのエクスポート機能を使用するには、テーブルで PITR を有効にする必要があります。PITR を有効にする方法の詳細については、「ポイントインタイムリカバリ」を参照してください。PITR が有効になっていないテーブルのエクスポートをリクエストすると、「ExportTableToPointInTime オペレーションの呼び出し時にエラーが発生しました (PointInTimeRecoveryUnavailableException): テーブル 'my-dynamodb-table' のポイントインタイムリカバリが有効になっていません」という例外メッセージが表示されてリクエストが失敗します。リクエストとエクスポートは、設定された PITR RecoveryPeriodInDays 内の特定の時点からのみ行うことができます。
S3 アクセス権限の設定
テーブルデータは、書き込みアクセス許可のある任意の Amazon S3 バケットにエクスポートできます。エクスポート先のバケットは、ソーステーブル所有者と同じ AWS リージョンに存在する必要はなく、所有者が同じである必要もありません。AWS Identity and Access Management (IAM) ポリシーでは、S3 アクション (s3:AbortMultipartUpload、s3:PutObject、およびs3:PutObjectAcl) と DynamoDB エクスポートアクション (dynamodb:ExportTableToPointInTime) を実行できるようにする必要があります。S3 バケットへのエクスポートを実行するアクセス許可をユーザーに付与するポリシーの例を次に示します。
- JSON
-
-
{
"Version":"2012-10-17",
"Statement": [
{
"Sid": "AllowDynamoDBExportAction",
"Effect": "Allow",
"Action": "dynamodb:ExportTableToPointInTime",
"Resource": "arn:aws:dynamodb:us-east-1:111122223333:table/my-table"
},
{
"Sid": "AllowS3BucketWrites",
"Effect": "Allow",
"Action": [
"s3:AbortMultipartUpload",
"s3:PutObject",
"s3:PutObjectAcl"
],
"Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*"
}
]
}
別のアカウントにある Amazon S3 バケットに書き込む必要がある場合や書き込みアクセス許可がない場合、Amazon S3 バケット所有者は、DynamoDB からバケットへのエクスポートをユーザーに許可するバケットポリシーを追加する必要があります。エクスポート先の Amazon S3 バケットのポリシー例を次に示します。
- JSON
-
-
{
"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:::amzn-s3-demo-bucket/*"
}
]
}
エクスポートの進行中にこれらの権限を取り消すと、ファイルの一部だけがエクスポートされます。
AWS マネジメントコンソール を使用してエクスポートをリクエストする
DynamoDB コンソールを使用して、MusicCollection という既存のテーブルをエクスポートする方法を次の例に示します。
この手順は、ポイントインタイムリカバリを有効にしていることを前提としています。これを MusicCollection テーブルに対して有効にするには、[Overview] (概要) タブにある [Table details] (テーブルの詳細) セクションの [Point-in-time recovery] (ポイントインタイムリカバリ) で [Enable] (有効化) を選択します。
テーブルのエクスポートをリクエストするには
AWS マネジメントコンソール にサインインして DynamoDB コンソール (https://console.aws.amazon.com/dynamodb/) を開きます。
-
コンソールの左側のナビゲーションペインで、[S3 へのエクスポート] を選択します。
-
[S3 にエクスポート] ボタンを選択します。
-
コピー元テーブルとエクスポート先の S3 バケットを選択します。エクスポート先のバケットがお客様のアカウントによって所有されている場合は、[Browse S3] (S3 を参照) ボタンをクリックしてバケットを検索します。そうでない場合は、s3://bucketname/prefix
format. の形式でバケットの URL を入力します。ここで、prefix は、エクスポート先のバケットを整理するのに役立つオプションのフォルダです。
-
[フルエクスポート] または [増分エクスポート] を選択します。フルエクスポートでは、指定した時点のテーブルのフルテーブルスナップショットが出力されます。増分エクスポートでは、指定したエクスポート期間中にテーブルに加えられた変更が出力されます。出力は、エクスポート期間における項目の最終状態のみを含むように圧縮されます。同じエクスポート期間内に複数の更新があったとしても、項目はエクスポートに 1 回しか表示されません。
- Full export
-
-
テーブルスナップショット全体をエクスポートする時点を選択します。これは PITR ウィンドウ内のどの時点でもかまいません。または、[現在の時刻] を選択して最新のスナップショットをエクスポートすることもできます。
-
[エクスポートされたファイル形式] で、[DynamoDB JSON] と [Amazon Ion] のどちらかを選択します。デフォルトで、テーブルは、ポイントインタイムリカバリウィンドウの復元可能な最新の時点から DynamoDB JSON 形式でエクスポートされ、Amazon S3 キー (SSE S3) を使用して暗号化されます。これらのエクスポート設定は、必要に応じて変更できます。
AWS Key Management Service (AWS KMS) によって保護されたキーを使用してエクスポートを暗号化することを選択した場合、そのキーはエクスポート先 S3 バケットと同じリージョンにある必要があります。
- Incremental export
-
-
増分データをエクスポートする [エクスポート期間] を選択します。PITR ウィンドウ内で開始時刻を選択します。エクスポート期間は 15 分~24 時間に設定する必要があります。エクスポート期間の開始時刻は期間に含まれ、終了時刻は期間に含まれません。
-
[絶対モード] または [相対モード] を選択します。
-
[絶対モード] では、指定した期間の増分データがエクスポートされます。
-
[相対モード] では、エクスポートジョブの送信時間を基準にしたエクスポート期間の差分データがエクスポートされます。
-
[エクスポートされたファイル形式] で、[DynamoDB JSON] と [Amazon Ion] のどちらかを選択します。デフォルトで、テーブルは、ポイントインタイムリカバリウィンドウの復元可能な最新の時点から DynamoDB JSON 形式でエクスポートされ、Amazon S3 キー (SSE S3) を使用して暗号化されます。これらのエクスポート設定は、必要に応じて変更できます。
AWS Key Management Service (AWS KMS) によって保護されたキーを使用してエクスポートを暗号化することを選択した場合、そのキーはエクスポート先 S3 バケットと同じリージョンにある必要があります。
-
[エクスポートビュータイプ] では、[新旧イメージ] または [新しいイメージのみ] を選択します。新しいイメージには、項目の最新の状態が表示されます。古いイメージには、指定した「開始日時」の直前の項目の状態が表示されます。デフォルト設定は [新旧イメージ] です。新旧イメージの詳細については、「増分エクスポート出力」を参照してください。
-
[エクスポート] を選択して開始します。
エクスポートされたデータは、トランザクションとして一貫しません。トランザクションオペレーションは、2 つのエクスポート出力間で分断される可能性があります。トランザクションオペレーションで変更された項目のサブセットはエクスポートに反映される一方で、同じトランザクションで変更された別のサブセットは同じエクスポートリクエストに反映されない場合があります。ただし、最終的にエクスポートの一貫性は保たれます。エクスポート中にトランザクションが分断された場合、残りのトランザクションは直後のエクスポートに (重複することなく) 含まれます。エクスポートに使用される時間は内部システムクロックに基づいており、変動する可能性はアプリケーションのローカルクロックの 1 分のみです。
AWS マネジメントコンソール で過去のエクスポートの詳細を取得する
過去に実行したエクスポートタスクに関する情報は、ナビゲーションサイドバーで [S3 へのエクスポート] セクションを選択して確認できます。このセクションには、過去 90 日間に作成したエクスポートの一覧が表示されます。[エクスポート] タブにリストされているタスクの ARN を選択すると、エクスポートに関する情報 (選択した詳細設定など) を取得できます。エクスポートタスクのメタデータは 90 日後に期限切れになり、それより古いジョブはこのリストに表示されなくなりますが、S3 バケット内のオブジェクトは、バケットポリシーで許可されている限り維持されます。エクスポート中に S3 バケットに作成されたオブジェクトが DynamoDB によって削除されることはありません。
AWS CLI および AWS SDK を使用してエクスポートをリクエストする
以下の例は、既存のテーブルを S3 バケットにエクスポートする方法を示しています。
この手順は、ポイントインタイムリカバリを有効にしていることを前提としています。この機能を MusicCollection テーブルに対して有効にするには、次のコマンドを実行します。
aws dynamodb update-continuous-backups \
--table-name MusicCollection \
--point-in-time-recovery-specification PointInTimeRecoveryEnabled=True
フルエクスポート
- AWS CLI
-
クロスアカウントテーブルのエクスポートをリクエストする場合は、必ず --s3-bucket-owner オプションを含めます。
aws dynamodb export-table-to-point-in-time \
--table-arn arn:aws:dynamodb:us-west-2:111122223333: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
- Python
-
import boto3
from datetime import datetime
client = boto3.client('dynamodb')
client.export_table_to_point_in_time(
TableArn='arn:aws:dynamodb:us-east-1:111122223333:table/TABLE',
ExportTime=datetime(2023, 9, 20, 12, 0, 0),
S3Bucket='bucket',
S3Prefix='prefix',
S3SseAlgorithm='AES256',
ExportFormat='DYNAMODB_JSON'
)
- Java
-
DynamoDbClient client = DynamoDbClient.create();
client.exportTableToPointInTime(b -> b
.tableArn("arn:aws:dynamodb:us-east-1:111122223333:table/TABLE")
.exportTime(Instant.parse("2023-09-20T12:00:00Z"))
.s3Bucket("bucket")
.s3Prefix("prefix")
.s3SseAlgorithm(S3SseAlgorithm.AES256)
.exportFormat(ExportFormat.DYNAMODB_JSON));
- .NET
-
var client = new AmazonDynamoDBClient();
await client.ExportTableToPointInTimeAsync(new ExportTableToPointInTimeRequest
{
TableArn = "arn:aws:dynamodb:us-east-1:111122223333:table/TABLE",
ExportTime = new DateTime(2023, 9, 20, 12, 0, 0, DateTimeKind.Utc),
S3Bucket = "bucket",
S3Prefix = "prefix",
S3SseAlgorithm = S3SseAlgorithm.AES256,
ExportFormat = ExportFormat.DYNAMODB_JSON
});
- JavaScript
-
import { DynamoDBClient, ExportTableToPointInTimeCommand } from "@aws-sdk/client-dynamodb";
const client = new DynamoDBClient();
await client.send(new ExportTableToPointInTimeCommand({
TableArn: "arn:aws:dynamodb:us-east-1:111122223333:table/TABLE",
ExportTime: new Date("2023-09-20T12:00:00Z"),
S3Bucket: "bucket",
S3Prefix: "prefix",
S3SseAlgorithm: "AES256",
ExportFormat: "DYNAMODB_JSON"
}));
- Go
-
cfg, _ := config.LoadDefaultConfig(context.TODO())
client := dynamodb.NewFromConfig(cfg)
exportTime := time.Date(2023, 9, 20, 12, 0, 0, 0, time.UTC)
client.ExportTableToPointInTime(context.TODO(), &dynamodb.ExportTableToPointInTimeInput{
TableArn: aws.String("arn:aws:dynamodb:us-east-1:111122223333:table/TABLE"),
ExportTime: &exportTime,
S3Bucket: aws.String("bucket"),
S3Prefix: aws.String("prefix"),
S3SseAlgorithm: types.S3SseAlgorithmAes256,
ExportFormat: types.ExportFormatDynamodbJson,
})
増分エクスポート
- AWS CLI
-
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
- Python
-
import boto3
from datetime import datetime
client = boto3.client('dynamodb')
client.export_table_to_point_in_time(
TableArn='arn:aws:dynamodb:us-east-1:111122223333: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'
)
- Java
-
DynamoDbClient client = DynamoDbClient.create();
client.exportTableToPointInTime(b -> b
.tableArn("arn:aws:dynamodb:us-east-1:111122223333:table/TABLE")
.exportType(ExportType.INCREMENTAL_EXPORT)
.incrementalExportSpecification(i -> i
.exportFromTime(Instant.parse("2023-09-20T12:00:00Z"))
.exportToTime(Instant.parse("2023-09-20T13:00:00Z"))
.exportViewType(ExportViewType.NEW_AND_OLD_IMAGES))
.s3Bucket("bucket")
.s3Prefix("prefix")
.s3SseAlgorithm(S3SseAlgorithm.AES256)
.exportFormat(ExportFormat.DYNAMODB_JSON));
- .NET
-
var client = new AmazonDynamoDBClient();
await client.ExportTableToPointInTimeAsync(new ExportTableToPointInTimeRequest
{
TableArn = "arn:aws:dynamodb:us-east-1:111122223333:table/TABLE",
ExportType = ExportType.INCREMENTAL_EXPORT,
IncrementalExportSpecification = new IncrementalExportSpecification
{
ExportFromTime = new DateTime(2023, 9, 20, 12, 0, 0, DateTimeKind.Utc),
ExportToTime = new DateTime(2023, 9, 20, 13, 0, 0, DateTimeKind.Utc),
ExportViewType = ExportViewType.NEW_AND_OLD_IMAGES
},
S3Bucket = "bucket",
S3Prefix = "prefix",
S3SseAlgorithm = S3SseAlgorithm.AES256,
ExportFormat = ExportFormat.DYNAMODB_JSON
});
- JavaScript
-
import { DynamoDBClient, ExportTableToPointInTimeCommand } from "@aws-sdk/client-dynamodb";
const client = new DynamoDBClient();
await client.send(new ExportTableToPointInTimeCommand({
TableArn: "arn:aws:dynamodb:us-east-1:111122223333:table/TABLE",
ExportType: "INCREMENTAL_EXPORT",
IncrementalExportSpecification: {
ExportFromTime: new Date("2023-09-20T12:00:00Z"),
ExportToTime: new Date("2023-09-20T13:00:00Z"),
ExportViewType: "NEW_AND_OLD_IMAGES"
},
S3Bucket: "bucket",
S3Prefix: "prefix",
S3SseAlgorithm: "AES256",
ExportFormat: "DYNAMODB_JSON"
}));
- Go
-
cfg, _ := config.LoadDefaultConfig(context.TODO())
client := dynamodb.NewFromConfig(cfg)
fromTime := time.Date(2023, 9, 20, 12, 0, 0, 0, time.UTC)
toTime := time.Date(2023, 9, 20, 13, 0, 0, 0, time.UTC)
client.ExportTableToPointInTime(context.TODO(), &dynamodb.ExportTableToPointInTimeInput{
TableArn: aws.String("arn:aws:dynamodb:us-east-1:111122223333:table/TABLE"),
ExportType: types.ExportTypeIncrementalExport,
IncrementalExportSpecification: &types.IncrementalExportSpecification{
ExportFromTime: &fromTime,
ExportToTime: &toTime,
ExportViewType: types.ExportViewTypeNewAndOldImages,
},
S3Bucket: aws.String("bucket"),
S3Prefix: aws.String("prefix"),
S3SseAlgorithm: types.S3SseAlgorithmAes256,
ExportFormat: types.ExportFormatDynamodbJson,
})
AWS Key Management Service (AWS KMS) によって保護されたキーを使用してエクスポートを暗号化することを選択した場合、そのキーはエクスポート先 S3 バケットと同じリージョンにある必要があります。
AWS CLI および AWS SDK を使用して過去のエクスポートの詳細を取得する
過去に実行したエクスポートリクエストに関する情報は、list-exports コマンドを実行して見つけることができます。このコマンドは、過去 90 日間に作成されたすべてのエクスポートのリストを返します。エクスポートタスクのメタデータは 90 日後に期限切れになり、それより古いジョブは list-exports コマンドによって返されなくなりますが、S3 バケット内のオブジェクトは、バケットポリシーで許可されている限り維持されます。エクスポート中に S3 バケットに作成されたオブジェクトが DynamoDB によって削除されることはありません。
エクスポートのステータスは、成功または失敗するまで PENDING となります。成功すると、ステータスは COMPLETED に変わります。失敗すると、ステータスは FAILED に変わり、failure_message と failure_reason が追加されます。
エクスポートを一覧表示する
- AWS CLI
-
aws dynamodb list-exports \
--table-arn arn:aws:dynamodb:us-east-1:111122223333:table/ProductCatalog
- Python
-
import boto3
client = boto3.client('dynamodb')
print(
client.list_exports(
TableArn='arn:aws:dynamodb:us-east-1:111122223333:table/TABLE',
)
)
- Java
-
DynamoDbClient client = DynamoDbClient.create();
ListExportsResponse response = client.listExports(b -> b
.tableArn("arn:aws:dynamodb:us-east-1:111122223333:table/TABLE"));
response.exportSummaries().forEach(System.out::println);
- .NET
-
var client = new AmazonDynamoDBClient();
var response = await client.ListExportsAsync(new ListExportsRequest
{
TableArn = "arn:aws:dynamodb:us-east-1:111122223333:table/TABLE"
});
response.ExportSummaries.ForEach(Console.WriteLine);
- JavaScript
-
import { DynamoDBClient, ListExportsCommand } from "@aws-sdk/client-dynamodb";
const client = new DynamoDBClient();
const response = await client.send(new ListExportsCommand({
TableArn: "arn:aws:dynamodb:us-east-1:111122223333:table/TABLE"
}));
console.log(response.ExportSummaries);
- Go
-
cfg, _ := config.LoadDefaultConfig(context.TODO())
client := dynamodb.NewFromConfig(cfg)
response, _ := client.ListExports(context.TODO(), &dynamodb.ListExportsInput{
TableArn: aws.String("arn:aws:dynamodb:us-east-1:111122223333:table/TABLE"),
})
fmt.Println(response.ExportSummaries)
エクスポートを記述する
- AWS CLI
-
aws dynamodb describe-export \
--export-arn arn:aws:dynamodb:us-east-1:111122223333:table/ProductCatalog/export/01695353076000-a1b2c3d4
- Python
-
import boto3
client = boto3.client('dynamodb')
print(
client.describe_export(
ExportArn='arn:aws:dynamodb:us-east-1:111122223333:table/TABLE/export/01695353076000-06e2188f',
)['ExportDescription']
)
- Java
-
DynamoDbClient client = DynamoDbClient.create();
DescribeExportResponse response = client.describeExport(b -> b
.exportArn("arn:aws:dynamodb:us-east-1:111122223333:table/TABLE/export/01695353076000-06e2188f"));
System.out.println(response.exportDescription());
- .NET
-
var client = new AmazonDynamoDBClient();
var response = await client.DescribeExportAsync(new DescribeExportRequest
{
ExportArn = "arn:aws:dynamodb:us-east-1:111122223333:table/TABLE/export/01695353076000-06e2188f"
});
Console.WriteLine(response.ExportDescription);
- JavaScript
-
import { DynamoDBClient, DescribeExportCommand } from "@aws-sdk/client-dynamodb";
const client = new DynamoDBClient();
const response = await client.send(new DescribeExportCommand({
ExportArn: "arn:aws:dynamodb:us-east-1:111122223333:table/TABLE/export/01695353076000-06e2188f"
}));
console.log(response.ExportDescription);
- Go
-
cfg, _ := config.LoadDefaultConfig(context.TODO())
client := dynamodb.NewFromConfig(cfg)
response, _ := client.DescribeExport(context.TODO(), &dynamodb.DescribeExportInput{
ExportArn: aws.String("arn:aws:dynamodb:us-east-1:111122223333:table/TABLE/export/01695353076000-06e2188f"),
})
fmt.Println(response.ExportDescription)