さくらのクラウド オブジェクトストレージをAmazon S3互換APIで使う ~第3回:バケットバージョニングを使ってみよう

Amazon S3互換APIを備えているさくらのクラウドのオブジェクトストレージ。前回までの記事ではAWS CLIのほか、curlコマンドや、JavaScriptのコードからAWS SDKで呼び出す方法を紹介しました。

今回は、バケットバージョニング機能を呼び出す方法を解説します。

バケットバージョニングとは?

バケットバージョニングは、バケット内で複数のバージョンのオブジェクトを保持できる仕組みです。この機能を有効にすることで、意図しない上書きや削除が実行された場合でも、復旧・復元が可能になります。 詳しくは記事末に掲載したAWSのドキュメントなどを参照してください。

さくらのクラウドのオブジェクトストレージでは、バケットバージョニング機能をAmazon S3互換APIからのみ操作できます。この記事では、連載第1回でも取り上げたAWS CLIによる使用例を紹介します。

👉 さくらのクラウド オブジェクトストレージをAmazon S3互換APIで使う ~第1回:AWS CLIから利用してみよう~

バージョニングステータスを確認する

バケットバージョニングでは、バケットごとに「有効」「無効」「停止」の3つの状態(バージョニングステータス)があり、S3API:GetBucketVersioning を使用して取得できます。次の実行例では「example」という名前のバケットに対して、それぞれの状態での戻り値を示しています。

バージョニングが有効(Enabled)の場合、次のようなJSONが返されます。

$ aws --endpoint-url="https://s3.isk01.sakurastorage.jp" \
 s3api get-bucket-versioning --bucket example
{
    "Status": "Enabled"
}

バージョニングが一時停止(Suspended)の場合には次の戻り値になります。

$ aws --endpoint-url="https://s3.isk01.sakurastorage.jp" \
 s3api get-bucket-versioning --bucket example
{
    "Status": "Suspended"
}

また、バージョニングが無効(Unversioned)の場合には戻り値がありません。

$ aws --endpoint-url="https://s3.isk01.sakurastorage.jp" \
 s3api get-bucket-versioning --bucket example

バージョニングを有効あるいは一時停止する

バケットごとのバージョニングステータスは S3API:PutBucketVersioning を使用して変更できます。

次のコマンドで、バケット「example」のバージョニングを有効(Enabled)にできます。

$ aws --endpoint-url="https://s3.isk01.sakurastorage.jp" \
 s3api put-bucket-versioning --bucket example \
 --versioning-configuration Status=Enabled

バージョニングを一時停止(Suspended)状態にするには次を実行します。

$ aws --endpoint-url="https://s3.isk01.sakurastorage.jp" \
 s3api put-bucket-versioning --bucket example \
 --versioning-configuration Status=Suspended

なお、どちらも戻り値はありません。

オブジェクトのバージョン一覧を取得する

バージョニングされたオブジェクトでは S3API:ListObjectVersions を使用してバージョン一覧を取得できます。

次の実行例では、バケット「example」のオブジェクト「test0001-cp.png」のバージョン一覧が表示されています。Versions には2つのJSONオブジェクトがあり、1つ目が "IsLatest": true となっていることから最新バージョンであることが分かります。2つ目は以前のバージョンです。

$ aws --endpoint-url="https://s3.isk01.sakurastorage.jp" \
 s3api list-object-versions --bucket example \
 --prefix test0001-cp.png
{
    "Versions": [
        {
            "ETag": "\\"824154963b82c7f725b058da598a4e20\\"",
            "Size": 2844633,
            "StorageClass": "STANDARD",
            "Key": "test0001-cp.png",
            "VersionId": "39383331303836383534303238353939393939395333503031202039332e3132303535343037352e313336",
            "IsLatest": true,
            "LastModified": "2023-07-08T03:10:59.637000+00:00",
            "Owner": {
                "DisplayName": "",
                "ID": ""
            }
        },
        {
            "ETag": "\\"824154963b82c7f7250b85da598a4e20\\"",
            "Size": 28446009,
            "StorageClass": "STANDARD",
            "Key": "test0001-cp.png",
            "VersionId": "null",
            "IsLatest": false,
            "LastModified": "2023-07-04T05:50:52.894000+00:00",
            "Owner": {
                "DisplayName": "",
                "ID": ""
            }
        }
    ]
}

なお、通常のオブジェクトリスト取得API(S3API:ListObjects)では取得できないので注意してください。

バージョニングされたオブジェクトを削除する

バージョニングされたオブジェクトをS3API:DeleteObject を使用して削除することができます。このAPIは VersionId を指定するかどうかで、次のように動作が異なります。

VersionId説明
指定する指定した任意のバージョンを削除する
指定しない最新のバージョンを削除する

次の実行例では、先ほどバージョンを取得したバケット「example」のオブジェクト「test0001-cp.png」について、1つ目のJSONオブジェクトの VersionId を指定して削除しています。

$ aws --endpoint-url="https://s3.isk01.sakurastorage.jp" \
  s3api delete-object--bucket example --key test0001-cp.png \
 --version-id 39383331303836383534303238353939393939395333503031202039332e3132303535343037352e313336
{
    "VersionId": "39383331303836383534303238353939393939395333503031202039332e3132303535343037352e313336"
}

削除に成功すると、削除された VersionId が応答として返されます。

特定のバージョンのオブジェクトを取得する

バージョニングされたオブジェクトを S3API:GetObject を使用して取得できます。削除と同じように、任意のバージョンを VersionId で指定します。

次の実行例では、先ほどバージョンを取得したバケット「example」のオブジェクト「test0001-cp.png」について、指定されたバージョンを取得してローカルファイルの /tmp/outputfile.png に保存します。

$ aws --endpoint-url="https://s3.isk01.sakurastorage.jp" \
 s3api get-object --bucket example --key test0001-cp.png \
 --version-id 39383331303836383534303238353939393939395333503031202039332e3132303535343037352e313336 \
 /tmp/outputfile.png
{
    "AcceptRanges": "bytes",
    "LastModified": "2025-12-12T02:46:35+00:00",
    "ContentLength": 9907,
    "ETag": "\"e2e4fdc495a044d2360ed417bb611fa9\"",
    "VersionId": "39383331303836383534303238353939393939395333503031202039332e3132303535343037352e313336"
    "Metadata": {}
}

特定のバージョンでオブジェクトを復元する

特定のバージョンのオブジェクトを S3API:CopyObject を使用して復元できます。この copy-object はオブジェクトを汎用的にコピーするAPIで、過去のバージョンを自分自体にコピーすることで、オブジェクトの復元を実現できます。

次の実行例では、先ほどバージョンを取得したバケット「example」のオブジェクト「test0001-cp.png」について、指定したバージョンからコピーしています。これまでに紹介したAPIと違って、コピー元を指定する --copy-source パラメータでオブジェクト名の後にクエリ文字列での VersionId を指定します。

$ aws --endpoint-url="https://s3.isk01.sakurastorage.jp" \
 s3api copy-object --bucket example --key test0001-cp.png \
 --copy-source "example/test0001-cp.png?versionid=39383331303836383534303238353939393939395333503031202039332e3132303535343037352e313336"
{
    "VersionId": "39383331303834363232313332323939393939395333503031202039332e3132303538383037322e313338",
    "CopyObjectResult": {
        "ETag": "\\"824154963b82c7f725b085da598a4e20\\"",
        "LastModified": "2023-07-10T09:22:58.631000+00:00"
    }
}

復元されたバージョンには新しい VersionId が付けられていることが戻り値から分かります。

なお S3API:CopyObject コマンドを使用するには、コピー元のバケットおよびオブジェクトの読み取り権限と、コピー先のバケットおよびオブジェクトへの書き込み権限の両方を持つアクセスキー・シークレットキーのペアが必要になります。その他の詳細は、記事末に掲載したAWSのドキュメントなどを参照してください。

まとめ

本記事では、簡単にですが、AWS CLIによりオブジェクトストレージのバケットバージョニングを操作する方法を紹介しました。バケットバージョニングを利用すれば、オブジェクトの意図しない上書きや削除が実行された場合でも、復旧・復元が可能になります。

なお、オブジェクトストレージは、データを保管する基本的な単位である「バケット」ごとに料金が発生します。バケットバージョニングを使用すると、オブジェクトを削除してもまだオブジェクトストレージ上には存在していることになり、費用が発生し続けます。適材適所でご利用いただくことを推奨します。

これを機会に、オブジェクトストレージをぜひ活用してください。

参考情報

さくらのクラウドのドキュメント

Amazon S3のドキュメント

関連記事

「さくらのクラウド オブジェクトストレージ」シリーズ