すべてのプロダクト
Search
ドキュメントセンター

Object Storage Service:データ復元とバージョン管理のためのバージョン管理の有効化

最終更新日:Dec 11, 2025

バージョン管理は、バケットのデータ保護機能です。バージョン管理を有効にすると、OSS はオブジェクトの上書き操作と削除操作を履歴バージョンとして保存します。誤ってオブジェクトを上書きまたは削除した場合でも、任意の履歴バージョンに復元できます。

利用シーン

データをより良く保護するために、以下のシナリオでバージョン管理を使用することを推奨します。

  • 誤ったデータ削除

    OSS にはゴミ箱機能がありません。OSS からデータを削除して復元したい場合は、バージョン管理を使用してデータを復元できます。

  • ファイルの上書き

    クラウドドライブやオンラインコラボレーションツールなど、ファイルが頻繁に変更されるプロダクトでは、ファイルの編集によって多くの一次的なバージョンが作成されます。バージョン管理を使用すると、特定の時点のバージョンを取得できます。

注意事項

  • 課金

    バージョン管理機能は無料です。ただし、オブジェクトのカレントバージョンとすべての履歴バージョンのストレージに対して課金されます。不要なストレージコストを避けるため、ライフサイクルルールを使用して不要になった履歴バージョンを速やかに削除できます。詳細については、「ライフサイクル」をご参照ください。また、履歴バージョンをダウンロードまたは復元する際には、リクエストとトラフィックに対して課金されます。課金の詳細については、「測定と課金」をご参照ください。

  • 権限

    バケットのオーナー、および `PutBucketVersioning` 権限を持つ Resource Access Management (RAM) ユーザーのみがバージョン管理を設定できます。

  • 相互排他的な機能

    バケットのバージョン管理が有効または一時停止の場合:

    • オブジェクトの上書きを禁止するルールは有効になりません。詳細については、「オブジェクトの上書き禁止」をご参照ください。

    • アップロード中にオブジェクトの上書きを防ぐために使用される x-oss-forbid-overwrite リクエストヘッダーは有効になりません。詳細については、「PutObject」をご参照ください。

  • バージョン管理と OSS-HDFS

    OSS-HDFS とバージョン管理を同時に同じバケットで有効にしないでください。有効にすると、OSS-HDFS が期待どおりに動作しない可能性があります。OSS-HDFS の安定性を確保するためには、できるだけ早くバージョン管理を一時停止し、ライフサイクルルールを設定して削除マーカーを削除する必要があります。

バージョン管理の状態

バケットのバージョン管理の状態は、「無効」、「有効」、「一時停止」の 3 つのいずれかになります。

  • デフォルトでは、バケットのバージョン管理は無効になっています。バケットのバージョン管理を有効にすると、バケットを無効状態に戻すことはできません。ただし、バケットのバージョン管理を一時停止することはできます。

  • バケットのバージョン管理が有効な場合、OSS は新しくアップロードされた各オブジェクトのバージョン ID として、グローバルに一意なランダム文字列を生成します。バージョン管理が有効な場合のオブジェクト操作の詳細については、「バージョン管理が有効な場合のオブジェクト操作」をご参照ください。

  • バケットのバージョン管理が一時停止している場合、OSS は新しくアップロードされた各オブジェクトのバージョン ID として、特別な文字列「null」を生成します。バージョン管理が一時停止している場合のオブジェクト操作の詳細については、「バージョン管理が一時停止している場合のオブジェクト操作」をご参照ください。

説明

バケットのバージョン管理を有効にすると、オブジェクトの各バージョンが保存されます。各バージョンはストレージ容量を消費し、オブジェクトのすべてのバージョンに対してストレージ料金が課金されます。シナリオに基づいてライフサイクルルールを使用し、カレントバージョンまたは履歴バージョンを低頻度アクセスまたはアーカイブストレージクラスに移行し、不要になった履歴バージョンを削除することができます。これにより、ストレージコストを削減できます。詳細については、「バージョン管理が有効な場合に最終更新時間に基づいてライフサイクルルールを使用してストレージコストを削減する」をご参照ください。

データ保護

次の表は、さまざまなバージョン管理の状態におけるオブジェクトの上書きと削除を OSS がどのように処理するかを説明しています。これは、バージョン管理のデータ保護メカニズムを理解するのに役立ちます。

バージョン管理の状態

オブジェクトの上書き

オブジェクトの削除

無効

既存のオブジェクトは上書きされ、復元できません。オブジェクトの最新バージョンのみを取得できます。

オブジェクトは完全に削除され、取得できません。

有効

オブジェクトに新しいバージョン ID が追加されます。履歴バージョンは影響を受けません。

オブジェクトに削除マーカーが追加されます。削除マーカーにはグローバルに一意なバージョン ID があります。履歴バージョンは影響を受けません。

一時停止

オブジェクトにバージョン ID が「null」の新しいバージョンが作成されます。

バージョン ID が「null」のオブジェクトの履歴バージョンまたは削除マーカーが既に存在する場合、それは新しい「null」バージョンによって上書きされます。バージョン ID が「null」でないオブジェクトの他のバージョンまたは削除マーカーは影響を受けません。

オブジェクトにバージョン ID が「null」の削除マーカーが作成されます。

バージョン ID が「null」のオブジェクトの履歴バージョンまたは削除マーカーが既に存在する場合、それは新しい削除マーカーによって上書きされます。バージョン ID が「null」でないオブジェクトの他のバージョンまたは削除マーカーは影響を受けません。

以下の図は、バケットのバージョン管理が有効または一時停止の場合に、同じ名前のオブジェクトのアップロードまたはオブジェクトの削除を OSS がどのように処理するかを示しています。図中のバージョン番号は簡略化されています。

  • バージョン管理が有効な場合のオブジェクト上書き操作

    バージョン管理が有効なバケットにオブジェクトを繰り返しアップロードすると、各アップロード操作で一意のバージョン ID を持つ新しいバージョンのオブジェクトが作成されます。

    1

  • バージョン管理が有効な場合のオブジェクト削除操作

    バージョン管理が有効なバケットからオブジェクトを削除しても、その履歴バージョンは物理的に削除されません。代わりに、OSS は削除マーカーを作成し、それがオブジェクトのカレントバージョンになります。同じ名前のオブジェクトを再度アップロードすると、新しいバージョン ID を持つ新しいバージョンが作成されます。

    2

  • バージョン管理が一時停止している場合のオブジェクト上書き操作

    バージョン管理が一時停止しているバケットにオブジェクトをアップロードすると、その履歴バージョンは保持されます。新しくアップロードされたオブジェクトがカレントバージョンになり、バージョン ID は「null」になります。同じ名前のオブジェクトを再度アップロードすると、新しいオブジェクトはバージョン ID が「null」の以前のバージョンを上書きします。

    3

  • バージョン管理が一時停止している場合のオブジェクト削除操作

    バージョン管理が一時停止しているバケットからオブジェクトを削除しても、その履歴バージョンは物理的に削除されません。代わりに、OSS は削除マーカーを作成し、それがオブジェクトのカレントバージョンになります。

    4

上記の図に示すように、バケットのバージョン管理が有効または一時停止の場合、上書きおよび削除操作によって履歴バージョンが作成されます。誤ってオブジェクトを上書きまたは削除した場合でも、任意の履歴バージョンに復元できます。

バージョン管理の有効化

OSS コンソールの使用

バケットのバージョン管理が有効な場合、OSS はバケットに保存されているオブジェクトの各バージョンに一意の ID を指定します。

  • バケット作成時にバージョン管理を有効にする

    1. OSS コンソールにログインします。

    2. バケット をクリックし、次に [バケットの作成] をクリックします。

    3. [バケットの作成] ページで、パラメーターを設定します。

      [バージョン管理] セクションで、バージョン管理スイッチを [有効] に設定します。デフォルトでは、この機能は [無効] です。他のパラメーターの詳細については、「バケットの作成」をご参照ください。

    4. [OK] をクリックします。

  • 既存のバケットでバージョン管理を有効にする

    1. 左側のナビゲーションウィンドウで バケット をクリックします。[バケット] ページで、目的のバケットを見つけてクリックします。

    2. 左側のナビゲーションウィンドウで、コンテンツセキュリティ > バージョン管理 を選択します。

    3. バージョン管理 ページで、有効化 をクリックします。

    4. 表示されるダイアログボックスで、OK をクリックします。

バージョン管理を有効にした後、オブジェクト ページで、以前のバージョン の横にある 表示 をクリックして、すべてのファイルバージョンを表示できます。ファイルの現在のバージョンのみを表示するには、以前のバージョン の横にある 非表示 をクリックします。履歴バージョンを非表示にしても、ファイルのリスト表示のパフォーマンスは向上しません。ファイルのリスト表示時にページの応答が遅い場合は、「応答速度が遅い」を参照して問題をトラブルシューティングし、解決してください。

Alibaba Cloud SDK の使用

以下のコードは、一般的な SDK を使用してバージョン管理を有効にする方法の例を示しています。他の SDK を使用してバージョン管理を有効にする方法の詳細については、「SDK の概要」をご参照ください。

import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.*;

public class Demo {
    public static void main(String[] args) throws Exception {
        // エンドポイントを設定します。ここでは中国 (杭州) を例としていますが、実際のエンドポイントに設定してください。
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // バケットが配置されているリージョンを指定します。例:cn-hangzhou。
        String region = "cn-hangzhou";
        // 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // バケット名を指定します。例:examplebucket。
        String bucketName = "examplebucket";

        // OSSClient インスタンスを作成します。
        // OSSClient インスタンスが不要になったら、shutdown メソッドを呼び出してリソースを解放します。
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        // V4 署名アルゴリズムを使用することを明示的に宣言します。
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
        OSS ossClient = OSSClientBuilder.create()
                .endpoint(endpoint)
                .credentialsProvider(credentialsProvider)
                .clientConfiguration(clientBuilderConfiguration)
                .region(region)
                .build();

        try {
            // バージョン管理を有効にします。
            BucketVersioningConfiguration configuration = new BucketVersioningConfiguration();
            configuration.setStatus(BucketVersioningConfiguration.ENABLED);
            SetBucketVersioningRequest request = new SetBucketVersioningRequest(bucketName, configuration);
            ossClient.setBucketVersioning(request);
        } catch (OSSException oe) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason.");
            System.out.println("Error Message:" + oe.getErrorMessage());
            System.out.println("Error Code:" + oe.getErrorCode());
            System.out.println("Request ID:" + oe.getRequestId());
            System.out.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + "such as not being able to access the network.");
            System.out.println("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}
<?php
if (is_file(__DIR__ . '/../autoload.php')) {
    require_once __DIR__ . '/../autoload.php';
}
if (is_file(__DIR__ . '/../vendor/autoload.php')) {
    require_once __DIR__ . '/../vendor/autoload.php';
}

use OSS\OssClient;
use OSS\Core\OssException;

// 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
$accessKeyId = getenv("OSS_ACCESS_KEY_ID");
$accessKeySecret = getenv("OSS_ACCESS_KEY_SECRET");
// エンドポイントを設定します。ここでは杭州を例としていますが、実際のエンドポイントに設定してください。
$endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
$bucket= "yourBucketName";

$ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);

try {
    // バージョン管理を有効にします。
    $ossClient->putBucketVersioning($bucket, "Enabled");
} catch (OssException $e) {
    printf(__FUNCTION__ . ": FAILED\n");
    printf($e->getMessage() . "\n");
    return;
}

print(__FUNCTION__ . ": OK" . "\n");
const OSS = require("ali-oss");

const client = new OSS({
  // バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを oss-cn-hangzhou に設定します。
  region: "oss-cn-hangzhou",
  // 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
  accessKeyId: process.env.OSS_ACCESS_KEY_ID,
  accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
  // バケット名を指定します。例:examplebucket。
  bucket: "examplebucket",
});

async function putBucketVersioning() {
  // バージョン管理を有効にします。
  const status = "Enabled";
  const result = await client.putBucketVersioning("examplebucket", status);
  console.log(result);
}
putBucketVersioning();
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
from oss2.models import BucketVersioningConfig
# 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# バケットが配置されているリージョンに基づいてエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
# yourBucketName をバケットの名前に設定します。
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'yourBucketName')

# バケットのバージョン管理設定を作成します。
config = BucketVersioningConfig()
# バージョン管理を有効にします。
config.status = oss2.BUCKET_VERSIONING_ENABLE

result = bucket.put_bucket_versioning(config)
# HTTP ステータスコードを表示します。
print('http response code:', result.status)
using Aliyun.OSS;
using Aliyun.OSS.Common;

// yourEndpoint をバケットが配置されているリージョンのエンドポイントに置き換えます。たとえば、中国 (杭州) リージョンの場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
var endpoint = "yourEndpoint";
// 環境変数からアクセス認証情報を取得します。このコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
// バケット名を入力します。例:examplebucket。
var bucketName = "examplebucket";
// バケットが配置されているリージョンを入力します。たとえば、中国 (杭州) リージョンの場合、cn-hangzhou と入力します。
const string region = "cn-hangzhou";

// ClientConfiguration インスタンスを作成し、必要に応じてデフォルトのパラメーターを変更します。
var conf = new ClientConfiguration();

// 署名バージョン 4 を設定します。
conf.SignatureVersion = SignatureVersion.V4;

// OssClient インスタンスを作成します。
var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf);
client.SetRegion(region);
try
{
    // バケットのバージョン管理状態を Enabled に設定します。
    client.SetBucketVersioning(new SetBucketVersioningRequest(bucketName, VersioningStatus.Enabled));
    Console.WriteLine("Create bucket Version succeeded");
}
catch (Exception ex)
{
    Console.WriteLine("Create bucket Version failed. {0}", ex.Message);
}
package main

import (
  "fmt"
  "os"

  "github.com/aliyun/aliyun-oss-go-sdk/oss"
)

func main() {
    // 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
    provider, err := oss.NewEnvironmentVariableCredentialsProvider()
    if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }

    // OSSClient インスタンスを作成します。
    // yourEndpoint をバケットが配置されているリージョンのエンドポイントに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。エンドポイントを実際のものに設定してください。
    client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))
    if err != nil {
       fmt.Println("Error:", err)
       os.Exit(-1)
  }

  // バケットを作成します。
  // yourBucketName をバケットの名前に設定します。
  err = client.CreateBucket("yourBucketName")
  if err != nil {
    fmt.Println("Error:", err)
    os.Exit(-1)
  }
  // 以下のコードは、バケットのバージョン管理状態を Enabled に設定する方法の例を示しています。
  config := oss.VersioningConfig{Status: "Enabled"}
  err = client.SetBucketVersioning("yourBucketName", config)
  if err != nil {
    fmt.Println("Error:", err)
    os.Exit(-1)
  }
}
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;

int main(void)
{
    /* OSS アカウント情報を初期化します。 */
            
    /* yourEndpoint をバケットが配置されているリージョンのエンドポイントに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。 */
    std::string Endpoint = "yourEndpoint";
    /* バケット名を指定します。例:examplebucket。 */
    std::string BucketName = "examplebucket";

    /* ネットワークリソースを初期化します。 */
    InitializeSdk();

    ClientConfiguration conf;
    /* 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。 */
    auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
    OssClient client(Endpoint, credentialsProvider, conf);

    /* バケットのバージョン管理設定を作成し、状態を Enabled に設定します。 */
    SetBucketVersioningRequest setrequest(BucketName, VersioningStatus::Enabled);
    auto outcome = client.SetBucketVersioning(setrequest);

    if (!outcome.isSuccess()) {
        /* 例外を処理します。 */
        std::cout << "SetBucketVersioning fail" <<
        ",code:" << outcome.error().Code() <<
        ",message:" << outcome.error().Message() <<
        ",requestId:" << outcome.error().RequestId() << std::endl;
        return -1;
    }

    /* ネットワークリソースを解放します。 */
    ShutdownSdk();
    return 0;
}

ossutil コマンドラインインターフェイスの使用

コマンドラインインターフェイス (CLI) である ossutil を使用して、指定したバケットのバージョン管理状態を設定できます。ossutil のインストール方法については、「ossutil のインストール」をご参照ください。

次のコマンドは、指定したバケットのバージョン管理を有効にします。

ossutil api put-bucket-versioning --bucket examplebucket --versioning-configuration "{\"Status\":\"Enabled\"}"

このコマンドの詳細については、「put-bucket-versioning」をご参照ください。

バージョン管理の一時停止

バケットで保持ポリシーが有効になっている場合、バージョン管理の状態を「有効」から「一時停止」に変更することはできません。ただし、状態を「一時停止」から「有効」に変更することはできます。

OSS コンソールの使用

バージョン管理が有効なバケットのバージョン管理を一時停止して、OSS がオブジェクトの新しいバージョンを生成するのを停止できます。バージョン管理が一時停止されたバケットでオブジェクトの新しいバージョンが生成された場合、OSS は新しいバージョンの ID を null に設定し、オブジェクトの以前のバージョンを保持します。

バケットのバージョン管理を一時停止するには、次の手順を実行します:

  1. 左側のナビゲーションウィンドウで バケット をクリックします。[バケット] ページで、目的のバケットを見つけてクリックします。

  2. 左側のナビゲーションウィンドウで、コンテンツセキュリティ > バージョン管理 を選択します。

  3. バージョン管理 ページで、一時停止 をクリックします。

  4. 表示されるダイアログボックスで、OK をクリックします。

Alibaba Cloud SDK の使用

以下のコード例は、一般的な SDK でバージョン管理を有効にする方法を示しています。他の SDK のコード例については、「SDK の概要」をご参照ください。

import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.*;

public class Demo {
    public static void main(String[] args) throws Exception {
        // エンドポイントを設定します。ここでは中国 (杭州) を例としていますが、実際のエンドポイントに設定してください。
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // バケットが配置されているリージョンを指定します。例:cn-hangzhou。
        String region = "cn-hangzhou";
        // 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // バケット名を指定します。例:examplebucket。
        String bucketName = "examplebucket";

        // OSSClient インスタンスを作成します。
        // OSSClient インスタンスが不要になったら、shutdown メソッドを呼び出してリソースを解放します。
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        // V4 署名アルゴリズムを使用することを明示的に宣言します。
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
        OSS ossClient = OSSClientBuilder.create()
                .endpoint(endpoint)
                .credentialsProvider(credentialsProvider)
                .clientConfiguration(clientBuilderConfiguration)
                .region(region)
                .build();

        try {
            // バージョン管理を一時停止します。
            BucketVersioningConfiguration configuration = new BucketVersioningConfiguration();
            configuration.setStatus(BucketVersioningConfiguration.SUSPENDED);
            SetBucketVersioningRequest request = new SetBucketVersioningRequest(bucketName, configuration);
            ossClient.setBucketVersioning(request);
        } catch (OSSException oe) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason.");
            System.out.println("Error Message:" + oe.getErrorMessage());
            System.out.println("Error Code:" + oe.getErrorCode());
            System.out.println("Request ID:" + oe.getRequestId());
            System.out.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + "such as not being able to access the network.");
            System.out.println("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}
<?php
if (is_file(__DIR__ . '/../autoload.php')) {
    require_once __DIR__ . '/../autoload.php';
}
if (is_file(__DIR__ . '/../vendor/autoload.php')) {
    require_once __DIR__ . '/../vendor/autoload.php';
}

use OSS\OssClient;
use OSS\Core\OssException;

// 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
$accessKeyId = getenv("OSS_ACCESS_KEY_ID");
$accessKeySecret = getenv("OSS_ACCESS_KEY_SECRET");
// エンドポイントを設定します。ここでは杭州を例としていますが、実際のエンドポイントに設定してください。
$endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
$bucket= "yourBucketName";

$ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);

try {
    // バージョン管理を一時停止します。
    $ossClient->putBucketVersioning($bucket, "Suspended");
} catch (OssException $e) {
    printf(__FUNCTION__ . ": FAILED\n");
    printf($e->getMessage() . "\n");
    return;
}

print(__FUNCTION__ . ": OK" . "\n");
const OSS = require("ali-oss");

const client = new OSS({
  // バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを oss-cn-hangzhou に設定します。
  region: "oss-cn-hangzhou",
  // 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
  accessKeyId: process.env.OSS_ACCESS_KEY_ID,
  accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
  // バケット名を指定します。例:examplebucket。
  bucket: "examplebucket",
});

async function putBucketVersioning() {
  // バージョン管理を一時停止します。
  const status = "Suspended";
  const result = await client.putBucketVersioning("examplebucket", status);
  console.log(result);
}
putBucketVersioning();
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
from oss2.models import BucketVersioningConfig
# 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# バケットが配置されているリージョンに基づいてエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
# yourBucketName をバケットの名前に設定します。
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'yourBucketName')

# バケットのバージョン管理設定を作成します。
config = BucketVersioningConfig()
# バージョン管理を一時停止します。
config.status = oss2.BUCKET_VERSIONING_SUSPEND

result = bucket.put_bucket_versioning(config)
# HTTP ステータスコードを表示します。
print('http response code:', result.status)
using Aliyun.OSS;
// yourEndpoint をバケットが配置されているリージョンのエンドポイントに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
var endpoint = "yourEndpoint";
// 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
// バケット名を指定します。例:examplebucket。
var bucketName = "examplebucket";
// OSSClient を初期化します。
var client = new OssClient(endpoint, accessKeyId, accessKeySecret);
try
{
    // バケットのバージョン管理状態を Suspended に設定します。
    client.SetBucketVersioning(new SetBucketVersioningRequest(bucketName, VersioningStatus.Suspended));
    Console.WriteLine("Create bucket Version succeeded");
}
catch (Exception ex)
{
    Console.WriteLine("Create bucket Version failed. {0}", ex.Message);
}
package main

import (
  "fmt"
  "os"

  "github.com/aliyun/aliyun-oss-go-sdk/oss"
)

func main() {
    // 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
    provider, err := oss.NewEnvironmentVariableCredentialsProvider()
    if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }

    // OSSClient インスタンスを作成します。
    // yourEndpoint をバケットが配置されているリージョンのエンドポイントに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。エンドポイントを実際のものに設定してください。
    client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))
    if err != nil {
       fmt.Println("Error:", err)
       os.Exit(-1)
  }

  // バケットを作成します。
  // yourBucketName をバケットの名前に設定します。
  err = client.CreateBucket("yourBucketName")
  if err != nil {
    fmt.Println("Error:", err)
    os.Exit(-1)
  }
  // バージョン管理を一時停止します。
  config := oss.VersioningConfig{Status: "Suspended"}
  err = client.SetBucketVersioning("yourBucketName", config)
  if err != nil {
    fmt.Println("Error:", err)
    os.Exit(-1)
  }
}
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;

int main(void)
{
    /* OSS アカウント情報を初期化します。 */
            
    /* yourEndpoint をバケットが配置されているリージョンのエンドポイントに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。 */
    std::string Endpoint = "yourEndpoint";
    /* バケット名を指定します。例:examplebucket。 */
    std::string BucketName = "examplebucket";

    /* ネットワークリソースを初期化します。 */
    InitializeSdk();

    ClientConfiguration conf;
    /* 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。 */
    auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
    OssClient client(Endpoint, credentialsProvider, conf);

    /* バケットのバージョン管理設定を作成し、状態を Suspended に設定します。 */
    SetBucketVersioningRequest setrequest(BucketName, VersioningStatus::Suspended);
    auto outcome = client.SetBucketVersioning(setrequest);

    if (!outcome.isSuccess()) {
        /* 例外を処理します。 */
        std::cout << "SetBucketVersioning fail" <<
        ",code:" << outcome.error().Code() <<
        ",message:" << outcome.error().Message() <<
        ",requestId:" << outcome.error().RequestId() << std::endl;
        return -1;
    }

    /* ネットワークリソースを解放します。 */
    ShutdownSdk();
    return 0;
}

ossutil コマンドラインインターフェイスの使用

ossutil CLI を使用して、指定したバケットのバージョン管理状態を設定できます。ossutil のインストール方法については、「ossutil のインストール」をご参照ください。

次のコマンドは、指定したバケットのバージョン管理を一時停止します。

ossutil api put-bucket-versioning --bucket examplebucket --versioning-configuration "{\"Status\":\"Suspended\"}"

このコマンドの詳細については、「put-bucket-versioning」をご参照ください。

バージョンの表示

ossutil CLI を使用して、オブジェクトのすべてのバージョンを表示できます。ossutil のインストール方法については、「ossutil のインストール」をご参照ください。

次のコマンドは、examplebucket バケット内のすべてのオブジェクトのすべてのバージョンに関する情報をリスト表示します。

ossutil api list-object-versions --bucket examplebucket

このコマンドの詳細については、「list-object-versions」をご参照ください。

バージョンの復元

OSS コンソールの使用

バージョン管理が有効なバケットからオブジェクトを削除しても、その履歴バージョンは物理的に削除されません。代わりに、削除マーカーが作成され、それがオブジェクトのカレントバージョンになります。その後、コンソールで以前のバージョンを復元できます。

  1. 左側のナビゲーションウィンドウで バケット をクリックします。[バケット] ページで、目的のバケットを見つけてクリックします。

  2. 左側のナビゲーションウィンドウで、オブジェクト管理 > オブジェクト を選択します。

  3. 以前のバージョン の横にある 表示 をクリックします。

  4. 復元したいバージョンを選択し、ページ下部の 回復 をクリックします。

  5. 表示されるダイアログボックスで、OK をクリックします。

ossutil コマンドラインインターフェイスの使用

ossutil CLI を使用して、削除されたファイルの履歴バージョンを復元できます。ossutil のインストール方法については、「ossutil のインストール」をご参照ください。

次のコマンドは、examplebucket バケット内の example.txt オブジェクトをバージョン 123 に復元します。

ossutil revert oss://examplebucket/example.txt 123

このコマンドの詳細については、「revert (バージョンの復元)」をご参照ください。

関連 API 操作

上記の手順は API 操作に基づいて実装されています。プログラムに高度なカスタマイズ要件がある場合は、REST API 操作を直接呼び出すことができます。そのためには、署名を計算するためのコードを手動で記述する必要があります。詳細については、「PutBucketVersioning」をご参照ください。

保持ポリシーとの連携

Veeam などのバックアップシステムのバージョン保護、回路設計図などの資産の変更履歴の追跡、金融業界のコンプライアンスアーカイブ要件への対応などのシナリオでは、継続的なデータ更新を許可しつつ、すべての履歴バージョンが不変であり削除できないようにする必要があります。これを実現するには、バケットに対してバージョン管理と保持ポリシーの両方を有効にします。バージョン管理は、オブジェクトが上書きまたは削除されたときに、その以前のバージョンが物理的に削除されるのではなく、履歴バージョンとして保持されることを保証します。保持ポリシーは、バケット内のすべてのオブジェクトバージョンに保護期間を設定します。この期間中、どのバージョンも削除または変更することはできません。

バージョン管理と保持ポリシーの両方を設定すると、それらは以下の原則に基づいて連携して動作します:

  • 機能の有効化順序:バージョン管理と保持ポリシーを有効にする順序に制約はありません。必要に応じて柔軟に設定できます。

  • 許可される設定

    • 保持ポリシー + バージョン管理無効

    • 保持ポリシー + バージョン管理有効

  • 制限事項:

    • バージョン管理が一時停止されているバケットに対して保持ポリシーを有効にすることはできません。

    • 保持ポリシーが有効になった後、バージョン管理の状態には以下の制限が適用されます:

      • 状態を「有効」から「一時停止」に変更することはできません。

      • 状態を「無効」から「一時停止」に変更することはできません。

  • オブジェクトバージョンの保護メカニズム

    • 保持ポリシーは、オブジェクトのすべてのバージョンを保護します。保護期間中、どのバージョンも削除または変更することはできません。

    • 同じ名前のオブジェクトをアップロードして新しいバージョンを作成することはできますが、新しいバージョンも保持ポリシーによって保護されます。

    • 保持ポリシーは削除マーカーには適用されません。削除マーカーのクリアは保持ポリシーによって制限されません。

  • データレプリケーションの連携

    • ソースバケットと宛先バケットの両方で、バージョン管理と保持ポリシーの独立した設定がサポートされています。

    • バージョン情報はレプリケーション中に正常に転送されます。宛先バケットは、独自の設定に基づいてバージョンを管理します。

    • 保持期間中に宛先バケット内のファイルを削除しようとすると、エラーが報告されます。保持期間後に削除すると、削除は成功します。

関連ドキュメント