オブジェクトロックを設定しているS3バケットをAWS Backupでバックアップおよびリストアしてみた
オブジェクトロックが設定されていたとしても、全オブジェクトを特定地点の状態にするの大変だな
こんにちは、のんピ(@non____97)です。
皆さんはオブジェクトロックが設定されていたとしても、全オブジェクトを特定地点の状態にするの大変だなと感じたことはありますか? 私はあります。
オブジェクトロックを設定することで、指定した期間オブジェクトの削除を防ぐことが可能です。これによってランサムウェア対策としているケースもあるのではないでしょうか。
一方でオブジェクトロックによって削除を免れたとしても、ランサムウェアによってオブジェクトが上書きされてしまった(正しくは新しいバージョンが作成された)場合、最新バージョンはランサムウェアが上書きしたオブジェクトとなります。
ランサムウェアが作成したオブジェクトであってもオブジェクトロックが効いている以上、そのオブジェクトを削除して、元のオブジェクトバージョンを最新バージョンとすることができません。
つまりはランサムウェアによって侵害される前のバージョンを使用する場合は、以下のような対応が必要です
- 都度オブジェクトバージョンを指定する
- 指定したバージョンの内容でオブジェクトの上書きをして、最新バージョンを変更する
- オブジェクトの任意のバージョンを直接最新バージョンとして扱わせることはできない
いずれも中々に手間です。
こんな時に役立つのがAWS Backup for S3です。
これによりS3バケット内の全オブジェクトもしくは条件に当てはまるプレフィックスを持つオブジェクトに対してまとめて、バックアップが取得された時点に戻すことが可能です。
以下AWS公式ドキュメントを確認しましたが、AWS Backup for S3とオブジェクトロックの相性についての言及はありませんでした。
実際に試してみます。
いきなりまとめ
- AWS Backup for S3によるリストアは原則オブジェクトのリストアであり、バケットの設定を含む全体のリストアではない
- AWS Backup for S3はS3バケット全体を完全に特定時点の状態のものではなく、リストア対象のオブジェクトを指定されたバケットに配置する機能
- リストア先のS3バケットでオブジェクトロックが設定されていなければ、リストアされたオブジェクトはオブジェクトロックは行われていない
- オブジェクトロックの保持期間はS3バケットで設定されたデフォルトの保持期間となる
- バックアップ対象のバケットへリストアする場合、破壊的なリストアを行わない
- バックアップ取得後にオブジェクトの追加が行われていても、追加されたオブジェクトは削除されない
- S3バケット内のオブジェクトを特定時点へ戻したい場合は別バケットへリストアする必要がある
- 別バケットへリストアすることになるため、S3バケットに設定したバケットポリシーやライフサイクルルール等の各種設定を再度設定したり、連携している仕組み側でS3バケットの名前変更の対応を行う必要がある
- 事前にバケット名変更の影響を整理しておこう
やってみた
現在の状態
まず、現在の状態についてです。
以下記事で使用した検証環境をそのまま利用します。
そのままバックアップしても面白くないのでdata/2024/summary.txtにリーガルホールドの設定しています。
また、削除マーカーもバックアップされるそうなので試します。
- 削除マーカーはオブジェクトと同様にバックアップされます。オブジェクトと削除マーカーの比率によっては、バックアップ時間と復元時間が影響を受ける可能性があります。
- バックアップされるオブジェクトとマーカーにはそれぞれ最低料金が適用されます。各削除マーカーには 128 KiB のオブジェクトと同じ料金がかかります。

各オブジェクトバージョンのオブジェクトロック周りの状態は以下のとおりです。
> aws s3api list-object-versions --bucket non-97-object-lock \
--query 'Versions[].[Key,VersionId]' --output text | while read key version; do
echo "=== $key (Version: $version) ==="
aws s3api head-object \
--bucket non-97-object-lock \
--key "$key" \
--version-id "$version" \
--query '{ObjectLockMode: ObjectLockMode, RetainUntilDate: ObjectLockRetainUntilDate, LegalHold: ObjectLockLegalHoldStatus}' \
--output json
echo ""
done
=== config/production/prod-config.json (Version: null) ===
{
"ObjectLockMode": null,
"RetainUntilDate": null,
"LegalHold": null
}
=== config/staging/stage-config.json (Version: null) ===
{
"ObjectLockMode": null,
"RetainUntilDate": null,
"LegalHold": null
}
=== data/2024/february/report-02.txt (Version: null) ===
{
"ObjectLockMode": "COMPLIANCE",
"RetainUntilDate": "2026-01-15T15:00:00+00:00",
"LegalHold": null
}
=== data/2024/january/report-01.txt (Version: null) ===
{
"ObjectLockMode": "COMPLIANCE",
"RetainUntilDate": "2026-01-15T15:00:00+00:00",
"LegalHold": null
}
=== data/2024/summary.txt (Version: null) ===
{
"ObjectLockMode": "COMPLIANCE",
"RetainUntilDate": "2026-01-15T15:00:00+00:00",
"LegalHold": "ON"
}
=== data/2024/summary2.txt (Version: Q41P7th1GpZ2GxdBqVA9xAPM8aYZidAi) ===
{
"ObjectLockMode": "COMPLIANCE",
"RetainUntilDate": "2026-01-17T01:04:45.356000+00:00",
"LegalHold": null
}
=== data/2025/january/report-03.txt (Version: null) ===
{
"ObjectLockMode": null,
"RetainUntilDate": null,
"LegalHold": null
}
=== data/2025/summary.txt (Version: null) ===
{
"ObjectLockMode": null,
"RetainUntilDate": null,
"LegalHold": null
}
=== job-b898a339-f5c0-41d3-bb1d-a32eeb79915c/manifest.json (Version: 5qADfGU5RR0UTUU.eDk.bchOiMyhtNVq) ===
{
"ObjectLockMode": "COMPLIANCE",
"RetainUntilDate": "2026-01-15T02:38:13.967000+00:00",
"LegalHold": null
}
=== job-b898a339-f5c0-41d3-bb1d-a32eeb79915c/manifest.json (Version: 7M9TKny3oOj8iPBnioDdiCBW1r4LFleF) ===
{
"ObjectLockMode": "COMPLIANCE",
"RetainUntilDate": "2026-01-15T02:23:30.916000+00:00",
"LegalHold": null
}
=== job-b898a339-f5c0-41d3-bb1d-a32eeb79915c/manifest.json.md5 (Version: QR_xQtLKS3LheIHqdvEOrUYT2juRH_3A) ===
{
"ObjectLockMode": "COMPLIANCE",
"RetainUntilDate": "2026-01-15T02:38:13.945000+00:00",
"LegalHold": null
}
=== job-b898a339-f5c0-41d3-bb1d-a32eeb79915c/results/9163512a65070cf0c92d15ddb6da15d730bd9161.csv (Version: _HSKP1ZsZDxlGzwgZYQtFhucTsk.hwQt) ===
{
"ObjectLockMode": "COMPLIANCE",
"RetainUntilDate": "2026-01-15T02:38:13.865000+00:00",
"LegalHold": null
}
=== logs/application/app-2024.log (Version: null) ===
{
"ObjectLockMode": null,
"RetainUntilDate": null,
"LegalHold": null
}
=== logs/application/app-2025.log (Version: null) ===
{
"ObjectLockMode": null,
"RetainUntilDate": null,
"LegalHold": null
}
=== logs/system/sys-2025.log (Version: null) ===
{
"ObjectLockMode": null,
"RetainUntilDate": null,
"LegalHold": null
}
=== non-97-object-lock/b898a339-f5c0-41d3-bb1d-a32eeb79915c/2026-01-14T02-23Z/ (Version: 4sShTgeuHwtB04_5WnnVrzXxqfDF1syA) ===
{
"ObjectLockMode": "COMPLIANCE",
"RetainUntilDate": "2026-01-15T02:23:24.188000+00:00",
"LegalHold": null
}
=== non-97-object-lock/b898a339-f5c0-41d3-bb1d-a32eeb79915c/2026-01-14T02-23Z/manifest.checksum (Version: fSxiLJYpvwgQnGaP1K8sGdS5R5nrMQYV) ===
{
"ObjectLockMode": "COMPLIANCE",
"RetainUntilDate": "2026-01-15T02:23:27.608000+00:00",
"LegalHold": null
}
=== non-97-object-lock/b898a339-f5c0-41d3-bb1d-a32eeb79915c/2026-01-14T02-23Z/manifest.json (Version: L15AaEq5pPGRFlVHYLBBt3X1JffAqJf8) ===
{
"ObjectLockMode": "COMPLIANCE",
"RetainUntilDate": "2026-01-15T02:23:27.670000+00:00",
"LegalHold": null
}
=== non-97-object-lock/b898a339-f5c0-41d3-bb1d-a32eeb79915c/data/00ab6e92-7bc6-472a-b55c-380f5eedf983.csv.gz (Version: KfM72CKc7Ba4lv5zz1vGRzww4gKxM8Hm) ===
{
"ObjectLockMode": "COMPLIANCE",
"RetainUntilDate": "2026-01-15T02:23:26.454000+00:00",
"LegalHold": null
}
=== non-97-object-lock/b898a339-f5c0-41d3-bb1d-a32eeb79915c/hive/dt=2026-01-14-02-23/symlink.txt (Version: 27AiQR7QurrqYvU7i2d7wrqM45I0ONud) ===
{
"ObjectLockMode": "COMPLIANCE",
"RetainUntilDate": "2026-01-15T02:23:27.648000+00:00",
"LegalHold": null
}
AWS Backupの設定
それではAWS Backupの設定を行います。
バックアッププランを作成します。PITRで保持期間2日で日次でバックアップを取得するようにしています。

バックアップインデックスについては以下記事をご覧ください。
リソースの割り当てでS3バケットを指定します。

IAMロールはデフォルトのロールを割り当てていますが、このままではYour backup job failed as AWS Backup does not have permission to describe resource arn:aws:s3:::non-97-object-lock. Please review your IAM policies to ensure AWS Backup can protect your resources.とバックアップに失敗します。

これはデフォルトのIAMロールにAWSBackupServiceRolePolicyForS3Backupが付与されていないためです。

以下記事で紹介されているとおり、AWSBackupServiceRolePolicyForS3BackupとAWSBackupServiceRolePolicyForS3Restoreをアタッチします。
バックアップが作成されたことを確認
それではバックアップが作成されたことを確認します。
しばらく待つとバックアップジョブが作成され、ステータスが作成済みになっていました。

さらに待つとバックアップジョブが開始され、完了となっていました。

オブジェクトの追記
オブジェクトの追記をします。summary2.txtを何回か追記をします。

各オブジェクトバージョンごとのオブジェクトロック周りの情報は以下のとおりです。
> aws s3api list-object-versions \
--bucket non-97-object-lock \
--query 'Versions[].[Key,VersionId]' --output text | {
header_printed=false
while read key version; do
if [ "$header_printed" = false ]; then
printf "%-100s %-35s %-15s %-35s %-15s\n" "KEY" "VERSION" "LOCK_MODE" "RETAIN_UNTIL" "LEGAL_HOLD"
printf "%-100s %-35s %-15s %-35s %-15s\n" "---" "-------" "---------" "------------" "----------"
header_printed=true
fi
result=$(aws s3api head-object \
--bucket non-97-object-lock \
--key "$key" \
--version-id "$version" \
--query '{Mode: ObjectLockMode, Retain: ObjectLockRetainUntilDate, Legal: ObjectLockLegalHoldStatus}' \
--output json 2>/dev/null)
mode=$(echo "$result" | jq -r '.Mode // "None"')
retain=$(echo "$result" | jq -r '.Retain // "None"')
legal=$(echo "$result" | jq -r '.Legal // "None"')
printf "%-100s %-35s %-15s %-35s %-15s\n" "$key" "$version" "$mode" "$retain" "$legal"
done
}
KEY VERSION LOCK_MODE RETAIN_UNTIL LEGAL_HOLD
--- ------- --------- ------------ ----------
config/production/prod-config.json null None None None
config/staging/stage-config.json null None None None
data/2024/february/report-02.txt null COMPLIANCE 2026-01-15T15:00:00+00:00 None
data/2024/january/report-01.txt null COMPLIANCE 2026-01-15T15:00:00+00:00 None
data/2024/summary.txt null COMPLIANCE 2026-01-15T15:00:00+00:00 ON
data/2024/summary2.txt 5aSkx1cElivJJZXj_VOGw54fbtblLf6C COMPLIANCE 2026-01-17T04:33:01.117000+00:00 None
data/2024/summary2.txt mjoczowWcETnSEG.Md19OUUv2XVZvWZi COMPLIANCE 2026-01-17T04:32:42.577000+00:00 None
data/2024/summary2.txt N3EFZslZhCvJ7AJ7EmwENKh6RrETXRgY COMPLIANCE 2026-01-17T04:32:24.902000+00:00 None
data/2024/summary2.txt Q41P7th1GpZ2GxdBqVA9xAPM8aYZidAi COMPLIANCE 2026-01-17T01:04:45.356000+00:00 None
data/2025/january/report-03.txt null None None None
data/2025/summary.txt null None None None
job-b898a339-f5c0-41d3-bb1d-a32eeb79915c/manifest.json 5qADfGU5RR0UTUU.eDk.bchOiMyhtNVq COMPLIANCE 2026-01-15T02:38:13.967000+00:00 None
job-b898a339-f5c0-41d3-bb1d-a32eeb79915c/manifest.json 7M9TKny3oOj8iPBnioDdiCBW1r4LFleF COMPLIANCE 2026-01-15T02:23:30.916000+00:00 None
job-b898a339-f5c0-41d3-bb1d-a32eeb79915c/manifest.json.md5 QR_xQtLKS3LheIHqdvEOrUYT2juRH_3A COMPLIANCE 2026-01-15T02:38:13.945000+00:00 None
job-b898a339-f5c0-41d3-bb1d-a32eeb79915c/results/9163512a65070cf0c92d15ddb6da15d730bd9161.csv _HSKP1ZsZDxlGzwgZYQtFhucTsk.hwQt COMPLIANCE 2026-01-15T02:38:13.865000+00:00 None
logs/application/app-2024.log null None None None
logs/application/app-2025.log null None None None
logs/system/sys-2025.log null None None None
non-97-object-lock/b898a339-f5c0-41d3-bb1d-a32eeb79915c/2026-01-14T02-23Z/ 4sShTgeuHwtB04_5WnnVrzXxqfDF1syA COMPLIANCE 2026-01-15T02:23:24.188000+00:00 None
non-97-object-lock/b898a339-f5c0-41d3-bb1d-a32eeb79915c/2026-01-14T02-23Z/manifest.checksum fSxiLJYpvwgQnGaP1K8sGdS5R5nrMQYV COMPLIANCE 2026-01-15T02:23:27.608000+00:00 None
non-97-object-lock/b898a339-f5c0-41d3-bb1d-a32eeb79915c/2026-01-14T02-23Z/manifest.json L15AaEq5pPGRFlVHYLBBt3X1JffAqJf8 COMPLIANCE 2026-01-15T02:23:27.670000+00:00 None
non-97-object-lock/b898a339-f5c0-41d3-bb1d-a32eeb79915c/data/00ab6e92-7bc6-472a-b55c-380f5eedf983.csv.gz KfM72CKc7Ba4lv5zz1vGRzww4gKxM8Hm COMPLIANCE 2026-01-15T02:23:26.454000+00:00 None
non-97-object-lock/b898a339-f5c0-41d3-bb1d-a32eeb79915c/hive/dt=2026-01-14-02-23/symlink.txt 27AiQR7QurrqYvU7i2d7wrqM45I0ONud COMPLIANCE 2026-01-15T02:23:27.648000+00:00 None
別バケットにリストア
この状態でリストアします。
まずは別バケットへのリストアです。
復旧ポイントは以下です。

最も古いバックアップでバケット全体を復元します。PITRなので1秒単位で指定できるのが良いですね。

復元するバージョンのプルダウンメニューや項目レベルの復元を選択した場合の画面は以下のとおりです。


10分弱でリストアが完了しました。

リストア先のS3バケットにてオブジェクト一覧をtree構造で確認すると、以下のようにリストアされていることを確認しました。
$ s3-tree non-97-object-lock-restore
non-97-object-lock-restore
├── config
│ ├── production
│ │ └── prod-config.json
│ └── staging
│ └── stage-config.json
├── data
│ ├── 2024
│ │ ├── february
│ │ │ └── report-02.txt
│ │ ├── summary2.txt
│ │ └── summary.txt
│ └── 2025
│ ├── january
│ │ └── report-03.txt
│ └── summary.txt
├── job-b898a339-f5c0-41d3-bb1d-a32eeb79915c
│ ├── manifest.json
│ ├── manifest.json.md5
│ └── results
│ └── 9163512a65070cf0c92d15ddb6da15d730bd9161.csv
├── logs
│ ├── application
│ │ ├── app-2024.log
│ │ └── app-2025.log
│ └── system
│ └── sys-2025.log
└── non-97-object-lock
└── b898a339-f5c0-41d3-bb1d-a32eeb79915c
├── 2026-01-14T02-23Z
│ ├── manifest.checksum
│ └── manifest.json
├── data
│ └── 00ab6e92-7bc6-472a-b55c-380f5eedf983.csv.gz
└── hive
└── dt=2026-01-14-02-23
└── symlink.txt
19 directories, 17 files
各オブジェクトのバージョンごとのオブジェクトロック周りの情報は以下のとおりです。
> aws s3api list-object-versions \
--bucket non-97-object-lock-restore \
--query 'Versions[].[Key,VersionId]' --output text | {
header_printed=false
while read key version; do
if [ "$header_printed" = false ]; then
printf "%-100s %-35s %-15s %-35s %-15s\n" "KEY" "VERSION" "LOCK_MODE" "RETAIN_UNTIL" "LEGAL_HOLD"
printf "%-100s %-35s %-15s %-35s %-15s\n" "---" "-------" "---------" "------------" "----------"
header_printed=true
fi
result=$(aws s3api head-object \
--bucket non-97-object-lock \
--key "$key" \
--version-id "$version" \
--query '{Mode: ObjectLockMode, Retain: ObjectLockRetainUntilDate, Legal: ObjectLockLegalHoldStatus}' \
--output json 2>/dev/null)
mode=$(echo "$result" | jq -r '.Mode // "None"')
retain=$(echo "$result" | jq -r '.Retain // "None"')
legal=$(echo "$result" | jq -r '.Legal // "None"')
printf "%-100s %-35s %-15s %-35s %-15s\n" "$key" "$version" "$mode" "$retain" "$legal"
done
}
KEY VERSION LOCK_MODE RETAIN_UNTIL LEGAL_HOLD
--- ------- --------- ------------ ----------
config/production/prod-config.json ZHOgSUQFgFe4K5edhnpIaja7ZZIjTevr
config/staging/stage-config.json dVKEemL.fzKy184WXp3gIzYbVw9PstHy
data/2024/february/report-02.txt SZuqOVfhpNTpjxsx0YMAMTXyPlKVc39d
data/2024/january/report-01.txt rwpqKvktNq9J6.kyffTgpOnTSZI0N9Hw
data/2024/summary.txt zBQfI2ZxZZYlDLrq6Qgjt_hrNwxba_26
data/2024/summary2.txt S.ME1WvxvQEphCazQilBTwMYT.bK2mwt
data/2025/january/report-03.txt uaSEw6YJb2eWVUVgWyJaV5sKCLcC.RMY
data/2025/summary.txt GrBeKpa.8C.CrwVQId.XmRy4pFwvwV.3
job-b898a339-f5c0-41d3-bb1d-a32eeb79915c/manifest.json DY232sZgskuOFsMrqHUTKRzrgClQqiZC
job-b898a339-f5c0-41d3-bb1d-a32eeb79915c/manifest.json pnGGQVLVRbhJFxCO8m4EJTvvtdzehMYU
job-b898a339-f5c0-41d3-bb1d-a32eeb79915c/manifest.json.md5 0hnrUa76qgdhB2bEW_1n1wKPxbrEbjSU
job-b898a339-f5c0-41d3-bb1d-a32eeb79915c/results/9163512a65070cf0c92d15ddb6da15d730bd9161.csv D86QFhcoaXX7zQhwNfd1_BSwf72B8GON
logs/application/app-2024.log BsA0SJCeMEQ4UDvnK.B8Qpvipz4tb96r
logs/application/app-2025.log oVGaBWml5GMdmHeQASH0l2vuhYQe.xnl
logs/system/sys-2025.log jRVn5FN_lrjKE3qjY8L6Ov_UtIyGBPGB
non-97-object-lock/b898a339-f5c0-41d3-bb1d-a32eeb79915c/2026-01-14T02-23Z/ Me32D3r_SHL3b11V0v4OwZj.JijC.uVv
non-97-object-lock/b898a339-f5c0-41d3-bb1d-a32eeb79915c/2026-01-14T02-23Z/manifest.checksum Q4mwnR4NLV5dIzjt3gVWpojaKtdbEKA8
non-97-object-lock/b898a339-f5c0-41d3-bb1d-a32eeb79915c/2026-01-14T02-23Z/manifest.json HvsWzpY684rBBB2dmMCmRRoqSev2nyMy
non-97-object-lock/b898a339-f5c0-41d3-bb1d-a32eeb79915c/data/00ab6e92-7bc6-472a-b55c-380f5eedf983.csv.gz muyQozE3cpEaWtXerYPzgjI15IWtaKxk
non-97-object-lock/b898a339-f5c0-41d3-bb1d-a32eeb79915c/hive/dt=2026-01-14-02-23/symlink.txt ZHPttfjJVnyGJZNiqASGrr9dX9uB.LF2
はい、オブジェクトロックは設定されていません。バージョンIDも異なります。
これはリストア先のS3バケットでオブジェクトロックが設定されていないためです。AWS Backup for S3はあくまでオブジェクトのリストアであり、バケットの設定自体のリストアは行われないためです。
つまりはAWS Backup for S3はS3バケット全体を完全に特定時点の状態のものではなく、リストア対象のオブジェクトを指定されたバケットに配置する機能になります。
なお、削除マーカーも正常にリストアされていました。

バックアップインデックスを用いた検索
バックアップ対象のバケットへリストアする前にバックアップインデックスを用いた検索を試してみます。
復旧ポイントを選択して検索を行います。今回はオブジェクトキーにsummaryを含むものにしました。

検索で使用できるプロパティは以下のとおりです。
- オブジェクトキー
- バージョン
- eTag
- ファイルサイズ
- オブジェクトの作成時刻

検索を行うと、以下のようにマッチしたオブジェクトを確認できました。

詳細を表示をクリックすると以下のようになります。

リストアップされたものを全て選択をして、復元をクリックすると以下のように項目レベルの復元をするような画面になりました。

バックアップ対象のバケットへリストア
それではバックアップ対象のバケットへリストアします。復元先でソースバケットへの復元を選択した以外他と変わりはありません。

はい、リストアジョブが走り始めるとCannot restore, as the BucketOwnershipControls of non-97-object-lock do not allow the use of object ACLs.とエラーになりました。
これは以下記事で紹介されているとおり、リストア先のS3バケットでACLが設定されていないがために発生するエラーです。

対応として、ACL が復元されますのチェックを外してリストアします。

10分弱でリストアが完了しました。

リストア後のオブジェクトのオブジェクトロックの状態を確認します。
> aws s3api list-object-versions \
--bucket non-97-object-lock \
--query 'Versions[].[Key,VersionId]' --output text | {
header_printed=false
while read key version; do
if [ "$header_printed" = false ]; then
printf "%-100s %-35s %-15s %-35s %-15s\n" "KEY" "VERSION" "LOCK_MODE" "RETAIN_UNTIL" "LEGAL_HOLD"
printf "%-100s %-35s %-15s %-35s %-15s\n" "---" "-------" "---------" "------------" "----------"
header_printed=true
fi
result=$(aws s3api head-object \
--bucket non-97-object-lock \
--key "$key" \
--version-id "$version" \
--query '{Mode: ObjectLockMode, Retain: ObjectLockRetainUntilDate, Legal: ObjectLockLegalHoldStatus}' \
--output json 2>/dev/null)
mode=$(echo "$result" | jq -r '.Mode // "None"')
retain=$(echo "$result" | jq -r '.Retain // "None"')
legal=$(echo "$result" | jq -r '.Legal // "None"')
printf "%-100s %-35s %-15s %-35s %-15s\n" "$key" "$version" "$mode" "$retain" "$legal"
done
}
KEY VERSION LOCK_MODE RETAIN_UNTIL LEGAL_HOLD
--- ------- --------- ------------ ----------
config/production/prod-config.json null None None None
config/staging/stage-config.json null None None None
data/2024/february/report-02.txt null COMPLIANCE 2026-01-15T15:00:00+00:00 None
data/2024/january/report-01.txt iti0XnrWEZjxVtmwEobYYoXhuz3Tugtq COMPLIANCE 2026-01-17T05:22:31.323000+00:00 None
data/2024/january/report-01.txt null COMPLIANCE 2026-01-15T15:00:00+00:00 None
data/2024/summary.txt null COMPLIANCE 2026-01-15T15:00:00+00:00 ON
data/2024/summary2.txt 5aSkx1cElivJJZXj_VOGw54fbtblLf6C COMPLIANCE 2026-01-17T04:33:01.117000+00:00 None
data/2024/summary2.txt mjoczowWcETnSEG.Md19OUUv2XVZvWZi COMPLIANCE 2026-01-17T04:32:42.577000+00:00 None
data/2024/summary2.txt N3EFZslZhCvJ7AJ7EmwENKh6RrETXRgY COMPLIANCE 2026-01-17T04:32:24.902000+00:00 None
data/2024/summary2.txt Q41P7th1GpZ2GxdBqVA9xAPM8aYZidAi COMPLIANCE 2026-01-17T01:04:45.356000+00:00 None
data/2025/january/report-03.txt null None None None
data/2025/summary.txt null None None None
job-b898a339-f5c0-41d3-bb1d-a32eeb79915c/manifest.json 5qADfGU5RR0UTUU.eDk.bchOiMyhtNVq COMPLIANCE 2026-01-15T02:38:13.967000+00:00 None
job-b898a339-f5c0-41d3-bb1d-a32eeb79915c/manifest.json 7M9TKny3oOj8iPBnioDdiCBW1r4LFleF COMPLIANCE 2026-01-15T02:23:30.916000+00:00 None
job-b898a339-f5c0-41d3-bb1d-a32eeb79915c/manifest.json.md5 QR_xQtLKS3LheIHqdvEOrUYT2juRH_3A COMPLIANCE 2026-01-15T02:38:13.945000+00:00 None
job-b898a339-f5c0-41d3-bb1d-a32eeb79915c/results/9163512a65070cf0c92d15ddb6da15d730bd9161.csv _HSKP1ZsZDxlGzwgZYQtFhucTsk.hwQt COMPLIANCE 2026-01-15T02:38:13.865000+00:00 None
logs/application/app-2024.log null None None None
logs/application/app-2025.log null None None None
logs/system/sys-2025.log null None None None
non-97-object-lock/b898a339-f5c0-41d3-bb1d-a32eeb79915c/2026-01-14T02-23Z/ 4sShTgeuHwtB04_5WnnVrzXxqfDF1syA COMPLIANCE 2026-01-15T02:23:24.188000+00:00 None
non-97-object-lock/b898a339-f5c0-41d3-bb1d-a32eeb79915c/2026-01-14T02-23Z/manifest.checksum fSxiLJYpvwgQnGaP1K8sGdS5R5nrMQYV COMPLIANCE 2026-01-15T02:23:27.608000+00:00 None
non-97-object-lock/b898a339-f5c0-41d3-bb1d-a32eeb79915c/2026-01-14T02-23Z/manifest.json L15AaEq5pPGRFlVHYLBBt3X1JffAqJf8 COMPLIANCE 2026-01-15T02:23:27.670000+00:00 None
non-97-object-lock/b898a339-f5c0-41d3-bb1d-a32eeb79915c/data/00ab6e92-7bc6-472a-b55c-380f5eedf983.csv.gz KfM72CKc7Ba4lv5zz1vGRzww4gKxM8Hm COMPLIANCE 2026-01-15T02:23:26.454000+00:00 None
non-97-object-lock/b898a339-f5c0-41d3-bb1d-a32eeb79915c/hive/dt=2026-01-14-02-23/symlink.txt 27AiQR7QurrqYvU7i2d7wrqM45I0ONud COMPLIANCE 2026-01-15T02:23:27.648000+00:00 None
はい、何も変わりません。
これはバックアップ対象のバケットへリストアをする際には破壊的なリストアを行わないためです。
- 復元先バケットに同じ名前または同じバージョン ID のオブジェクトがある場合、オブジェクトの復元はスキップされます。
- 元の S3 バケットに復元する場合、
- AWS Backup は破壊的な復元を実行しません。つまり、 AWS Backup はバージョンに関係なく、既存のオブジェクトの代わりにバケットにオブジェクトを配置しません。
- 現在のバージョンの削除マーカーはオブジェクトが存在しないものとして扱われるため、復元を実行できます。
- AWS Backup は復元中にバケットからオブジェクト (削除マーカーなし) を削除しません (例: バックアップ中に存在しなかったバケット内の現在のキーは残ります)。
つまりはS3バケット内のオブジェクトを特定時点へ戻したい場合は別バケットへリストアする必要があります。別バケットへリストアすることになるため、S3バケットに設定したバケットポリシーやライフサイクルルール等の各種設定を再度設定する必要があります。また、S3バケット名はグローバルで一意である必要があるため、リストアに伴い連携している仕組み側でS3バケットの名前変更の対応を行う必要があります。
何も動きがないのも面白くないので、もう一度リストアします。
リストア前に以下のようにdata/2024/february/report-02.txtとdata/2024/summary.txt、config/を削除します。



削除後の各オブジェクトバージョンのボールトロック関連の情報は以下のとおりです。
> aws s3api list-object-versions --bucket non-97-object-lock --query 'Versions[].[Key,VersionId]' --output text | {
header_printed=false
while read key version; do
if [ "$header_printed" = false ]; then
printf "%-100s %-35s %-15s %-35s %-15s\n" "KEY" "VERSION" "LOCK_MODE" "RETAIN_UNTIL" "LEGAL_HOLD"
printf "%-100s %-35s %-15s %-35s %-15s\n" "---" "-------" "---------" "------------" "----------"
header_printed=true
fi
result=$(aws s3api head-object \
--bucket non-97-object-lock \
--key "$key" \
--version-id "$version" \
--query '{Mode: ObjectLockMode, Retain: ObjectLockRetainUntilDate, Legal: ObjectLockLegalHoldStatus}' \
--output json 2>/dev/null)
mode=$(echo "$result" | jq -r '.Mode // "None"')
retain=$(echo "$result" | jq -r '.Retain // "None"')
legal=$(echo "$result" | jq -r '.Legal // "None"')
printf "%-100s %-35s %-15s %-35s %-15s\n" "$key" "$version" "$mode" "$retain" "$legal"
done
}
KEY VERSION LOCK_MODE RETAIN_UNTIL LEGAL_HOLD
--- ------- --------- ------------ ----------
config/staging/stage-config.json null None None None
data/2024/january/report-01.txt iti0XnrWEZjxVtmwEobYYoXhuz3Tugtq COMPLIANCE 2026-01-17T05:22:31.323000+00:00 None
data/2024/january/report-01.txt null COMPLIANCE 2026-01-15T15:00:00+00:00 None
data/2024/summary.txt null COMPLIANCE 2026-01-15T15:00:00+00:00 ON
data/2024/summary2.txt 5aSkx1cElivJJZXj_VOGw54fbtblLf6C COMPLIANCE 2026-01-17T04:33:01.117000+00:00 None
data/2024/summary2.txt mjoczowWcETnSEG.Md19OUUv2XVZvWZi COMPLIANCE 2026-01-17T04:32:42.577000+00:00 None
data/2024/summary2.txt N3EFZslZhCvJ7AJ7EmwENKh6RrETXRgY COMPLIANCE 2026-01-17T04:32:24.902000+00:00 None
data/2024/summary2.txt Q41P7th1GpZ2GxdBqVA9xAPM8aYZidAi COMPLIANCE 2026-01-17T01:04:45.356000+00:00 None
data/2025/january/report-03.txt null None None None
data/2025/summary.txt null None None None
job-b898a339-f5c0-41d3-bb1d-a32eeb79915c/manifest.json 5qADfGU5RR0UTUU.eDk.bchOiMyhtNVq COMPLIANCE 2026-01-15T02:38:13.967000+00:00 None
job-b898a339-f5c0-41d3-bb1d-a32eeb79915c/manifest.json 7M9TKny3oOj8iPBnioDdiCBW1r4LFleF COMPLIANCE 2026-01-15T02:23:30.916000+00:00 None
job-b898a339-f5c0-41d3-bb1d-a32eeb79915c/manifest.json.md5 QR_xQtLKS3LheIHqdvEOrUYT2juRH_3A COMPLIANCE 2026-01-15T02:38:13.945000+00:00 None
job-b898a339-f5c0-41d3-bb1d-a32eeb79915c/results/9163512a65070cf0c92d15ddb6da15d730bd9161.csv _HSKP1ZsZDxlGzwgZYQtFhucTsk.hwQt COMPLIANCE 2026-01-15T02:38:13.865000+00:00 None
logs/application/app-2024.log null None None None
logs/application/app-2025.log null None None None
logs/system/sys-2025.log null None None None
non-97-object-lock/b898a339-f5c0-41d3-bb1d-a32eeb79915c/2026-01-14T02-23Z/ 4sShTgeuHwtB04_5WnnVrzXxqfDF1syA COMPLIANCE 2026-01-15T02:23:24.188000+00:00 None
non-97-object-lock/b898a339-f5c0-41d3-bb1d-a32eeb79915c/2026-01-14T02-23Z/manifest.checksum fSxiLJYpvwgQnGaP1K8sGdS5R5nrMQYV COMPLIANCE 2026-01-15T02:23:27.608000+00:00 None
non-97-object-lock/b898a339-f5c0-41d3-bb1d-a32eeb79915c/2026-01-14T02-23Z/manifest.json L15AaEq5pPGRFlVHYLBBt3X1JffAqJf8 COMPLIANCE 2026-01-15T02:23:27.670000+00:00 None
non-97-object-lock/b898a339-f5c0-41d3-bb1d-a32eeb79915c/data/00ab6e92-7bc6-472a-b55c-380f5eedf983.csv.gz KfM72CKc7Ba4lv5zz1vGRzww4gKxM8Hm COMPLIANCE 2026-01-15T02:23:26.454000+00:00 None
non-97-object-lock/b898a339-f5c0-41d3-bb1d-a32eeb79915c/hive/dt=2026-01-14-02-23/symlink.txt 27AiQR7QurrqYvU7i2d7wrqM45I0ONud COMPLIANCE 2026-01-15T02:23:27.648000+00:00 None
この状態でリストアします。
リストア後の各オブジェクトバージョンのボールトロック関連の情報は以下のとおりです。
> aws s3api list-object-versions --bucket non-97-object-lock --query 'Versions[].[Key,VersionId]' --output text | {
header_printed=false
while read key version; do
if [ "$header_printed" = false ]; then
printf "%-100s %-35s %-15s %-35s %-15s\n" "KEY" "VERSION" "LOCK_MODE" "RETAIN_UNTIL" "LEGAL_HOLD"
printf "%-100s %-35s %-15s %-35s %-15s\n" "---" "-------" "---------" "------------" "----------"
header_printed=true
fi
result=$(aws s3api head-object \
--bucket non-97-object-lock \
--key "$key" \
--version-id "$version" \
--query '{Mode: ObjectLockMode, Retain: ObjectLockRetainUntilDate, Legal: ObjectLockLegalHoldStatus}' \
--output json 2>/dev/null)
mode=$(echo "$result" | jq -r '.Mode // "None"')
retain=$(echo "$result" | jq -r '.Retain // "None"')
legal=$(echo "$result" | jq -r '.Legal // "None"')
printf "%-100s %-35s %-15s %-35s %-15s\n" "$key" "$version" "$mode" "$retain" "$legal"
done
}
KEY VERSION LOCK_MODE RETAIN_UNTIL LEGAL_HOLD
--- ------- --------- ------------ ----------
config/production/prod-config.json FWRNlkVa55A6hE6eD8.2F4suEyZ._gU4 COMPLIANCE 2026-01-17T06:29:41.299000+00:00 None
config/staging/stage-config.json j0cb4kdi_cEmceT4k8UA2_kYx8_nZt1W COMPLIANCE 2026-01-17T06:29:43.100000+00:00 None
config/staging/stage-config.json null None None None
data/2024/february/report-02.txt fTI5.5xbyWTQWdRtwc.BesKttSsZxjKq COMPLIANCE 2026-01-17T06:29:43.422000+00:00 None
data/2024/january/report-01.txt EX0Mm0rd1JnVRMLYZ_6tKGg2V9vJ6q_l COMPLIANCE 2026-01-17T06:30:22.264000+00:00 None
data/2024/january/report-01.txt iti0XnrWEZjxVtmwEobYYoXhuz3Tugtq COMPLIANCE 2026-01-17T05:22:31.323000+00:00 None
data/2024/january/report-01.txt null COMPLIANCE 2026-01-15T15:00:00+00:00 None
data/2024/summary.txt null COMPLIANCE 2026-01-15T15:00:00+00:00 ON
data/2024/summary2.txt 5aSkx1cElivJJZXj_VOGw54fbtblLf6C COMPLIANCE 2026-01-17T04:33:01.117000+00:00 None
data/2024/summary2.txt mjoczowWcETnSEG.Md19OUUv2XVZvWZi COMPLIANCE 2026-01-17T04:32:42.577000+00:00 None
data/2024/summary2.txt N3EFZslZhCvJ7AJ7EmwENKh6RrETXRgY COMPLIANCE 2026-01-17T04:32:24.902000+00:00 None
data/2024/summary2.txt Q41P7th1GpZ2GxdBqVA9xAPM8aYZidAi COMPLIANCE 2026-01-17T01:04:45.356000+00:00 None
data/2025/january/report-03.txt null None None None
data/2025/summary.txt null None None None
job-b898a339-f5c0-41d3-bb1d-a32eeb79915c/manifest.json 5qADfGU5RR0UTUU.eDk.bchOiMyhtNVq COMPLIANCE 2026-01-15T02:38:13.967000+00:00 None
job-b898a339-f5c0-41d3-bb1d-a32eeb79915c/manifest.json 7M9TKny3oOj8iPBnioDdiCBW1r4LFleF COMPLIANCE 2026-01-15T02:23:30.916000+00:00 None
job-b898a339-f5c0-41d3-bb1d-a32eeb79915c/manifest.json.md5 QR_xQtLKS3LheIHqdvEOrUYT2juRH_3A COMPLIANCE 2026-01-15T02:38:13.945000+00:00 None
job-b898a339-f5c0-41d3-bb1d-a32eeb79915c/results/9163512a65070cf0c92d15ddb6da15d730bd9161.csv _HSKP1ZsZDxlGzwgZYQtFhucTsk.hwQt COMPLIANCE 2026-01-15T02:38:13.865000+00:00 None
logs/application/app-2024.log null None None None
logs/application/app-2025.log null None None None
logs/system/sys-2025.log null None None None
non-97-object-lock/b898a339-f5c0-41d3-bb1d-a32eeb79915c/2026-01-14T02-23Z/ 4sShTgeuHwtB04_5WnnVrzXxqfDF1syA COMPLIANCE 2026-01-15T02:23:24.188000+00:00 None
non-97-object-lock/b898a339-f5c0-41d3-bb1d-a32eeb79915c/2026-01-14T02-23Z/manifest.checksum fSxiLJYpvwgQnGaP1K8sGdS5R5nrMQYV COMPLIANCE 2026-01-15T02:23:27.608000+00:00 None
non-97-object-lock/b898a339-f5c0-41d3-bb1d-a32eeb79915c/2026-01-14T02-23Z/manifest.json L15AaEq5pPGRFlVHYLBBt3X1JffAqJf8 COMPLIANCE 2026-01-15T02:23:27.670000+00:00 None
non-97-object-lock/b898a339-f5c0-41d3-bb1d-a32eeb79915c/data/00ab6e92-7bc6-472a-b55c-380f5eedf983.csv.gz KfM72CKc7Ba4lv5zz1vGRzww4gKxM8Hm COMPLIANCE 2026-01-15T02:23:26.454000+00:00 None
non-97-object-lock/b898a339-f5c0-41d3-bb1d-a32eeb79915c/hive/dt=2026-01-14-02-23/symlink.txt 27AiQR7QurrqYvU7i2d7wrqM45I0ONud COMPLIANCE 2026-01-15T02:23:27.648000+00:00 None
リストア処理によってリストアされたオブジェクトのRETAIN_UNTILはデフォルトの保持期間に従い設定されていることが分かります。
AWS Backup for S3によるリストアは原則オブジェクトのリストアであり、バケットの設定を含む全体のリストアではない
オブジェクトロックを設定しているS3バケットをAWS Backupでバックアップおよびリストアしてみました。
AWS Backup for S3によるリストアは原則オブジェクトレベルのリストアであり、バケットの設定を含む全体をそっくりそのままリストアする機能ではないことが分かりました。
個人的にはオブジェクトロックを組み合わせて運用する場面においては、別バケットへリストアするシチュエーションが多いかと思います。そのため、バケット名変更の影響を整理しておくと良いかと考えます。
また、ランサムウェア対策でオブジェクトロックを採用することも多いと思いますが、オブジェクトロックを設定することによる懸念点についても理解しておきましょう。
この記事が誰かの助けになれば幸いです。
以上、クラウド事業本部 コンサルティング部の のんピ(@non____97)でした!






