S3オブジェクトロックのリーガルホールドをCLIから設定する

S3オブジェクトロックのリーガルホールドをCLIから設定してみました。
2020.11.02

こんにちは、岩城です。

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が存在する)

本エントリがどなたかのお役に立てれば幸いです。