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

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

最終更新日:Jul 29, 2026

バージョン管理は、オブジェクトが上書きまたは削除されたときに履歴バージョンを保持することで、バケットレベルでデータを保護し、任意のオブジェクトを以前のバージョンに復元できるようにします。

ユースケース

データを保護するために、次のシナリオでバージョン管理を使用します。

  • 誤ったデータ削除

    Object Storage Service (OSS) にはゴミ箱機能がないため、バージョン管理は誤って削除されたデータを回復するための主要な方法です。

  • ファイルの上書き

    頻繁に変更されるファイル (クラウドドライブ、共同作業ツールなど) の場合、バージョン管理によって以前のバージョンを取得できます。

注意事項

  • 課金

    バージョン管理自体は無料です。ただし、すべてのオブジェクトバージョン (現在および履歴) にはストレージ料金が発生します。ライフサイクルルールを使用して、不要な履歴バージョンを自動的に削除します。詳細については、「ライフサイクルルール」をご参照ください。履歴バージョンのダウンロードまたは復元によるリクエストとトラフィックも課金対象となります。課金と請求

  • 権限

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

  • 相互排他的な機能

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

    • オブジェクトの上書きを禁止するルールは有効になりません。オブジェクトの上書きの禁止

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

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

    同じバケットで OSS-HDFS サービスとバージョン管理を有効にしないでください。これにより、サービスの不安定化につながる可能性があります。安定した運用を確保するため、できるだけ早くバージョン管理を一時停止し、削除マーカーをクリーンアップするためのライフサイクルルールを設定してください。

バージョン管理の状態

バケットのバージョン管理には、無効 (デフォルト)、有効、一時停止の 3 つの状態があります。

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

  • バージョン管理が有効な場合、OSS はオブジェクトの履歴バージョンを保持します。詳細については、「バージョン管理されたオブジェクトの管理」をご参照ください。

  • バージョン管理が一時停止されている場合、新しくアップロードされたオブジェクトは、同じ名前を持つオブジェクトの現在のバージョンを置き換えます。既存の履歴バージョンは保持されます。詳細については、「バージョン管理が一時停止されたバケット内のオブジェクトの管理」をご参照ください。

説明

すべてのオブジェクトバージョンにはストレージコストが発生します。ライフサイクルルールを使用して、バージョンを低コストのストレージクラス (低頻度アクセスやアーカイブなど) に移行したり、不要な履歴バージョンを削除したりします。詳細については、「最終更新時間に基づくライフサイクルルールとバージョン管理を組み合わせてストレージコストを削減する」をご参照ください。

データ保護

次の表は、バージョン管理の状態によってオブジェクトの上書きと削除の動作がどのように異なるかを示しています。

バージョン管理の状態

オブジェクトの上書き

オブジェクトの削除

無効

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

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

有効

新しいバージョンが作成されます。履歴バージョンは影響を受けません。

オブジェクトに削除マーカーが作成されます。履歴バージョンは影響を受けず、復元できます。

一時停止

新しいバージョンが作成されます。一時停止期間中に同じオブジェクトのバージョンが既に存在する場合、新しいバージョンはそれを上書きします。他の履歴バージョンは影響を受けません。

オブジェクトに削除マーカーが作成されます。一時停止期間中に同じオブジェクトの削除マーカーが既に存在する場合、新しいマーカーはそれを上書きします。他の履歴バージョンは影響を受けません。

バージョン管理の有効化

OSS コンソールの使用

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

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

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

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

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

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

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

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

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

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

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

    4. 表示されるダイアログボックスで、[有効化の確認] をクリックします。

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

Alibaba Cloud 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;

// バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを 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();

// 署名アルゴリズム V4 を使用します。
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 コマンドラインインターフェイスの使用

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 の概要

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;
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";
// クライアントが V4 署名を使用するように設定します。
var conf = new ClientConfiguration();
conf.SignatureVersion = SignatureVersion.V4;
// V4 署名で OSSClient を初期化します。
var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf);
try
{
    // バケットのバージョン管理状態を Suspended に設定します。
    client.SetBucketVersioning(new SetBucketVersioningRequest(bucketName, VersioningStatus.Suspended));
    Console.WriteLine("SetBucketVersioning succeeded");
}
catch (Exception ex)
{
    Console.WriteLine("SetBucketVersioning 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 を使用して、バケットのバージョン管理状態を設定します。ossutil のインストール方法については、「ossutil のインストール」をご参照ください。

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

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

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

バージョンの表示

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

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

ossutil api list-object-versions --bucket examplebucket

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

バージョンの復元

OSS コンソールの使用

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

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

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

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

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

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

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

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

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

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

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

関連 API オペレーション

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

保持ポリシーとの連携

バックアップ保護 (Veeam)、資産変更の追跡 (回路設計図)、またはコンプライアンスアーカイブ (金融) などのシナリオでは、すべての履歴バージョンを不変に保ちながら、データ更新を許可する必要がある場合があります。バージョン管理と保持ポリシーの両方を有効にします。バージョン管理は上書きまたは削除時に履歴バージョンを保持し、保持ポリシーは保護期間中にどのバージョンも削除または変更されるのを防ぎます。

バージョン管理と保持ポリシーは、次の原則に基づいて連携します:

  • 機能の有効化の順序:バージョン管理と保持ポリシーは、任意の順序で有効にできます。

  • 許可される構成

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

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

  • 制限事項:

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

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

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

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

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

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

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

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

  • データレプリケーションとの相互作用:

    • 送信元バケットと送信先バケットの両方で、バージョン管理と保持ポリシーの独立した構成がサポートされています。

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

    • 送信先バケットでレプリケートされたバージョンを削除しようとすると、保持ポリシーによって保護されている場合は失敗しますが、ポリシーの有効期限が切れた後は成功します。

参考資料