[アップデート]Amazon S3のListObjects APIでオブジェクトの復元状況が取得できるようになりました。

2023.06.30

初めに

昨日のアップデートでAmazon S3のListObjects API(v2を含む)にGlacier Flexible Retrieval及びGlacier Deep Archiveに格納しているオブジェクトの復元状況が参照できるようになりました。

従来復元状況を確認したい場合はHeadObject APIを個々のファイルに発行し確認する必要があったため、まとめて多数のファイルの復元状況を取得したい場合は、ListObjects等で対象のファイルを取得の上でHeadObjectを個々のファイルに発行し取得する必要がありました。

単純に一覧で復元状態を確認したいだけでも少し書き込む必要があり手間だったのですが、今後はListObjects一発で取得できるようになります。

各種SDKはまだ確認していないのですが、AWS CLIは既に対応されていることが確認できたのでこちらを使い試してみます。

バージョン

% aws --version
aws-cli/2.12.5 Python/3.11.4 Darwin/22.5.0 exe/x86_64 prompt/off

準備

事前Glacier Flexible Retrievalクラスに格納したオブジェクトと、比較用にスタンダードクラスに格納したオブジェクトを用意しておきます。

※ 内容は特に今回関係ないですが過去の記事執筆の際に使ったファイルです

指定するオプションについて

https://docs.aws.amazon.com/cli/latest/reference/s3api/list-objects-v2.html
--optional-object-attributes (list)
Specifies the optional fields that you want returned in the response. Fields that you do not specify are not returned.
(string)
Syntax:
"string" "string" ...
Where valid values are:
RestoreStatus

今回追加された設定値はREST APIではx-amz-optional-object-attributesヘッダ、AWS CLIの場合は--optional-object-attributesオプションが該当します。

こちらに特定の値を指定することで指定した値に応じて追加の属性を取得することが可能です。

指定可能な値については現時点では今回追加されたRestoreStatusのみとなりますが、将来的に追加の情報取得が追加される場合はこちらに指定可能なパラメータが増えていくのかもしれません。

RestoreStatusを指定することで追加で取得可能な属性は以下のとおりです。

  • RestoreStatus
    • IsRestoreInProgress (bool)
      • 復元中(true)か復元が完了(false)しているか
      • 復元を行っていない場合RestoreStatusの属性自体がなくなるようです
    • RestoreExpiryDate
      • 取り出しの有効期限

https://docs.aws.amazon.com/cli/latest/reference/s3api/head-object.html
x-amz-restore: ongoing-request="false", expiry-date="Fri, 21 Dec 2012 00:00:00 GMT"

キー名やフォーマットは異なりますがhead-object実行時と同等の意味合いを持つ情報が取得できるようです。

実行

特にオプションを指定しない場合

こちらが通常通りの取得となります。

% aws s3api list-objects-v2 --bucket xxxxxxx
{
    "Contents": [
        {
            "Key": "2023-05-14-16-26-02-1D384C99934A41C4",
            "LastModified": "2023-05-14T16:26:03+00:00",
            "ETag": "\"7ca1af06731da10aceebfe4e490a055b\"",
            "Size": 4171,
            "StorageClass": "STANDARD"
        },
        {
            "Key": "bimi-logo.svg",
            "LastModified": "2023-06-30T08:56:34+00:00",
            "ETag": "\"374b9fe645f998dace2413a231443284\"",
            "Size": 4722,
            "StorageClass": "GLACIER"
        }
    ],
    "RequestCharged": null
}

復元を行っていない状態ででオプションをつけた場合

--optional-object-attributesオプションをつけた場合でも復元中もしくは取り出し可能ではない場合は、追加の属性は取得できないようです。

% aws s3api list-objects-v2 --bucket xxxxxxx --optional-object-attributes="RestoreStatus"
{
    "Contents": [
        {
            "Key": "2023-05-14-16-26-02-1D384C99934A41C4",
            "LastModified": "2023-05-14T16:26:03+00:00",
            "ETag": "\"7ca1af06731da10aceebfe4e490a055b\"",
            "Size": 4171,
            "StorageClass": "STANDARD"
        },
        {
            "Key": "bimi-logo.svg",
            "LastModified": "2023-06-30T08:56:34+00:00",
            "ETag": "\"374b9fe645f998dace2413a231443284\"",
            "Size": 4722,
            "StorageClass": "GLACIER"
        }
    ],
    "RequestCharged": null
}

復元中かつオプションをつけた場合

IsRestoreInProgress: trueとなっており復元中であることが確認できます。

なお完了するとRestoreExpiryDate属性が付与されるようで、復元中の場合はRestoreExpiryDate属性自体が存在しないようです。

% aws s3api list-objects-v2 --bucket xxxxxxx --optional-object-attributes="RestoreStatus"
{
    "Contents": [
        {
            "Key": "2023-05-14-16-26-02-1D384C99934A41C4",
            "LastModified": "2023-05-14T16:26:03+00:00",
            "ETag": "\"7ca1af06731da10aceebfe4e490a055b\"",
            "Size": 4171,
            "StorageClass": "STANDARD"
        },
        {
            "Key": "bimi-logo.svg",
            "LastModified": "2023-06-30T08:56:34+00:00",
            "ETag": "\"374b9fe645f998dace2413a231443284\"",
            "Size": 4722,
            "StorageClass": "GLACIER",
            "RestoreStatus": {
                "IsRestoreInProgress": true
            }
        }
    ],
    "RequestCharged": null
}

復元が完了している状態でオプションをつけた場合

IsRestoreInProgressfalseとなっており、合わせてIsRestoreInProgressで取得可能な有効期限を確認することができます。

% aws s3api list-objects-v2 --bucket xxxxxxx --optional-object-attributes="RestoreStatus"
{
    "Contents": [
        {
            "Key": "2023-05-14-16-26-02-1D384C99934A41C4",
            "LastModified": "2023-05-14T16:26:03+00:00",
            "ETag": "\"7ca1af06731da10aceebfe4e490a055b\"",
            "Size": 4171,
            "StorageClass": "STANDARD"
        },
        {
            "Key": "bimi-logo.svg",
            "LastModified": "2023-06-30T08:56:34+00:00",
            "ETag": "\"374b9fe645f998dace2413a231443284\"",
            "Size": 4722,
            "StorageClass": "GLACIER",
            "RestoreStatus": {
                "IsRestoreInProgress": false,
                "RestoreExpiryDate": "2023-07-02T00:00:00+00:00"
            }
        }
    ],
    "RequestCharged": null
}

終わりに

これまでちょっと手の込んだことをしないといけない処理がサクッと1コマンドでできるようになる嬉しいアップデートとなりました。

必要以上に属性が取れてしまうと邪魔なこともあるので、オプションで取得する形式となっているのもいいですね。

執筆時点ではまだマネジメントコンソールのバケットの中の表示設定でプロパティに復元状況のような物は見当たりませんが、APIに来ている以上そのうちマネジメントコンソール上からも確認できるようになる可能性もあるかなと期待しています。