S3オブジェクトロックの仕組みと勘違いしやすい上書き動作についてまとめてみた
質問
S3のオブジェクトロック機能を有効にした場合、一度作成したファイルには上書きできない理解であっていますか?また、オブジェクトロックの仕組みについて教えてください。
結論
- S3オブジェクトロック機能が有効でも、同じ名前の新しいバージョンのファイルをアップロードすることは可能
- オブジェクトロックは特定のバージョンに対して適用され、そのバージョンの削除や上書きを防ぐ
- バージョニングにより、古いバージョンは保護されたまま新しいバージョンの作成が可能
解説
オブジェクトロックの基本的な仕組み
S3のオブジェクトロック機能は、一定期間または無期限にわたり、オブジェクトの特定のバージョンが削除または上書きされるのを防ぐ機能です。主に以下の2つのモードがあります。
-
Governance モード
s3:BypassGovernanceRetention
権限を持っている必要ユーザーは保護を上書き可能(つまりAdministratorAccess
権限をもっていると可能)- コンプライアンス要件が比較的緩やかな場合に使用
-
Compliance モード
- AWS アカウントのroot ユーザーを含むすべてのユーザーが削除不可
- 厳格なコンプライアンス要件に対応
上書き時の動作
オブジェクトロックを使用するには、バケットのバージョニングを有効にする必要があります。
そのため、新しいバージョンのアップロードは可能で、その際に古いバージョンは保護された状態で維持されます。
既存ファイルと同名のファイルをアップロードした場合の動作は以下の通りです。
- 新しいバージョンIDが生成される
- 古いバージョンは保護されたまま維持
下記が実際のコンソール画面の例です。
このように複数バージョンが保存されるため、「完全に上書きできない」という仕様ではありません。
古いバージョンへのアクセス方法は?
古いバージョンのオブジェクトにアクセスするには、下記の方法があります。
-
AWS マネジメントコンソールから
- S3バケット内のオブジェクトを選択
- 「バージョン」タブを選択
- 目的のバージョンIDを持つオブジェクトを選択してダウンロード
-
AWS CLI を使用する場合
# バージョンの一覧を表示
aws s3api list-object-versions --bucket バケット名 --prefix オブジェクト名
# 特定のバージョンをダウンロード
aws s3api get-object --bucket バケット名 --key オブジェクト名 --version-id バージョンID 出力ファイル名
- AWS SDK を使用する場合(Python の例)
import boto3
s3 = boto3.client('s3')
# 特定のバージョンを取得
response = s3.get_object(
Bucket='バケット名',
Key='オブジェクト名',
VersionId='バージョンID'
)
これらの方法により、オブジェクトロックで保護された古いバージョンのファイルにも安全にアクセスすることができます。
参考
さいごに
今回は、S3オブジェクトロックの仕組みと勘違いしやすい上書き動作についてまとめてみました。
調査前までは、上書きしようとすると失敗すると思っていたのですが、個々のバージョンごとに保存されることがわかりました。
今後オブジェクトロック機能を有効化する予定の方はご注意ください。
最後までお読みいただきありがとうございました!
以上、おつまみ(@AWS11077)でした!