オブジェクトロックを設定しているS3バケットをAWS Backupでバックアップおよびリストアしてみた

オブジェクトロックを設定しているS3バケットをAWS Backupでバックアップおよびリストアしてみた

AWS Backup for S3によるリストアは原則オブジェクトレベルのリストアであり、バケットの設定を含む全体をそっくりそのままリストアではない
2026.01.19

オブジェクトロックが設定されていたとしても、全オブジェクトを特定地点の状態にするの大変だな

こんにちは、のんピ(@non____97)です。

皆さんはオブジェクトロックが設定されていたとしても、全オブジェクトを特定地点の状態にするの大変だなと感じたことはありますか? 私はあります。

オブジェクトロックを設定することで、指定した期間オブジェクトの削除を防ぐことが可能です。これによってランサムウェア対策としているケースもあるのではないでしょうか。

一方でオブジェクトロックによって削除を免れたとしても、ランサムウェアによってオブジェクトが上書きされてしまった(正しくは新しいバージョンが作成された)場合、最新バージョンはランサムウェアが上書きしたオブジェクトとなります。

ランサムウェアが作成したオブジェクトであってもオブジェクトロックが効いている以上、そのオブジェクトを削除して、元のオブジェクトバージョンを最新バージョンとすることができません。

つまりはランサムウェアによって侵害される前のバージョンを使用する場合は、以下のような対応が必要です

  • 都度オブジェクトバージョンを指定する
  • 指定したバージョンの内容でオブジェクトの上書きをして、最新バージョンを変更する
    • オブジェクトの任意のバージョンを直接最新バージョンとして扱わせることはできない

いずれも中々に手間です。

こんな時に役立つのがAWS Backup for S3です。

https://dev.classmethod.jp/articles/aws-backup-for-amazon-s3/

これによりS3バケット内の全オブジェクトもしくは条件に当てはまるプレフィックスを持つオブジェクトに対してまとめて、バックアップが取得された時点に戻すことが可能です。

以下AWS公式ドキュメントを確認しましたが、AWS Backup for S3とオブジェクトロックの相性についての言及はありませんでした。

https://docs.aws.amazon.com/ja_jp/aws-backup/latest/devguide/s3-backups.html

https://docs.aws.amazon.com/ja_jp/aws-backup/latest/devguide/restoring-s3.html

実際に試してみます。

いきなりまとめ

  • AWS Backup for S3によるリストアは原則オブジェクトのリストアであり、バケットの設定を含む全体のリストアではない
    • AWS Backup for S3はS3バケット全体を完全に特定時点の状態のものではなく、リストア対象のオブジェクトを指定されたバケットに配置する機能
  • リストア先のS3バケットでオブジェクトロックが設定されていなければ、リストアされたオブジェクトはオブジェクトロックは行われていない
    • オブジェクトロックの保持期間はS3バケットで設定されたデフォルトの保持期間となる
  • バックアップ対象のバケットへリストアする場合、破壊的なリストアを行わない
    • バックアップ取得後にオブジェクトの追加が行われていても、追加されたオブジェクトは削除されない
  • S3バケット内のオブジェクトを特定時点へ戻したい場合は別バケットへリストアする必要がある
    • 別バケットへリストアすることになるため、S3バケットに設定したバケットポリシーやライフサイクルルール等の各種設定を再度設定したり、連携している仕組み側でS3バケットの名前変更の対応を行う必要がある
    • 事前にバケット名変更の影響を整理しておこう

やってみた

現在の状態

まず、現在の状態についてです。

以下記事で使用した検証環境をそのまま利用します。

https://dev.classmethod.jp/articles/s3-batch-operations-set-object-lock-retention/

そのままバックアップしても面白くないのでdata/2024/summary.txtにリーガルホールドの設定しています。

また、削除マーカーもバックアップされるそうなので試します。

  • 削除マーカーはオブジェクトと同様にバックアップされます。オブジェクトと削除マーカーの比率によっては、バックアップ時間と復元時間が影響を受ける可能性があります。
  • バックアップされるオブジェクトとマーカーにはそれぞれ最低料金が適用されます。各削除マーカーには 128 KiB のオブジェクトと同じ料金がかかります。

Amazon S3 バックアップ - AWS Backup

1.削除マーカー.png

各オブジェクトバージョンのオブジェクトロック周りの状態は以下のとおりです。

> 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日で日次でバックアップを取得するようにしています。

2.バックアッププランの作成.png

バックアップインデックスについては以下記事をご覧ください。

https://dev.classmethod.jp/articles/aws-backup-item-level-recovery/

リソースの割り当てでS3バケットを指定します。

3.リソースの割り当て.png

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.とバックアップに失敗します。

4.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..png

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

5.AWSBackupDefaultServiceRole.png

以下記事で紹介されているとおり、AWSBackupServiceRolePolicyForS3BackupAWSBackupServiceRolePolicyForS3Restoreをアタッチします。

https://dev.classmethod.jp/articles/aws-backup-s3/

バックアップが作成されたことを確認

それではバックアップが作成されたことを確認します。

しばらく待つとバックアップジョブが作成され、ステータスが作成済みになっていました。

6.実行が完了していた.png

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

7.バックアップ完了.png

オブジェクトの追記

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

8.オブジェクトの上書き.png

各オブジェクトバージョンごとのオブジェクトロック周りの情報は以下のとおりです。

> 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

別バケットにリストア

この状態でリストアします。

まずは別バケットへのリストアです。

復旧ポイントは以下です。

9.復旧ポイントの確認.png

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

11.リストア.png

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

10.すべてのバージョン.png

12.項目レベルの復元.png

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

17.リストアが完了したことを確認.png

リストア先の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バケット全体を完全に特定時点の状態のものではなく、リストア対象のオブジェクトを指定されたバケットに配置する機能になります。

なお、削除マーカーも正常にリストアされていました。

26.削除マーカーがリストアされていることの確認.png

バックアップインデックスを用いた検索

バックアップ対象のバケットへリストアする前にバックアップインデックスを用いた検索を試してみます。

復旧ポイントを選択して検索を行います。今回はオブジェクトキーにsummaryを含むものにしました。

13.検索を作成.png

検索で使用できるプロパティは以下のとおりです。

  • オブジェクトキー
  • バージョン
  • eTag
  • ファイルサイズ
  • オブジェクトの作成時刻

25.項目のプロパティ.png

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

14.検索結果.png

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

15.検索ジョブの詳細.png

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

16.オブジェクトを選択してリストア.png

バックアップ対象のバケットへリストア

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

19.ソースバケットへの復元.png

はい、リストアジョブが走り始めるとCannot restore, as the BucketOwnershipControls of non-97-object-lock do not allow the use of object ACLs.とエラーになりました。

これは以下記事で紹介されているとおり、リストア先のS3バケットでACLが設定されていないがために発生するエラーです。

20.Cannot restore, as the BucketOwnershipControls of non-97-object-lock do not allow the use of object ACLs..png

https://dev.classmethod.jp/articles/note-when-restoring-s3-buckets/

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

21.ACL が復元されますのチェックを外してリストア.png

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

22.リストア完了.png

リストア後のオブジェクトのオブジェクトロックの状態を確認します。

> 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 データを復元する AWS Backup - AWS Backup

つまりはS3バケット内のオブジェクトを特定時点へ戻したい場合は別バケットへリストアする必要があります。別バケットへリストアすることになるため、S3バケットに設定したバケットポリシーやライフサイクルルール等の各種設定を再度設定する必要があります。また、S3バケット名はグローバルで一意である必要があるため、リストアに伴い連携している仕組み側でS3バケットの名前変更の対応を行う必要があります。

何も動きがないのも面白くないので、もう一度リストアします。

リストア前に以下のようにdata/2024/february/report-02.txtdata/2024/summary.txtconfig/を削除します。

23.data:2024:february:report-02.txtの削除.png
23.summary.txtの削除.png
24.configの削除.png

削除後の各オブジェクトバージョンのボールトロック関連の情報は以下のとおりです。

> 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)でした!

この記事をシェアする

FacebookHatena blogX

関連記事