
はじめに
こんにちは。
アプリケーションサービス本部ディベロップメントサービス1課の森山です。
S3 Object Lock のコンプライアンスモードについて、「誤ったオブジェクトを格納してしまった」「保持期間を誤って設定した」「後から要件が変わった」といったケースへの対応が気になっていました。
少しドキュメントを読んでみると私が一部挙動について勘違いしているところがあったので、この記事では、コンプライアンスモードで「できること」と「できないこと」を整理してみます。
この記事で学べること
- コンプライアンスモードで「できること」と「できないこと」
- Object Lock の設定方法(コンソール・CLI)
前提知識・条件
- 今回はコンプライアンスモードに焦点を当て、Object Lock 全体の説明は割愛させていただきます
S3 Object Lock を使用したオブジェクトのロック - Amazon Simple Storage Service
結論
コンプライアンスモードでロックされたオブジェクトに対して、操作の可否は以下の通りです。
| 操作 | 可否 |
|---|---|
| 同じキー名で新規バージョンをPUT | ✅ 可能 |
| 保持期間の延長 | ✅ 可能 |
| 保護されたバージョンの削除 | ❌ 不可 |
| 保持期間の短縮 | ❌ 不可 |
| 保持モードの変更 | ❌ 不可(※ガバナンス→コンプライアンスへの変更は可能) |
また、Object Lock の対象は「オブジェクトバージョン」単位となります。
やってみた
では簡単に動作確認していきます。
準備(バケット作成)
今回はマネジメントコンソールから Object Lock を有効にしたバケットを作成します。
新規作成時の詳細設定に Object Lock の項目があるので、ここで設定します。

この時点ではガバナンスモードやコンプライアンスモードの設定はできません。作成後に必要に応じてバケット単位でのデフォルトの保持設定が可能です。
つまり、Object Lock の設定はあくまでオブジェクト単位であることがわかります。
以下、バケット作成後の編集画面です。

このバケット設定は、下記ダイアログの注意喚起の通り、不可逆な設定ですので設定の際は注意が必要です。

準備(オブジェクトの準備)
動作確認用のオブジェクトを準備していきます。
なお、マネジメントコンソール上からファイルをアップロードする際の画面に記載されてましたが、オブジェクト PUT 時の Object Lock 設定は画面上からはできないみたいです。

では、以下2つのファイルを追加し、検証をしていきます。
- PUT 時に Object Lock を指定しない
default.png - PUT 時に
COMPLIANCEを指定したcompliance.png
2番目のファイル(compliance.png)に関しては以下の CLI でアップロードしました。
# 1日後の日時を自動計算 RETAIN_DATE=$(date -u -v+1d +"%Y-%m-%dT%H:%M:%SZ") # compliance.pngをアップロード(コンプライアンスモード・1日保持) aws s3api put-object \ --bucket test-locked-bucket \ --key compliance.png \ --body compliance.png \ --object-lock-mode COMPLIANCE \ --object-lock-retain-until-date "$RETAIN_DATE"
それぞれ、アップロード後、プロパティを確認すると以下の通りの設定でした。
1:

2:

検証(1)削除
では挙動の確認をしていきます。
まずは削除してみましたが、削除できてしまいました。
ただし、完全に削除されているわけではなく削除マーカーがついた状態です。
Object Lock を有効にするとデフォルトでバージョニングが有効になっているためです。

では、完全に削除してみます。
PUT 時に Object Lock を指定しない default.png のみ削除できました。
コンプライアンスモードで保護しているオブジェクトは完全には削除できません。

なお、削除マーカーはどちらも削除可能です。
削除マーカーは付きますが、コンプライアンスモードで保護されたバージョンについては保持期間中は完全削除できません。
検証(2)更新
次は初回登録と同じ方法・ファイル名で PUT してみます。
特にエラーなく成功します。
こちらも別バージョンとして新しいオブジェクトが登録されていますね。

Object Lock の保持設定はオブジェクト単位と先ほど書きましたが、厳密にいうとオブジェクトバージョン単位であることがわかります。
同じキー名で PUT しても新バージョンとして登録され、保護されたバージョンはそのまま残ります。
検証(3)保持期間の延長
最後にコンプライアンスモードで設定した保持期間を変更してみます。

過去日の設定はできませんでした。

未来日の設定は無事できました。

例えば、最初は1日間などの短い設定にしておき、必要なファイル検証などを行ったのち、正式な期間に変更するといった柔軟な運用もできそうです。
なおこの挙動は S3 バケット単位に指定するデフォルト設定でも同様な挙動です。
保持期間は延長のみ可能で、短縮はできません。段階的な運用が可能です。
まとめ
検証前まではバージョニングについて意識ができておらず、削除・上書きの操作が成功することにびっくりしてしまいました。
コンプライアンスモードは「完全に何もできなくなる」わけではなく、コンプライアンス要件を満たしつつ、運用上の柔軟性も確保されている設計になっていることがわかりました。
誰かのお役に立てれば幸いです!