はじめに

久しぶりのAWS関連の投稿です。
S3のニッチな設定のオブジェクトロック、リーガルホールド設定について調べる機会がありましたので、調べた結果、と実装手順について纏めます。

S3オブジェクトロックとリーガルホールドの概要

オブジェクトロック

AWSのドキュメントだと以下のように記載されています。

S3 オブジェクトロックでは、Write Once Read Many (WORM) モデルを使用してオブジェクトを保存できます。オブジェクトロックにより、オブジェクトが削除または上書きされることを、一定期間または無期限に防止できます。

S3 の削除や上書きを回避し、特定期間保持し続けることを目的とした機能で、バケットに対して設定する機能となります。
※なお、永続的な保持としてリーガルホールド設定があります。

リーガルホールド

先に記載した通り、特定のオブジェクトを永続的に保持することを目的とし、こちらはオブジェクトに対して設定する機能となります。
こちらはオブジェクトロックを利用したバケットのオブジェクトに対して有効にできることが可能な設定となります。
AWSのドキュメントだと以下のように記載されています。

リーガルホールドは、オブジェクトバージョンが上書きまたは削除されるのを防ぎます。ただし、リーガルホールドには関連する保持期間はなく、削除するまで有効です。

 

詳細

各種前提条件

オブジェクトロック

S3バケットでバージョニングを有効にする必要がある

リーガルホールド

オブジェクトロックを設定する必要がある

オブジェクトロックのリテンションモード

リテンションモード

オブジェクトロックのリテンションモード(保持する条件、上書き削除条件)には以下のような2つのモードがあり、どちらかのモードを利用し、保持期間を設定します。

  • ガバナンスモード
  • コンプライアンスモード

これらを表に纏めると以下のような形です。

モード ガバナンスモード コンプライアンスモード
上書き・削除条件 特定の権限を保つ必要がある
保持期間が終わる
保持期間が終わる
補足 s3:BypassGovernanceRetention 権限が必要 rootユーザも含めて、期間内は上書き削除ができない

要件によって使い分けることが可能となっております。

モードや保持期間の詳細はこちらのドキュメント参照してください。

リーガルホールド

リーガルホールドは無期限に上書き削除を制限します。
なお、権限として s3:PutObjectLegalHold があればロックの無効化が可能で、一度設定したら必ず消せないというものではありません。

リテンションモードとリーガルホールド

仮にそれぞれのリテンションモードとリーガルホールドが両方適用された場合、どのような挙動になるかというと、リテンションモードで設定されたモードの挙動と、リーガルホールドの両方の条件が適用されるとお考えください。

実装

オブジェクトロックの有効化

バケットへのオブジェクトロック設定1

以下S3バケットの作成画面のスクリーンショットです。
こちらを有効することでオブジェクトのロック機能は有効になります。


なお、これだけでは保護されたことにはなりませんので、作成後の画面でリテンションモードと期間を設定する必要があります。
こちらにその内容について記載されています。

バケットへのオブジェクトロック設定2

次に作成後の画面のプロパティよりオブジェクトロック設定を編集します。
以下で保持モードと保持期間の設定が必要です。

以上でオブジェクトロック設定完了です。

 

リーガルホールドの有効化

リーガルホールドの設定方法1

なんとオブジェクトに対してのみ設定が可能なので、オブジェクトのプロパティ画面より設定が可能です。

1つ目の方法としてはこちらで可能です。

リーガルホールドの設定方法2

いくつものファイルで1のような作業が必要になると、とっても億劫になってしまう、そんな人のためにS3のバッチオペレーションで容易に可能になっていました。

バッチオペレーション画面からジョブの作成を選択します。

今回はCSV形式のマニフェストオブジェクトを作成し、それを参照したいと思いますので、以下のように設定します。


※ちなみにマニフェストファイルには対象のオブジェクトを記載しますので、以下のような形で記載します(以下は最小限の例でバージョンIDを記載してそこへ実行することも可能です)

バケット名, オブジェクト名

h-saito-test-lock,test01.txt

こんなコマンドでバケットの中の全部のファイルを出力できました。
aws s3 ls s3://バケット名 --recursive | awk '{print $4}' | awk '{ if(!/\/$/) {print "バケット名," $0}}'

次に進むと以下の通り、リーガルホールドがオペレーションとして選べますので、選択し、有効にする、を選択します。

追加のオプションとして完了レポートが出せますので、それを出すことで結果の閲覧が可能です。
また、IAM Role が必要になるので、リーガルホールドの権限を付与した Role を作成します。


確認画面がでます。


ジョブ作成中から以下のステータスになり、これでジョブが実行できる状態になります。

開いて以下の画面からジョブを実行します。

実行し、レポートを確認すると、以下のような簡単なレポートがでています。
h-saito-test-lock,test/test02.txt,,succeeded,200,,Successful
h-saito-test-lock,test02.txt,,succeeded,200,,Successful

所感

あまり使わったことがないニッチと思われる機能だと思いますが、奥深いです。
リーガルホールドについてはオブジェクトが対象になり、バケットに保存して自動で適用されるような機能が無いことなど、今回改めて振り返ることができました。
リテンションモードの違いなどちょっとしたミスがファイルの削除、上書きができないような事態にもなるので、もし設定する際は慎重に設定した方が良いと感じました。
これらが纏まった情報はあまり見当たらなかったので、どなたかの助けになればと思います。