S3オブジェクトロック(S3 Object Lock)は、S3に置いたオブジェクトを一定期間、あるいは解除するまで削除も上書きもできない状態にする機能です。ランサムウェアに管理者権限を奪われてもバックアップを消させない、監査が終わるまで証跡を固定する、といった用途で使われます。2026年9月8日には、契約終了などの出来事を起点に保持期間を始められる「イベントホールド(可変保持)」が追加されました。この記事では、2つの保持モードの違い、3つの保持方式で期限日がどう決まるか、AWS CLIでの設定と解除、バケットポリシーでの統制までを、AWS公式ドキュメントの記載に沿ってコマンド付きで整理します。S3そのものの仕組みはAmazon S3とは?オブジェクトストレージの仕組み・ストレージクラスと料金・採用判断を実装者目線で解説にまとめています。
まとめ|S3オブジェクトロックを有効化する前に決める保持方式とモード
先に結論を置きます。オブジェクトロックは一度有効にすると無効化できないため、コマンドを打つ前に次の4点を決めておきます。
- 保護の単位はオブジェクトの「バージョン」で、バージョニングが前提になる。削除マーカーは保護されない
- 本番の法定保存にはコンプライアンスモード、検証や救済の余地を残したい場合はガバナンスモードを選ぶ
- 期限が書き込み時に決まるなら固定保持、出来事の後から数えるならイベントホールド、期限が読めないならリーガルホールド
- 保持期間の上限・下限とホールド解除の権限は、バケットポリシーの条件キーで縛っておく
迷ったら、まずガバナンスモードと短い期間で試してください。コンプライアンスモードで設定した期間は、ルートユーザーでも短縮できません。
S3オブジェクトロックの仕組みとバージョニング前提で守られる範囲
オブジェクトロックはWORM(Write Once Read Many)型の保護です。Object Lockの公式ドキュメントによると、S3バージョニングが有効なバケットでのみ動き、ロック情報はオブジェクトバージョンのメタデータに保存されます。
保護されるのはバージョン単位で新バージョンと削除マーカーは止まらない
ロックが守るのは、リクエストで指定した1つのバージョンだけです。同じキーで新しくアップロードすると新バージョンが作られ、ロック済みの旧バージョンはそのまま残ります。たとえば30日保持のうち15日が過ぎたオブジェクトに、同じ名前で60日保持のファイルを置くと、旧バージョンは15日後に削除可能になり、新バージョンは60日間守られます。
つまり、オブジェクトロックは「上書きを禁止する」機能ではありません。「過去のバージョンを消させない」機能です。アプリケーションから見た最新版は普通に置き換わります。
バージョン指定のDELETEは403、指定なしのDELETEは200で削除マーカー
保護中のオブジェクトを消そうとしたときの応答は、次の2通りです。バージョンIDを指定した完全削除は403 Forbiddenで拒否されます。バージョンIDを付けない通常の削除は200 OKが返り、削除マーカーが最新バージョンとして置かれます。
削除マーカーはWORM保護の対象外です。画面上は消えたように見えても、元のバージョンは残っているので、マーカーを消せば戻せます。消されたと慌てる前にlist-object-versionsでバージョン一覧を確認してください。
ガバナンスモードとコンプライアンスモードの違いと解除に必要な権限
保持期間を付けるときは、必ずどちらかのモードを選びます。違いは「保護を外せる人がいるかどうか」です。
ルートユーザーでも保持期間中に外せないかで分かれる2モードの比較表
| 項目 | ガバナンスモード | コンプライアンスモード |
|---|---|---|
| 期間中の削除・上書き | 特別な権限があれば可能 | ルートユーザーを含め誰も不可 |
| 期間の短縮・モード変更 | 特別な権限があれば可能 | 不可(延長のみ) |
| 期限前に消す方法 | バイパス権限で削除 | AWSアカウントの削除のみ |
| 向く用途 | 誤削除対策・設定の検証 | 規制対応・改ざん防止の証跡 |
公式ドキュメントは、コンプライアンスモードの保持期限前にオブジェクトを消す唯一の方法を「関連するAWSアカウントを削除すること」と明記しています。期間の打ち間違いが取り返せないのはこのためです。
s3:BypassGovernanceRetentionとヘッダによる保護解除手順
ガバナンスモードの保護を外すには、s3:BypassGovernanceRetention権限を持ったうえで、リクエストにx-amz-bypass-governance-retention:trueヘッダを明示的に付けます。CLIでは--bypass-governance-retentionオプションがこれに当たります。
# ガバナンスモードで保護中のバージョンを、権限を持つロールで削除する
aws s3api delete-object --bucket example-records \
--key contracts/2026/a-001.pdf \
--version-id 3HL4kqtJlcpXroDTDmJ.rmSpXd3dIbrHY \
--bypass-governance-retention
注意したいのはS3コンソールです。Object Lockの考慮事項によると、コンソールはこのヘッダを自動で付けます。バイパス権限を持つ運用者がコンソールで削除すると、確認なしで成功します。バイパス権限は日常の管理者ロールから外し、緊急用のロールに分けてください。リーガルホールドはバイパスしても外れません。
固定保持・リーガルホールド・イベントホールドの3方式と期限日の決まり方
1つのバージョンには、保持期間とリーガルホールドの両方を付けられます。保持期間には固定と可変の2種類があります。
固定保持のRetainUntilDateとリーガルホールドが独立して効く関係
固定保持は、書き込み時にRetainUntilDate(保持期限日)を決める方式です。延長はできますが、コンプライアンスモードでは短縮できません。リーガルホールドは期限を持たず、s3:PutObjectLegalHold権限を持つユーザーが外すまで効き続けます。
2つは独立しています。保持期間が切れてもリーガルホールドが付いていれば削除できず、逆にリーガルホールドを外しても保持期間中なら守られたままです。訴訟や監査の対応で「終わりが読めないが今は消させない」場面はリーガルホールド、期間が決まっている保存は固定保持、と使い分けます。
2026年9月追加のイベントホールドで解除時刻に期間を足す計算
2026年9月8日の発表で追加された可変保持では、イベントホールドと期間(EventHoldDuration)を指定します。ホールド中は保護が続き、ホールドを外した時刻に期間を足した日が保持期限日として確定します。契約完了、口座の解約、保険金請求の解決など、保存期間の起算点が後から決まる文書に向く方式です。全リージョンで使え、追加料金はかかりません。
期限日の動きは公式ドキュメントの計算例が分かりやすいので、1年の期間で整理します。
- ホールド中は「現在時刻+1年」で計算され、2027-01-01に照会すると2028-01-01、2027-02-01なら2028-02-01と前へ進む
- 2027-01-01にホールドを外すと、2028-01-01で固定され、それ以降は動かない
- 期間を短くしても、現在の期限日より前には戻らない
- 最低保持日として2029-01-01も指定していた場合、解除時刻+1年と比べて遅いほうが採用される
期間は日数(1〜36,500日)か年数(1〜100年)のどちらか一方で指定します。EventHoldDurationの定義どおり、両方を同時に渡すと400エラーです。
AWS CLIでバケット作成から可変保持の解除まで動かす実装手順
ここからは手を動かします。AWS CLI v2が入り、認証が通っている状態が前提です。導入はAWS CLIのインストールと運用|OS別の導入手順・v2の設定・SSO認証・v1サポート終了への移行を参照してください。検証中はすべてガバナンスモードで試し、コンプライアンスモードには最後に切り替えます。
新規バケットの作成と既存バケットでオブジェクトロックを有効にするコマンド
Object Lockの設定ページには、新規作成時と既存バケットの両方の手順が載っています。古い解説記事には「作成時にしか有効化できない」とあるものの、現行ドキュメントでは既存バケットでも有効化できます。
# 新規バケットをObject Lock有効で作る(東京リージョン)
aws s3api create-bucket --bucket example-records \
--region ap-northeast-1 \
--create-bucket-configuration LocationConstraint=ap-northeast-1 \
--object-lock-enabled-for-bucket
# 既存バケットの場合:先にバージョニングを有効にしてからObject Lockを有効にする
aws s3api put-bucket-versioning --bucket example-existing \
--versioning-configuration Status=Enabled
aws s3api put-object-lock-configuration --bucket example-existing \
--object-lock-configuration '{"ObjectLockEnabled":"Enabled"}'
# 状態の確認
aws s3api get-bucket-versioning --bucket example-records
aws s3api get-object-lock-configuration --bucket example-records
create-bucketのリファレンスによると、Object Lockを有効にして作るにはs3:PutBucketObjectLockConfigurationとs3:PutBucketVersioningの両方の権限が要ります。バケット作成や権限の基本はAWS S3の使い方|CLIでのバケット作成から権限設計・署名付きURLまでの実装手順にあります。
バケット既定の保持設定にDefaultEventHoldを含めるJSONの書き方
バケットに既定の保持を設定すると、保持を指定せずに置いたオブジェクトにも自動で適用されます。可変保持を既定にする場合はDefaultEventHoldを足します。
aws s3api put-object-lock-configuration --bucket example-records \
--object-lock-configuration '{
"ObjectLockEnabled": "Enabled",
"Rule": {
"DefaultRetention": {
"Mode": "GOVERNANCE",
"Days": 365,
"DefaultEventHold": {"Days": 90}
}
}
}'
この設定では、新しいオブジェクトはイベントホールド付きで置かれ、解除から90日間守られます。"Days": 365は最低保持期間で、解除が早くても作成から365日は消せません。既定値は「置いた時点」の新しいオブジェクトにだけ効き、有効化前からあるオブジェクトには付きません。既存分は後述のBatch Operationsで付けます。
put-objectとput-object-retentionによるホールド設定・解除
オブジェクト単位のイベントホールドには、アップロード時に付ける方法と、置いた後から付ける方法があります。
# アップロードと同時にイベントホールドを付ける(解除後30日保護)
aws s3api put-object --bucket example-records \
--key contracts/2026/a-001.pdf --body ./a-001.pdf \
--object-lock-mode GOVERNANCE \
--object-lock-event-hold ON \
--object-lock-event-hold-duration-days 30
# 置いた後から付ける(最低保持日を併記する例)
aws s3api put-object-retention --bucket example-records \
--key contracts/2026/a-001.pdf \
--retention '{"Mode":"GOVERNANCE","EventHold":"ON","EventHoldDuration":{"Days":30},"RetainUntilDate":"2027-01-01T00:00:00Z"}'
# 契約が終わったらホールドを外す(期間は渡さない)
aws s3api put-object-retention --bucket example-records \
--key contracts/2026/a-001.pdf \
--retention '{"Mode":"GOVERNANCE","EventHold":"OFF"}'
# 確定した保持期限日を確認する
aws s3api get-object-retention --bucket example-records \
--key contracts/2026/a-001.pdf
解除のリクエストに期間を含めると400エラーになります。トラブル対処の節によると、モード未指定、日数と年数の両方指定、範囲外の期間も同じく400です。リーガルホールドはput-object-legal-hold --legal-hold Status=ONで付け、Status=OFFで外します。
有効化前からある大量のオブジェクトへBatch Operationsで一括適用
既存オブジェクトにまとめて保持を付けるなら、S3 Batch OperationsのObject Lock retention操作を使います。固定保持の付与、イベントホールドの付与と一括解除に対応し、1ジョブのマニフェストは最大200億オブジェクトです。実行ロールにはs3:PutObjectRetentionとs3:GetBucketObjectLockConfigurationが要り、マニフェストの対象は同一バケットに限られます。
バケットポリシーで保持期間とイベントホールド解除を統制する設定例
既定の保持設定よりも優先されるのは、アップロード時に明示した値です。誰が何日の保持を付けられるかを強制するには、バケットポリシーの条件キーを使います。ポリシーの読み方はAWS IAMとは?仕組み・ユーザー/ロール/ポリシーの違いと権限設計のベストプラクティスを実装者目線で解説が前提になります。
ホールド期間90日未満を拒否する条件キーと年数指定の365日換算
可変保持ではs3:object-lock-event-hold(値はONかOFF)とs3:object-lock-event-hold-duration-daysの2つの条件キーが使えます。次は、90日未満の期間を付けるリクエストを拒否する例です。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "RequireMinimumEventHoldDuration",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:PutObjectRetention",
"Resource": "arn:aws:s3:::example-records/*",
"Condition": {
"NumericLessThan": {"s3:object-lock-event-hold-duration-days": "90"}
}
}
]
}
年数ベースの条件キーはありません。年数で指定された期間は1年=365日として日数に換算して評価され、うるう年は数えません。ポリシーの閾値は日数で書きます。もう1点、これらの条件キーはリクエストに含まれる値だけを評価し、バケット既定から付く値には効きません。既定値を勝手に変えさせないにはs3:PutBucketObjectLockConfigurationを拒否します。
イベントホールド解除と削除を別ロールに分ける職務分離のDeny文
AWS Storage Blogの解説は、ホールドを外す権限と削除する権限を別のIDに分ける構成を勧めています。1つのロールが奪われても、解除して即削除する流れを踏めなくするためです。
{
"Sid": "OnlyReleaseRoleCanTurnOffEventHold",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:PutObjectRetention",
"Resource": "arn:aws:s3:::example-records/*",
"Condition": {
"StringEquals": {"s3:object-lock-event-hold": "OFF"},
"ArnNotEquals": {"aws:PrincipalArn": "arn:aws:iam::111122223333:role/records-release"}
}
}
解除ロールにはs3:DeleteObjectVersionを与えず、削除は保持期限後に別のロールかライフサイクルで行います。ホールドの設定と解除はすべてCloudTrailに記録されるため、誰がいつ外したかはCloudTrailとは?証跡設計と料金実額・Lake新規受付終了後の構成をCLIで解説の証跡設計で追えるようにしておきます。
無効化不可・レプリケーション・KMS鍵などS3オブジェクトロック運用の制約
設定そのものより、運用に入ってから気づく制約のほうが影響は大きくなります。
オブジェクトロックを一度有効にすると無効化もバージョニング停止もできない制約
設定ページの冒頭にある通り、Object Lockを有効にしたバケットでは、Object Lockの無効化もバージョニングの停止もできません。サーバーアクセスログの出力先にも使えなくなります。ログ用バケットにまとめて有効化しようとしている場合は、対象を分けてください。ディレクトリバケット(S3 Express One Zone)では使えず、対象は汎用バケットだけです。
ライフサイクルルールは保護中のオブジェクトにも動き、削除マーカーも置きます。ただし、ロック中のバージョンを有効期限切れで消すことはできません。古いバージョンはロック期限が過ぎるまで課金され続けるので、保持期間と非現行バージョンの削除ルールをセットで設計します。単価の見積もりはS3の料金を実額で計算する|東京リージョンの単価内訳とコストを下げる設定手順で行えます。
レプリケーション先とKMS鍵の削除で保護が崩れる2つの落とし穴
レプリケーションでは、コピー元がObject Lock有効なら、コピー先もObject Lock有効でなければなりません。レプリケーション用のロールにはs3:GetObjectRetentionとs3:GetObjectLegalHoldが追加で要ります。イベントホールドの解除も複製されますが、コピー先は複製された時刻を基準に期限日を計算するため、コピー元よりわずかに長く守られます。
もう1つは暗号鍵です。Object Lockはオブジェクトを守りますが、KMSキーの削除までは防げません。SSE-KMSで暗号化したオブジェクトは、キーを消されると残っていても読めなくなります。ランサムウェア対策として使うなら、KMSキーの削除権限もロックと同じ厳しさで絞ってください。S3 Inventoryで保護状態を一覧できますが、レポートは最大48時間前の時点の値です。最新の期限日はget-object-retentionで直接確認します。
ランサムウェア対策と法定保存でS3オブジェクトロックを採用する条件
最後に、受託開発の現場で採用を勧める条件と、見送る場面を線引きします。
バックアップの最後の砦と出来事起点の保存で採用する2つの条件
採用を勧める条件は2つです。1つ目は、本番系の管理者権限が奪われてもバックアップの複製だけは消させたくない場合です。別アカウントのバケットにコンプライアンスモードで日次の複製を置けば、攻撃者が本番アカウントを掌握しても期間中は消せません。暗号化された事務NASを「戻せるバックアップ」で立て直した例は佐賀大学のランサムウェア被害と事務NASの暗号化|4日で業務再開した初動と戻せるバックアップで扱っています。2つ目は、契約終了や解約といった出来事から保存期間を数える文書です。これまでアプリ側で期限日を計算して付け直していた処理を、イベントホールドの解除1回に置き換えられます。
EC2やRDSを含めてバックアップを一元管理したいなら、AWS Backupとは?対応サービス・料金・バックアッププラン作成と復元手順を解説のようにバックアップサービス側で管理する構成も比較対象になります。
削除請求に応じる個人データと頻繁に書き換えるデータで見送る場面
見送るべき場面ははっきりしています。本人からの削除請求に応じる必要がある個人データを、コンプライアンスモードで長期に固めてはいけません。期限前に消す手段がアカウント削除しか無いからです。数分おきに上書きされる設定ファイルやキャッシュも向きません。上書きのたびに守られた旧バージョンが積み上がり、保存料金だけが増えます。なお、国内法令の保存義務は法令ごとに要件が違い、Object Lockを有効にしただけで要件を満たすとは限りません。米国のSEC 17a-4等についてはCohasset Associatesの評価が公開されていますが、国内の要件は個別に確認が要ります。
保持設計を含めたバックアップ構成やランサムウェア対策を固めたい場合は、インフラ構築(AWS・Google Cloud・Azure)で要件整理から対応しています。
よくある質問
S3オブジェクトロックについて検索されている質問に、公式ドキュメントの記載をもとに答えます。
S3オブジェクトロックは既存のバケットにも後から設定できますか?
できます。現行の公式ドキュメントに記載されているのは、既存バケットでの有効化手順です。先にput-bucket-versioningでバージョニングを有効にし、put-object-lock-configurationでObjectLockEnabledをEnabledにします。有効化前からあるオブジェクトに保護は自動で付かないため、必要ならS3 Batch Operationsで一括適用します。
コンプライアンスモードで長すぎる期間を設定したら削除できますか?
できません。コンプライアンスモードでは、ルートユーザーを含めて期間の短縮もモード変更もできず、期限前に消す方法はAWSアカウントの削除だけです。設定ミスに備えて、検証はガバナンスモードで行い、バケットポリシーのs3:object-lock-remaining-retention-daysで上限を付けておきます。保持期間の上限は100年です。
S3オブジェクトロックに追加料金はかかりますか?
2026年9月の発表では、イベントホールドは追加料金なしで全リージョンに提供されています。ただし、ロック中のバージョンは消せないため、そのぶんのストレージ料金は期限まで発生し続けます。上書きの多いデータでは非現行バージョンが積み上がるので、保存量の見込みを先に計算してください。
リーガルホールドとイベントホールドの違いは何ですか?
リーガルホールドは外した瞬間に保護が終わります。イベントホールドを外した時点が、指定期間の保護の開始時点です。訴訟対応のように終わりが読めず、終わったら消してよいものはリーガルホールド、契約終了後に一定年数の保存が要るものはイベントホールドが向きます。両者は併用でき、リーガルホールドは保持期間と独立して効きます。
オブジェクトロック中のファイルを同じ名前でアップロードするとどうなりますか?
アップロードは成功し、作成されるのは新しいバージョンです。ロック済みの旧バージョンは元の期限まで残り、新バージョンにはアップロード時の指定かバケット既定の保持が付きます。最新版を取得するアプリからは上書きされたように見えるため、改ざん前の状態はlist-object-versionsでバージョンIDを確認して取り出します。
関連記事
- Amazon S3とは?オブジェクトストレージの仕組み・ストレージクラスと料金・採用判断を実装者目線で解説:オブジェクトロックの前提になるS3全体の仕組み。
- AWS S3の使い方|CLIでのバケット作成から権限設計・署名付きURLまでの実装手順:バケット作成と権限設計の全体手順。
- Amazon S3 Glacierとは?3つのアーカイブストレージクラスと取り出し時間・料金・採用判断を実装者目線で解説:長期保持するオブジェクトの保管クラス選び。
- AWS Backupとは?対応サービス・料金・バックアッププラン作成と復元手順を解説:S3以外も含めたバックアップの一元管理。
- CloudTrailとは?証跡設計と料金実額・Lake新規受付終了後の構成をCLIで解説:ホールド操作の記録を残す証跡設計。