DynamoDB のエクスポート — Point in time recovery is not enabled
TL;DR — Amazon S3 へのエクスポート(ExportTableToPointInTime)には、ソーステーブルでポイントインタイムリカバリ(PITR)が必要です。PITR がオフだと PointInTimeRecoveryUnavailableException: Point in time recovery is not enabled for table '<name>' が返ります。PITR を有効にし、ENABLED と報告されることを確認してから、エクスポートを要求してください。
意味
An error occurred (PointInTimeRecoveryUnavailableException) when calling the
ExportTableToPointInTime operation: Point in time recovery is not enabled for
table 'my-dynamodb-table'DynamoDB のフル/増分の S3 へのエクスポート 機能は、ライブテーブルのキャパシティではなく、テーブルの PITR 継続的バックアップから読み取ります。だから RCU を一切消費せず、リカバリウィンドウ内の任意の時点のテーブル状態をエクスポートできるのです — ただし動作するのは PITR が有効なときだけ。PITR なし、エクスポートなしです。
発生する理由
- そのテーブルで PITR を一度も有効にしていない — 新しいテーブルでは
PointInTimeRecoveryStatusは既定でDISABLEDです。 - テーブルやリージョンが違う — エクスポートの
TableArnが、PITR を設定していないテーブル(または別リージョンのレプリカ)を指しています。 - 似ているが別のエラー — PITR ウィンドウ外の
ExportTimeは、この例外を発生させません。InvalidExportTimeExceptionで失敗します。ウィンドウは設定したリカバリ期間(RecoveryPeriodInDays、1〜35日)をカバーし、PITR を有効にした瞬間より前には決して遡れません。
修正方法
- ソーステーブルで PITR を有効にします —
UpdateContinuousBackupsにPointInTimeRecoveryEnabled: trueを指定するか、コンソールの Backups で切り替えます。 - PITR がオンであることを確認します —
DescribeContinuousBackupsがPointInTimeRecoveryStatus: ENABLEDを報告するはずです。(PITR がオフでも常にENABLEDになるContinuousBackupsStatusと混同しないでください。)その瞬間以降、ウィンドウ内の任意の時点をエクスポートできます。 ExportTimeをウィンドウ内に保ちます — 設定したリカバリ期間(最大35日)以内で、かつ PITR を有効にした瞬間以降にします。ウィンドウ外だとInvalidExportTimeExceptionになります。省略すると現在時点をエクスポートします。- IAM 権限を確認します — 呼び出し元には
dynamodb:ExportTableToPointInTimeに加えて、宛先バケットに対するs3:PutObject、s3:PutObjectAcl、s3:AbortMultipartUploadが必要です。 - エクスポートリクエストで正しいテーブル ARN とリージョンを指定します。
S3 に実際に何が届いたかを確認したいですか? DynoTable デスクトップアプリはソーステーブルを閲覧し、同じアイテムを CSV、JSON、NDJSON としてエクスポートできるので、S3 のオブジェクトと突き合わせる材料が手に入ります。
再現方法
テーブルを作成し、PITR をオフのままにして、エクスポートを要求します。バケットは存在しなくて構いません — PITR のチェックが先に走ります。
import boto3
ddb = boto3.client('dynamodb', region_name='us-east-1')
arn = ddb.describe_table(TableName='my-table')['Table']['TableArn']
ddb.export_table_to_point_in_time(TableArn=arn, S3Bucket='any-bucket-name')実際の出力:
PointInTimeRecoveryUnavailableException: Point in time recovery is not enabled for table 'my-table'
HTTP 400エラー処理に持ち帰る価値のある点が2つあります。SDK の生のメッセージは上の一文だけです — もっと長い An error occurred (PointInTimeRecoveryUnavailableException) when calling the ExportTableToPointInTime operation: … という形は、AWS CLI と botocore のラッパーが文脈を足したものなので、どちらが見えるかは呼び出し方次第です。もう1つ、リクエストは S3 に到達すらしていません。この実行ではバケットが存在しないのに、失敗の内容は PITR についてです。つまりバケット名のタイプミスは、PITR がオンになるまで表面化しません。
関連するエラー
- BackupNotFoundException — 参照したオンデマンドバックアップの ARN が存在しない。
- ResourceNotFoundException — テーブル自体が見つからなかった。
- 学習: DynamoDB のバックアップと PITR
参考資料
- ExportTableToPointInTime — Amazon DynamoDB API Reference
- Requesting a table export in DynamoDB — Amazon DynamoDB Developer Guide
- DynamoDB data export to Amazon S3: how it works — Amazon DynamoDB Developer Guide
- Enable point-in-time recovery in DynamoDB — Amazon DynamoDB Developer Guide
- DescribeContinuousBackups — Amazon DynamoDB API Reference
最終検証日 2026-07-13、上記にリンクした公式 AWS ドキュメントに照らして確認しました。
2026-07-26 に us-east-1 の実稼働 DynamoDB サービスに対し boto3 1.43.56 で再現しました — 上記の出力はそのままの逐語です。