S3オブジェクトロックのリーガルホールドをCLIから設定する
こんにちは、岩城です。
S3オブジェクトロックにはにリーガルホールドという設定があります。リーガルホールドは、保持期間に関係なくオブジェクトが削除されるまで、オブジェクトバージョンの上書きまたは削除されるのを防ぐことができます。
今回リーガルホールドの設定をCLIから行おうとしたところ、少しハマったので共有したいと思います。
前提
私の環境ではAWS CLIバージョン2のDockerイメージを利用しています。
$ aws --version aws-cli/2.0.61 Python/3.7.3 Linux/4.19.76-linuxkit docker/x86_64.amzn.2
また、以下のようにオブジェクトロックが有効化されているS3バケットが存在することを前提としています。
$ aws s3api get-object-lock-configuration --bucket <バケット名> { "ObjectLockConfiguration": { "ObjectLockEnabled": "Enabled", "Rule": { "DefaultRetention": { "Mode": "COMPLIANCE", "Days": 1 } } } }
やりたかったこと
test.txt
をS3バケットにアップロード後、リーガルホールドの設定が無効化されていることを確認し、有効化しようと考えていました。
ところが、リーガルホールドの設定を確認するget-object-legal-hold
を実行したところ、ObjectLockConfiguration
がないためエラーとなりました。
$ aws s3api get-object-legal-hold --bucket <バケット名> --key test.txt An error occurred (NoSuchObjectLockConfiguration) when calling the GetObjectLegalHold operation: The specified object does not have a ObjectLock configuration
マネジメントコンソールを確認してみると無効にはなっているため、ObjectLockConfiguration
は存在していそうなのに。
解決方法
put-object-legal-hold
でリーガルホールドの設定を1度でも変更するとObjectLockConfiguration
が作成されるようです。
実際、以下のようにリーガルホールドの有効化した後、
$ awsi s3api put-object-legal-hold --bucket <バケット名> --key test.txt --legal-hold Status=ON
get-object-legal-hold
するとエラーにならずリーガルホールドのステータスを確認することができました。
$ aws s3api get-object-legal-hold --bucket <バケット名> --key test.txt "LegalHold": { "Status": "ON" } }
おわりに
各オブジェクトのリーガルホールドを有効化するスクリプトを考える場合、まずはリーガルホールドのステータスを確認しようと思うのではないでしょうか。
マネジメントコンソール上ではリーガルホールドの設定が無効に見えていても、以下の2つのケースがあるようです。気をつけてください。
- リーガルホールドを一度も設定変更しておらず無効となっている(
ObjectLockConfiguration
が存在しない) - リーガルホールドを有効から無効に変更した(
ObjectLockConfiguration
が存在する)
本エントリがどなたかのお役に立てれば幸いです。