この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
こんにちは、岩城です。
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
が存在する)
本エントリがどなたかのお役に立てれば幸いです。