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

Object Storage Service:バージョン管理されたオブジェクトの管理

最終更新日:May 08, 2026

バケットでバージョン管理を有効にすると、Object Storage Service (OSS) はバケット内の各オブジェクトバージョンに一意の ID を割り当てます。バージョン管理を有効にする前にバケット内に存在していたオブジェクトのコンテンツおよびアクセス制御リスト (ACL) は変更されません。また、バージョン管理により、誤ってオブジェクトが上書きまたは削除されるのを防ぎ、以前のバージョンを照会または復元できます。

注意事項

バージョン管理が有効なバケットにオブジェクトをアップロード、一覧表示、ダウンロード、削除、または復元する際は、以下の点にご注意ください。

  • OSS は、各オブジェクトに対して現在のバージョンとゼロ以上の過去バージョンを保持します。

  • バージョン管理を有効にする前にバケット内に存在していたオブジェクトのバージョン ID は null です。

  • わかりやすくするため、本トピックの図に示されているバージョン ID は簡略化されています。

  • オブジェクトを別のストレージクラスに移行するライフサイクルルールは、新しいバージョンを作成しません。

詳細については、「バージョン管理」をご参照ください。

オブジェクトのアップロード

バージョン管理が有効なバケットにオブジェクトをアップロードすると、OSS は自動的にアップロードされたオブジェクトに一意のバージョン ID を割り当てます。

説明

PutObject、PostObject、CopyObject、MultipartUpload などの操作は、新しく生成された各オブジェクトに自動的に一意のバージョン ID を割り当てます。

PUT 操作でオブジェクトをアップロードすると、OSS はそのオブジェクトに 111111 のような一意のバージョン ID を割り当てます。

同じ名前 (key=example.jpg) のオブジェクトを PUT 操作で再度アップロードすると、元のオブジェクトバージョン (ID=111111) は過去バージョンとなり、新しいバージョン (ID=222222) がバケット内に現在のバージョンとして保存されます。さらに同じ名前のオブジェクトをアップロードすると、元のオブジェクトバージョン (ID=111111 および ID=222222 を含む) はすべて過去バージョンとなり、新しいバージョン (ID=333333) がバケット内に現在のバージョンとして保存されます。

OSS コンソールを使用する

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

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

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

  4. オブジェクト ページで アップロード をクリックします。

  5. アップロード パネルで、次のパラメーターを設定します。

    1. 基本オプションを設定します。

      パラメーター

      説明

      アップロード先

      オブジェクトの保存パスを指定します。

      • カレントディレクトリ:オブジェクトを現在のディレクトリにアップロードします。

      • ディレクトリを指定する:オブジェクトを指定したディレクトリにアップロードします。ディレクトリ名を入力する必要があります。ディレクトリが存在しない場合、OSS は自動的にディレクトリを作成し、オブジェクトをそのディレクトリにアップロードします。

        ディレクトリ名は次の要件を満たす必要があります。

        • 名前は 1~254 文字で、UTF-8 エンコーディングである必要があります。

        • 名前はスラッシュ (/) またはバックスラッシュ (\) で始まってはいけません。

        • 名前には連続するスラッシュ (/) を含めることはできません。

        • 名前は 2 つの連続するピリオド (..) であってはいけません。

      ファイル ACL

      オブジェクトのアクセス制御リスト (ACL) を設定します。

      • バケットから継承:オブジェクトはバケットの ACL を継承します。

      • 非公開 (推奨):オブジェクト所有者のみがオブジェクトに対する読み取りおよび書き込み権限を持ちます。他のユーザーはオブジェクトにアクセスできません。

      • 公開読み取り:オブジェクト所有者はオブジェクトに対する読み取りおよび書き込み権限を持ちます。匿名ユーザーを含む他のユーザーはオブジェクトに対する読み取り権限のみを持ちます。これによりデータ漏えいや予期しない高額な料金が発生する可能性があるため、十分ご注意ください。

      • 公開読み書き:匿名ユーザーを含むすべてのユーザーがオブジェクトの読み取りおよび書き込みを行えます。この設定は重大なセキュリティリスクを伴います。悪意のあるユーザーが許可されていないコンテンツをオブジェクトに書き込む可能性があります。絶対に必要な場合以外は、パブリック読み取り/書き込み権限を付与しないでください。

      オブジェクト ACL の詳細については、「オブジェクト ACL」をご参照ください。

      アップロードするファイル

      アップロードするファイルまたはフォルダを選択します。

      ファイルの選択 または フォルダーの選択 をクリックして、ローカルのファイルまたはフォルダを選択します。ファイルまたはフォルダを アップロードするファイル 領域にドラッグすることもできます。

      選択したフォルダにアップロードしたくないファイルが含まれている場合は、リスト内で該当ファイルを見つけ、操作 列の [削除] をクリックします。

      重要
      • バージョン管理が無効なバケットに既存のオブジェクトと同じ名前のオブジェクトをアップロードすると、既存のオブジェクトは上書きされます。

      • バージョン管理が有効なバケットに既存のオブジェクトと同じ名前のオブジェクトをアップロードすると、新しいオブジェクトが現在のバージョンとなり、既存のオブジェクトは過去バージョンとなります。

    2. オプション: 詳細設定 の右側にある image.png アイコンをクリックして、ストレージクラスやサーバー側暗号化などの詳細オプションを設定します。

      パラメーター

      説明

      ストレージクラス

      オブジェクトのストレージクラスを設定します。有効値:

      • バケットから継承 (デフォルト):オブジェクトはバケットのストレージクラスを継承します。

      • スタンダード頻繁にアクセスされるデータ向けの信頼性が高く、可用性とパフォーマンスに優れたオブジェクトストレージを提供します。ソーシャルや共有画像アプリケーション、音声・動画アプリケーション、大規模 Web サイト、ビッグデータ分析など、さまざまなシナリオに適しています。標準ストレージクラスはゾーン冗長ストレージ (ZRS) およびローカル冗長ストレージ (LRS) をサポートしています。

      • [低頻度アクセス]ストレージコストを抑えた高耐久性のオブジェクトストレージサービスを提供します。課金対象となる最小サイズは 64 KB、最小保管期間は 30 日です。データはリアルタイムでアクセス可能ですが、データ取得料金が発生します。月に平均 1~2 回程度の低頻度アクセスシナリオに適しています。低頻度アクセスストレージクラスはゾーン冗長ストレージおよびローカル冗長ストレージをサポートしています。

      • アーカイブ極めて低いストレージコストで高耐久性のオブジェクトストレージサービスを提供します。課金対象となる最小サイズは 64 KB、最小保管期間は 60 日です。アーカイブオブジェクトは、まず復元してからアクセスする方法 (約 1 分かかります) と、直接アクセスする方法があります。いずれの場合も復元料金および直接読み取り料金が発生します。医療画像、科学資料、映像素材などの長期データアーカイブシナリオに適しています。アーカイブストレージクラスはゾーン冗長ストレージおよびローカル冗長ストレージをサポートしています。

      • [コールドアーカイブ]アーカイブよりも低いストレージコストで高耐久性のオブジェクトストレージサービスを提供します。課金対象となる最小サイズは 64 KB、最小保管期間は 180 日です。コールドアーカイブオブジェクトにアクセスするには、事前に復元する必要があります。復元時間はオブジェクトサイズおよび復元モードによって異なります。復元にはデータ取得料金およびリクエスト料金が発生します。コンプライアンス目的での長期保管が必要なデータ、ビッグデータおよび AI 分野で蓄積された生データ、映画・テレビ業界の長期メディアアセット、オンライン教育業界のアーカイブ動画など、長期間コールドデータを保管するシナリオに適しています。コールドアーカイブストレージクラスはローカル冗長ストレージのみをサポートしています。

      • [ディープコールドアーカイブ]コールドアーカイブよりも低いストレージコストで高耐久性のオブジェクトストレージサービスを提供します。課金対象となる最小サイズは 64 KB、最小保管期間は 180 日です。ディープコールドアーカイブオブジェクトにアクセスするには、事前に復元する必要があります。復元時間はオブジェクトサイズおよび復元モードによって異なります。復元にはデータ取得料金およびリクエスト料金が発生します。ビッグデータおよび AI 分野で蓄積された生データ、長期メディアアセット、規制当局およびコンプライアンスアーカイブ、テープ置き換えなど、極めてコールドなデータを長期間保管するシナリオに適しています。ディープコールドアーカイブストレージクラスはローカル冗長ストレージのみをサポートしています。

      詳細については、「ストレージクラス」をご参照ください。

      暗号化の方法

      オブジェクトのサーバ側暗号化方式を設定します。有効値:

      • バケットから継承 (デフォルト):オブジェクトはバケットのサーバ側暗号化方式を継承します。

      • [OSS 管理]:OSS は、OSS が管理する一意のキーを使用して各オブジェクトを暗号化します。さらに保護するために、これらのキー自体もマスターキーで暗号化されます。

      • [KMS]:KMS が管理するデフォルトのカスタマーマスターキー (CMK) または指定した CMK を使用して暗号化および復号を行います。

        KMS 暗号化を使用するには、事前に KMS を有効化する必要があります。詳細については、「専用 KMS インスタンスの購入」をご参照ください。

        CMK パラメーターについて以下に説明します。

        暗号鍵は <alias>(CMK ID) 形式で表されます。ここで、<alias> は CMK のエイリアス、CMK ID は CMK の ID です。有効値:

        • alias/acs/oss(CMK ID):デフォルトの KMS 管理 CMK を使用して、異なるオブジェクトを暗号化するための異なるキーを生成します。オブジェクトはダウンロード時に自動的に復号されます。

        • alias/<cmkname>(CMK ID):指定した CMK を使用して、各オブジェクトに一意の暗号鍵を生成します。オブジェクトのメタデータには CMK ID が保存されます。必要な権限を持つユーザーがオブジェクトをダウンロードすると、OSS は自動的に復号します。<cmkname> は、CMK 作成時に指定した CMK の任意のエイリアスです。

          指定した CMK ID を使用する前に、KMS コンソール でバケットと同じリージョンに通常のキーまたは外部キーを作成する必要があります。詳細については、「CMK の作成」をご参照ください。

      • 暗号化アルゴリズムAES256 のみサポートされています。

      ユーザー定義のメタデータ

      オブジェクトに説明情報を追加します。複数のユーザー定義メタデータエントリを追加できます。すべてのユーザー定義メタデータの合計サイズは 8 KB を超えてはいけません。各ユーザー定義メタデータキーには x-oss-meta- プレフィックスを付け、値を割り当てる必要があります。例:x-oss-meta-location:hangzhou

    3. アップロード をクリックします。

      タスクリスト パネルの タスクのアップロード タブで、各ファイルのアップロード進捗状況を確認できます。

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.*;
import java.io.ByteArrayInputStream;

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

        // OSSClient インスタンスを作成します。
        // OSSClient の使用が完了したら、shutdown メソッドを呼び出してリソースを解放します。
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);        
        OSS ossClient = OSSClientBuilder.create()
        .endpoint(endpoint)
        .credentialsProvider(credentialsProvider)
        .clientConfiguration(clientBuilderConfiguration)
        .region(region)               
        .build();

        try {
            // この例では、文字列をオブジェクトとしてアップロードします。
            String content = "Hello OSS";
            PutObjectResult result = ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(content.getBytes()));
            // オブジェクトのバージョン ID を表示します。
            System.out.println("result.versionid: " + result.getVersionId());
        } 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();
            }
        }
    }
}
const OSS = require('ali-oss');

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

async function put() {
  const result = await client.put('fileName', path.normalize('D:\\localpath\\examplefile.txt'));
  console.log(result.res.headers['x-oss-version-id']); // アップロードされたオブジェクトのバージョン ID を表示します。
}
put();
using System.Text;
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");
// bucketName をバケット名に設定します。例:examplebucket。
var bucketName = "examplebucket";
// objectName をオブジェクトの完全なパスに設定します。完全なパスにはバケット名を含めないでください。例:exampledir/exampleobject.txt。
var objectName = "exampleobject.txt";
var objectContent = "More than just cloud.";
// region を、バケットが配置されているリージョンに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを 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
{
    byte[] binaryData = Encoding.ASCII.GetBytes(objectContent);
    MemoryStream requestContent = new MemoryStream(binaryData);
    // オブジェクトをアップロードします。
    var result = client.PutObject(bucketName, objectName, requestContent);
    Console.WriteLine("Put object succeeded versionid : {0}", result.VersionId);
}
catch (Exception ex)
{
    Console.WriteLine("Put object failed, {0}", ex.Message);
}
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;

int main(void)
{
    /* OSS アカウント情報を初期化します。 */
            
    /* yourEndpoint を、バケットが配置されているリージョンのエンドポイントに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。 */
    std::string Endpoint = "yourEndpoint";
    /* yourRegion を、バケットが配置されているリージョンに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを cn-hangzhou に設定します。 */
    std::string Region = "yourRegion";
    /* バケット名を指定します。例:examplebucket。 */
    std::string BucketName = "examplebucket";
    /* オブジェクトの完全なパスを指定します。完全なパスにはバケット名を含めないでください。例:exampledir/exampleobject.txt。 */
    std::string ObjectName = "exampledir/exampleobject.txt";

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

    ClientConfiguration conf;
    conf.signatureVersion = SignatureVersionType::V4;
    /* 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。 */
    auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
    OssClient client(Endpoint, credentialsProvider, conf);
    client.SetRegion(Region);
    std::shared_ptr<std::iostream> content = std::make_shared<std::stringstream>();
    *content << "test cpp sdk";
    PutObjectRequest request(BucketName, ObjectName, content);

    /* ファイルをアップロードします。 */
    auto outcome = client.PutObject(request);

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

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

import (
	"context"
	"flag"
	"log"
	"strings"

	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)

// グローバル変数を指定します。
var (
	region     string // バケットが配置されているリージョン。
	bucketName string // バケット名。
	objectName string // オブジェクト名。
)

// パラメーターを初期化するために使用される init 関数を定義します。
func init() {
	flag.StringVar(&region, "region", "", "The region in which the bucket is located.")
	flag.StringVar(&bucketName, "bucket", "", "The name of the bucket.")
	flag.StringVar(&objectName, "object", "", "The name of the object.")
}

func main() {
	// コマンドラインパラメーターを解析します。
	flag.Parse()

	// バケット名が空かどうかを確認します。
	if len(bucketName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, bucket name required")
	}

	// リージョンが空かどうかを確認します。
	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, region required")
	}

	// オブジェクト名が空かどうかを確認します。
	if len(objectName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, object name required")
	}

	// アップロードするコンテンツを指定します。
	content := "hi oss"

	// デフォルト設定をロードし、認証情報プロバイダーおよびリージョンを指定します。
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

	// OSS クライアントを作成します。
	client := oss.NewClient(cfg)

	// オブジェクトをアップロードするリクエストを作成します。
	request := &oss.PutObjectRequest{
		Bucket: oss.Ptr(bucketName),        // バケット名。
		Key: oss.Ptr(objectName),        // オブジェクト名。
		Body:   strings.NewReader(content), // アップロードするコンテンツ。
	}

	// オブジェクトをアップロードするリクエストを実行します。
	result, err := client.PutObject(context.TODO(), request)
	if err != nil {
		log.Fatalf("failed to put object %v", err)
	}

	// オブジェクトのバージョン ID を表示します。
	log.Printf("put object result versionId:%#v\n", *result.VersionId)
}
import argparse
import requests
import alibabacloud_oss_v2 as oss

# コマンドライン引数パーサを作成します。
parser = argparse.ArgumentParser(description="put object sample")
# --region コマンドライン引数を設定して、バケットが配置されているリージョンを指定します。この引数は必須です。
parser.add_argument('--region', help='The region in which the bucket is located.', required=True)
# --bucket コマンドライン引数を設定して、バケット名を指定します。この引数は必須です。
parser.add_argument('--bucket', help='The name of the bucket.', required=True)
# --endpoint コマンドライン引数を設定して、他のサービスが OSS にアクセスするために使用できるエンドポイントを指定します。この引数はオプションです。
parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS')
# --key コマンドライン引数を設定して、オブジェクト名を指定します。この引数は必須です。
parser.add_argument('--key', help='The name of the object.', required=True)

def main():
    args = parser.parse_args()  # コマンドライン引数を解析します。

    # 認証のために環境変数からアクセス認証情報を取得します。
    credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()

    # SDK のデフォルト設定を取得し、認証情報プロバイダーを指定します。
    cfg = oss.config.load_default()
    cfg.credentials_provider = credentials_provider
    # バケットが配置されているリージョンを指定します。
    cfg.region = args.region
    # endpoint パラメーターが提供されている場合、エンドポイントを指定します。
    if args.endpoint is not None:
        cfg.endpoint = args.endpoint

    # 設定を使用して OSSClient インスタンスを作成します。
    client = oss.Client(cfg)

    # ローカルファイルをアップロードします。
    local_file_path = '/yourLocalFilePath/yourFileName'
    with open(local_file_path, 'rb') as file:
        data = file.read()

    # オブジェクトをアップロードするリクエストを実行し、バケット名、オブジェクト名、データコンテンツを指定します。
    result = client.put_object(oss.PutObjectRequest(
        bucket=args.bucket,
        key=args.key,
        body=data,
    ))

    # リクエストが成功したかどうかを確認するために、応答の HTTP ステータスコード、リクエスト ID、MD5 ハッシュ、ETag、CRC-64 値、およびオブジェクトのバージョン ID を表示します。
    print(f'status code: {result.status_code},'
          f' request id: {result.request_id},'
          f' content md5: {result.content_md5},'
          f' etag: {result.etag},'
          f' hash crc64: {result.hash_crc64},'
          f' version id: {result.version_id},'
    )

if __name__ == "__main__":
    main()  # スクリプトのエントリーポイント。スクリプトが直接実行されたときに main() 関数を呼び出します。
<?php

// 依存関係をロードするために autoload ファイルをインクルードします。
require_once __DIR__ . '/../vendor/autoload.php';

use AlibabaCloud\Oss\V2 as Oss;

// コマンドラインパラメーターを説明します。
$optsdesc = [
    "region" => ['help' => 'The region in which the bucket is located', 'required' => True], // (必須) バケットが配置されているリージョンを指定します。
    "endpoint" => ['help' => 'The domain names that other services can use to access OSS', 'required' => False], // (オプション) OSS エンドポイントを指定します。
    "bucket" => ['help' => 'The name of the bucket', 'required' => True], // (必須) バケット名を指定します。
    "key" => ['help' => 'The name of the object', 'required' => True], // (必須) オブジェクト名を指定します。
];

// コマンドラインパラメーターを解析するために必要なロングオプションのリストを生成します。
$longopts = \array_map(function ($key) {
    return "$key:"; // 各パラメーターの末尾にコロン (:) を追加して、値が必要であることを示します。
}, array_keys($optsdesc));

// コマンドラインパラメーターを解析します。
$options = getopt("", $longopts);

// 必須パラメーターが不足していないか確認します。
foreach ($optsdesc as $key => $value) {
    if ($value['required'] === True && empty($options[$key])) {
        $help = $value['help'];
        echo "Error: the following arguments are required: --$key, $help"; // 必須だが不足しているパラメーターを表示します。
        exit(1);
    }
}

// コマンドラインパラメーターの値を取得し、変数に代入します。
$region = $options["region"]; // バケットが配置されているリージョン。
$bucket = $options["bucket"]; // バケット名。
$key = $options["key"]; // オブジェクト名。

// 環境変数から AccessKey ID および AccessKey Secret をロードします。
$credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider();

// SDK のデフォルト設定を使用します。
$cfg = Oss\Config::loadDefault();

// 認証情報プロバイダーを指定します。
$cfg->setCredentialsProvider($credentialsProvider);

// リージョンを指定します。
$cfg->setRegion($region);

// エンドポイントが提供されている場合、エンドポイントを指定します。
if (isset($options["endpoint"])) {
    $cfg->setEndpoint($options["endpoint"]);
}

// OSSClient インスタンスを作成します。
$client = new Oss\Client($cfg);

// アップロードするデータを指定します。
$data = 'Hello OSS';

// シンプルアップロードリクエストを作成します。
$request = new Oss\Models\PutObjectRequest(
                bucket: $bucket,
                key: $key,
            );

// リクエストボディをデータストリームに設定します。
$request->body = Oss\Utils::streamFor($data);

// putObject メソッドを使用してデータをアップロードします。
$result = $client->putObject($request);

// 返された結果を表示します。
printf(
    'status code:' . $result->statusCode . PHP_EOL . // HTTP ステータスコード。
    'request id:' . $result->requestId . PHP_EOL . // リクエスト ID。
    'etag:' . $result->etag . PHP_EOL // オブジェクトの ETag。
);

ossutil を使用する

ossutil を使用してバージョン管理が有効なバケットにオブジェクトをアップロードする方法の詳細については、「cp (オブジェクトのアップロード)」をご参照ください。

REST API を使用する

アプリケーションに特定の要件がある場合は、REST API リクエストを直接送信できますが、この場合、署名を手動で計算するコードを記述する必要があります。詳細については、「PutObject」をご参照ください。

オブジェクトの一覧表示

バージョン管理が有効なバケットでは、GetBucketVersions (ListObjectVersions) 操作を呼び出して、削除マーカーを含むすべてのオブジェクトバージョンに関する情報を取得できます。

  • GetBucket (ListObject) 操作は、削除マーカーではない現在のオブジェクトバージョンのみを返します。

  • 単一の GetBucketVersions (ListObjectVersions) リクエストは、最大 1,000 のオブジェクトバージョンを返すことができます。すべてのバージョンを取得するには、複数のリクエストを送信する必要があります。

    たとえば、example.jpgphoto.jpg の 2 つのキーを含むバケットがあり、example.jpg に 900 のバージョン、photo.jpg に 500 のバージョンがある場合、単一のリクエストでは example.jpg の 900 のバージョンすべてと photo.jpg の最初の 100 のバージョンが一覧表示されます。結果はキーの辞書順で並べられ、その後バージョンでソートされます。

次の図に示すように、GetBucketVersions (ListObjectVersions) 操作は、削除マーカーを含むバージョン管理が有効なバケット内のすべてのオブジェクトのすべてのバージョンを返します。一方、GetBucket (ListObject) 操作は、削除マーカーではない現在のバージョンのみを返します。そのため、バージョン ID が 444444 のオブジェクトのみが返されます。

OSS コンソール

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

  2. バケット をクリックし、対象バケットの名前をクリックします。

    このページには、各オブジェクトの現在のバージョンの一覧がページ分割されて表示されます。削除マーカーを含むすべてのバージョンを表示するには、オブジェクト ページに移動し、以前のバージョン の横にある 表示 をクリックします。

OSS 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";
        // 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // バケット名を指定します。例:examplebucket。
        String bucketName = "examplebucket";
        // バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを cn-hangzhou に設定します。
        String region = "cn-hangzhou";

        // OSSClient インスタンスを作成します。
        // OSSClient の使用が完了したら、shutdown メソッドを呼び出してリソースを解放します。
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);        
        OSS ossClient = OSSClientBuilder.create()
        .endpoint(endpoint)
        .credentialsProvider(credentialsProvider)
        .clientConfiguration(clientBuilderConfiguration)
        .region(region)               
        .build();

        try {
            // バケット内の削除マーカーを含むすべてのオブジェクトのバージョンを一覧表示します。
            String nextKeyMarker = null;
            String nextVersionMarker = null;
            VersionListing versionListing = null;
            do {
                ListVersionsRequest listVersionsRequest = new ListVersionsRequest()
                        .withBucketName(bucketName)
                        .withKeyMarker(nextKeyMarker)
                        .withVersionIdMarker(nextVersionMarker);

                versionListing = ossClient.listVersions(listVersionsRequest);
                for (OSSVersionSummary ossVersion : versionListing.getVersionSummaries()) {
                    System.out.println("key name: " + ossVersion.getKey());
                    System.out.println("versionid: " + ossVersion.getVersionId());
                    System.out.println("Is latest: " + ossVersion.isLatest());
                    System.out.println("Is delete marker: " + ossVersion.isDeleteMarker());
                }

                nextKeyMarker = versionListing.getNextKeyMarker();
                nextVersionMarker = versionListing.getNextVersionIdMarker();
            } while (versionListing.isTruncated());
        } 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();
            }
        }
    }
}
const OSS = require("ali-oss");

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

// 削除マーカーを含むすべてのオブジェクトのバージョン情報を一覧表示します。
async function getObjectVersions() {
  let nextKeyMarker = null;
  let nextVersionMarker = null;
  let versionListing = null;
  do {
    versionListing = await client.getBucketVersions({
      keyMarker: nextKeyMarker,
      versionIdMarker: nextVersionMarker,
    });

    versionListing.objects.forEach((o) => {
      console.log(`${o.name}, ${o.versionId}`);
    });
    versionListing.deleteMarker.forEach((o) => {
      console.log(`${o.name}, ${o.versionId}`);
    });

    nextKeyMarker = versionListing.NextKeyMarker;
    nextVersionMarker = versionListing.NextVersionIdMarker;
  } while (versionListing.isTruncated);
}

getObjectVersions();
import argparse
import alibabacloud_oss_v2 as oss

# コマンドライン引数パーサを作成し、スクリプトの目的を説明します。
parser = argparse.ArgumentParser(description="list object versions sample")

# バケットが配置されているリージョンを示す --region パラメーターを指定します。このパラメーターは必須です。
parser.add_argument('--region', help='The region in which the bucket is located.', required=True)
# バケット名を示す --bucket パラメーターを指定します。このパラメーターは必須です。
parser.add_argument('--bucket', help='The name of the bucket.', required=True)
# バケットが配置されているリージョンのエンドポイントを示す --endpoint パラメーターを指定します。このパラメーターは省略可能です。
parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS')

def main():
    # コマンドライン引数を解析して、指定された値を取得します。
    args = parser.parse_args()

    # 環境変数から、OSS にアクセスするために必要な認証情報をロードします。
    credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()

    # デフォルト構成を使用して cfg オブジェクトを作成し、認証情報プロバイダーを指定します。
    cfg = oss.config.load_default()
    cfg.credentials_provider = credentials_provider
    cfg.region = args.region

    # カスタムエンドポイントが提供されている場合、cfg オブジェクトの endpoint 属性を提供されたエンドポイントで更新します。
    if args.endpoint is not None:
        cfg.endpoint = args.endpoint

    # 上記の設定を使用して、OSSClient インスタンスを初期化します。
    client = oss.Client(cfg)

    # オブジェクトのバージョンをページ単位で一覧表示するために使用する Paginator オブジェクトを作成します。
    paginator = client.list_object_versions_paginator()

    # ページを反復処理します。
    for page in paginator.iter_page(oss.ListObjectVersionsRequest(
            bucket=args.bucket,  # バケット名。
        )
    ):
        # 現在のページ上のオブジェクトバージョンを反復処理します。
        for o in page.version:
            # 各オブジェクトバージョンに関する以下の情報を出力します:
            # - key: オブジェクトキー。
            # - size: オブジェクトサイズ (バイト)。
            # - version_id: バージョン ID。
            # - last_modified: 最終更新時刻。
            print(f'Object version: {o.key}, Size: {o.size}, Version_id: {o.version_id}, Last_modified: {o.last_modified}')


# スクリプトが直接実行されたときに、処理ロジックを開始するために main 関数を呼び出します。
if __name__ == "__main__":
    main()  # スクリプトのエントリポイントを指定します。制御フローはここから始まります。

ossutil

バージョン管理が有効なバケット内のオブジェクトを一覧表示するには、「ls (アカウントレベルのリソース一覧表示)」をご参照ください。

RESTful API

RESTful API を直接使用すると最大限のカスタマイズが可能ですが、リクエスト署名を手動で計算する必要があります。詳細については、「ListObjectVersions (GetBucketVersions)」をご参照ください。

オブジェクトのダウンロード

バージョン管理が有効なバケットから、オブジェクトの現在のバージョンまたは特定のバージョンをダウンロードできます。

バージョン ID を指定せずにオブジェクトをダウンロードする GET リクエストを送信すると、OSS はオブジェクトの現在のバージョン (ID=333333) を返します。

現在のバージョンが削除マーカーの場合、GET リクエストに対して OSS は 404 Not Found を返します。

バージョン ID を指定してオブジェクトをダウンロードする GET リクエストを送信すると、OSS は指定されたバージョン (ID=222222) を返します。

OSS コンソールを使用する

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

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

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

  4. オブジェクト ページで、以前のバージョン の右側にある 表示 をクリックします。

  5. ダウンロードするオブジェクトバージョンをクリックします。表示されるパネルで、[オブジェクト URL] の右側にある ダウンロード をクリックします。

OSS SDK を使用する

以下のコードは、一般的な SDK を使用してバージョン管理が有効なバケットからオブジェクトをダウンロードする方法を示しています。他の SDK の使用方法については、「SDK 概要」をご参照ください。

const OSS = require('ali-oss');

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

async function get() {
  // ファイル名。
  const result = await client.get('filename', {    
      // ダウンロードするファイルのバージョン ID。
      versionId: 'versionid',
  });
  console.log(result.content);
}
get();
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;

int main(void)
{
    /* OSS アカウント情報を初期化します。 */
            
    /* yourEndpoint を、バケットが配置されているリージョンのエンドポイントに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。 */
    std::string Endpoint = "yourEndpoint";
    /* yourRegion を、バケットが配置されているリージョンに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、Region を cn-hangzhou に設定します。 */
    std::string Region = "yourRegion";
    /* バケット名を指定します。例:examplebucket。 */
    std::string BucketName = "examplebucket";
    /* オブジェクトの完全なパスを指定します。完全なパスにはバケット名を含めないでください。例:exampledir/exampleobject.txt。 */
    std::string ObjectName = "exampledir/exampleobject.txt";

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

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

    /* ファイルをローカルメモリにダウンロードします。 */
    GetObjectRequest request(BucketName, ObjectName);
    request.setVersionId("yourObjectVersionId");
    auto outcome = client.GetObject(request);
    if (outcome.isSuccess()) {
        std::cout << "getObjectToBuffer" << " success, Content-Length:" << outcome.result().Metadata().ContentLength() << std::endl;
        /* ダウンロードされたオブジェクトのコンテンツを読み取ります。 */
        std::string content;
        *(outcome.result().Content()) >> content;
        std::cout << "getObjectToBuffer" << "content:" << content << std::endl;
        /* ダウンロードされたオブジェクトのバージョン ID を表示します。 */
        std::cout << "versionid:" << outcome.result().VersionId() << std::endl;
    }
    else {
            /* 例外を処理します。 */
            std::cout << "getObjectToBuffer fail" <<
        ",code:" << outcome.error().Code() <<
        ",message:" << outcome.error().Message() <<
        ",requestId:" << outcome.error().RequestId() << std::endl;
        return -1;
    }

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

# コマンドラインパラメーターのパーサーを作成します。
parser = argparse.ArgumentParser(description="get object sample")

# バケットが配置されているリージョンを示す --region パラメーターを指定します。このパラメーターは必須です。
parser.add_argument('--region', help='The region in which the bucket is located.', required=True)
# バケットの名前を指定する --bucket パラメーターを指定します。このコマンドラインパラメーターは必須です。
parser.add_argument('--bucket', help='The name of the bucket.', required=True)
# バケットが配置されているリージョンのエンドポイントを示す --endpoint パラメーターを指定します。このパラメーターはオプションです。
parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS')
# オブジェクトの名前を指定する --key パラメーターを指定します。このコマンドラインパラメーターは必須です。
parser.add_argument('--key', help='The name of the object.', required=True)
# ソースオブジェクトのバージョン ID を指定する --version_id パラメーターを指定します。このコマンドラインパラメーターは必須です。
parser.add_argument('--version_id', help='The version ID of the object.', required=True)

def main():
    # コマンドラインパラメーターを解析します。
    args = parser.parse_args()

    # 認証のために環境変数からアクセス認証情報を取得します。
    credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()

    # SDK のデフォルト設定を読み込み、認証情報プロバイダーを指定します。
    cfg = oss.config.load_default()
    cfg.credentials_provider = credentials_provider

    # バケットが配置されているリージョンを指定します。
    cfg.region = args.region

    # endpoint パラメーターが指定されている場合、エンドポイントを指定します。
    if args.endpoint is not None:
        cfg.endpoint = args.endpoint

    # 設定を使用して OSSClient インスタンスを作成します。
    client = oss.Client(cfg)

    # オブジェクトをダウンロードするリクエストを実行し、バケット名とオブジェクト名を指定します。
    result = client.get_object(oss.GetObjectRequest(
        bucket=args.bucket,  # バケットの名前を指定します。
        key=args.key,  # オブジェクトの名前を指定します。
        version_id=args.version_id, # バージョン ID を指定します。
    ))

    # リクエストが成功したかどうかを確認するために応答を表示します。
    print(f'status code: {result.status_code},'
          f' request id: {result.request_id},'
          f' content length: {result.content_length},'
          f' content range: {result.content_range},'
          f' content type: {result.content_type},'
          f' etag: {result.etag},'
          f' last modified: {result.last_modified},'
          f' content md5: {result.content_md5},'
          f' cache control: {result.cache_control},'
          f' content disposition: {result.content_disposition},'
          f' content encoding: {result.content_encoding},'
          f' expires: {result.expires},'
          f' hash crc64: {result.hash_crc64},'
          f' storage class: {result.storage_class},'
          f' object type: {result.object_type},'
          f' version id: {result.version_id},'
          f' tagging count: {result.tagging_count},'
          f' server side encryption: {result.server_side_encryption},'
          f' server side data encryption: {result.server_side_data_encryption},'
          f' next append position: {result.next_append_position},'
          f' expiration: {result.expiration},'
          f' restore: {result.restore},'
          f' process status: {result.process_status},'
          f' delete marker: {result.delete_marker},'
    )

    # オブジェクトのコンテンツを読み取ります。
    content = result.body.read()

    # コンテンツをローカルファイルに保存します。この例では、ローカルファイルの名前は test.txt です。
    with open('./test.txt', 'wb') as f:
        f.write(content)

    print(f'File saved to test.txt successfully!')

# スクリプトが直接実行されたときに main 関数を呼び出します。
if __name__ == "__main__":
    main()  # スクリプトが直接実行されたときに、スクリプトの main 関数内のエントリーポイントを指定します。
package main

import (
	"context"
	"flag"
	"io"
	"log"
	"os"

	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)

// グローバル変数を定義します。
var (
	region     string // バケットが配置されているリージョン。
	bucketName string // バケット名。
	objectName string // オブジェクト名。
)

// コマンドラインパラメーターを初期化するために使用される init 関数を指定します。
func init() {
	flag.StringVar(&region, "region", "", "The region in which the bucket is located.")
	flag.StringVar(&bucketName, "bucket", "", "The name of the bucket.")
	flag.StringVar(&objectName, "object", "", "The name of the object.")
}

func main() {
	// コマンドラインパラメーターを解析します。
	flag.Parse()

	// バケット名が指定されているかどうかを確認します。
	if len(bucketName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, bucket name required")
	}

	// リージョンが指定されているかどうかを確認します。
	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, region required")
	}

	// オブジェクト名が指定されているかどうかを確認します。
	if len(objectName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, object name required")
	}

	// 出力ファイルのパスを指定します。
	outputFile := "downloaded.file" // このパラメーターを、ファイルを保存したいパスに置き換えてください。

	// デフォルト設定をロードし、認証情報プロバイダーおよびリージョンを指定します。
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

	// OSS クライアントを作成します。
	client := oss.NewClient(cfg)

	// クエリリクエストを作成します。
	request := &oss.GetObjectRequest{
		Bucket:    oss.Ptr(bucketName),      // バケット名
		Key:       oss.Ptr(objectName),      // オブジェクト名
		VersionId: oss.Ptr("yourVersionId"), // オブジェクトのバージョン ID
	}

	// クエリ操作を実行し、結果を処理します。
	result, err := client.GetObject(context.TODO(), request)
	if err != nil {
		log.Fatalf("failed to get object %v", err)
	}
	defer result.Body.Close() // 関数が完了したときにレスポンスボディが確実に閉じられるようにします。

	// ファイル全体を読み取ります。
	data, err := io.ReadAll(result.Body)
	if err != nil {
		log.Fatalf("failed to read object %v", err)
	}

	// コンテンツをファイルに書き込みます。
	err = os.WriteFile(outputFile, data, 0644)
	if err != nil {
		log.Fatalf("failed to write to output file %v", err)
	}

	log.Printf("file downloaded successfully to %s", outputFile)
}
<?php

// 依存ライブラリをロードするために autoload ファイルを導入します。
require_once __DIR__ . '/../vendor/autoload.php';

use AlibabaCloud\Oss\V2 as Oss;

// コマンドライン引数の説明を指定します。
$optsdesc = [
    "region" => ['help' => 'The region in which the bucket is located.', 'required' => True], // (必須) バケットが配置されているリージョンを指定します。
    "endpoint" => ['help' => 'The domain names that other services can use to access OSS.', 'required' => False], // (オプション) 他のサービスが OSS にアクセスするために使用できるエンドポイントを指定します。
    "bucket" => ['help' => 'The name of the bucket', 'required' => True], // (必須) バケット名を指定します。
    "key" => ['help' => 'The name of the object', 'required' => True], // (必須) オブジェクト名を指定します。
];

// getopt に必要なロングオプションのリストに説明を変換します。
// 各パラメーターの末尾にコロン (:) を追加して、値が必要であることを示します。
$longopts = \array_map(function ($key) {
    return "$key:";
}, array_keys($optsdesc));

// コマンドライン引数を解析します。
$options = getopt("", $longopts);

// 必須パラメーターが設定されているかどうかを確認します。
foreach ($optsdesc as $key => $value) {
    if ($value['required'] === True && empty($options[$key])) {
        $help = $value['help']; // パラメーターのヘルプ情報を取得します。
        echo "Error: the following arguments are required: --$key, $help" . PHP_EOL;
        exit(1); // 必須パラメーターが設定されていない場合、プログラムを終了します。
    }
}

// 解析されたパラメーターから値を取得します。
$region = $options["region"]; // バケットが配置されているリージョン。
$bucket = $options["bucket"]; // バケット名。
$key = $options["key"]; // オブジェクト名。

// 環境変数からアクセス認証情報をロードします。
// EnvironmentVariableCredentialsProvider を使用して、環境変数から AccessKey ID および AccessKey Secret を取得します。
$credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider();

// SDK のデフォルト設定を使用します。
$cfg = Oss\Config::loadDefault();
$cfg->setCredentialsProvider($credentialsProvider); // 認証情報プロバイダーを指定します。
$cfg->setRegion($region); // バケットが配置されているリージョンを指定します。
if (isset($options["endpoint"])) {
    $cfg->setEndpoint($options["endpoint"]); // エンドポイントが提供されている場合、エンドポイントを指定します。
}

// OSSClient インスタンスを作成します。
$client = new Oss\Client($cfg);

// 指定されたオブジェクトのコンテンツを取得するための GetObjectRequest オブジェクトを作成します。
$request = new Oss\Models\GetObjectRequest(
                bucket: $bucket,
                key: $key,
                versionId:"yourVersionId",// オブジェクトのバージョン ID を指定します。
);

// オブジェクトをクエリします。
$result = $client->getObject($request);

// オブジェクトを保存するローカルパスを指定します。
$localFilePath = './test/file.txt'; // このパラメーターを実際のローカルファイルパスに置き換えてください。

// コンテンツをローカルファイルに書き込みます。
file_put_contents($localFilePath, $result->body->getContents());

// 結果を表示します。
// HTTP ステータスコード、リクエスト ID、およびオブジェクトのコンテンツを出力します。
printf(
    'status code:' . $result->statusCode . PHP_EOL . // HTTP ステータスコード。たとえば、HTTP ステータスコード 200 はリクエストが成功したことを示します。
    'request id:' . $result-> requestId. PHP_EOL // リクエスト ID。リクエストのデバッグまたはトレースに使用されます。
);

ossutil を使用する

ossutil を使用してバージョン管理が有効なバケットからオブジェクトをダウンロードする方法については、「cp (オブジェクトのダウンロード)」をご参照ください。

REST API を使用する

カスタム要件がある場合は、REST API を直接呼び出すことができます。この場合、リクエスト署名を手動で計算するコードを記述する必要があります。詳細については、「GetObject」をご参照ください。

オブジェクトの削除

バージョン管理が有効なバケットでは、バージョン ID を指定するか、ライフサイクルルールを設定することで、オブジェクトを完全に削除できます。バージョン ID を指定せずにオブジェクトを削除すると、OSS は削除マーカーを挿入し、それがオブジェクトの現在のバージョンになります。

重要
  • バージョン管理を有効にした後、バージョン ID を指定せずにオブジェクトを削除しても、デフォルトでは現在または過去のバージョンが削除されることはありません。

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

    詳細については、「OSS-HDFS とバージョン管理の両方が有効なバケットをどのように処理すればよいですか?」をご参照ください。

  • Expiration:オブジェクトの現在のバージョンに適用されます。オブジェクトの現在のバージョンが有効期限切れになると、OSS は削除マーカーを作成し、有効期限切れのバージョンは過去バージョンになります。

  • NoncurrentVersionExpiration:オブジェクトの過去バージョンに適用されます。このアクションにより、これらのバージョンが完全に削除されます。

ライフサイクルルールでバージョン管理を使用する方法の詳細については、「ライフサイクル設定要素」をご参照ください。

このセクションでは、バージョン ID を指定する場合と指定しない場合の DELETE 操作の動作について説明します。

  • バージョン ID を指定しない場合、OSS は現在のバージョンとして削除マーカーを挿入します。この削除マーカーには一意のバージョン ID がありますが、関連するデータや ACL はありません。次の図に示すように、現在のバージョンはバージョン ID が 444444 の削除マーカーです。

  • バージョン ID を指定する場合、OSS はその特定のバージョンのオブジェクトを完全に削除します。次の図に示すように、ID が 333333 のオブジェクトバージョンが削除されます。

OSS コンソール

ストレージコストを最小限に抑えるために、不要になったオブジェクトの過去バージョンはできるだけ早く削除することを推奨します。

警告

一度完全に削除された過去バージョンは復元できません。十分ご注意ください。

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

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

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

  4. オブジェクト ページで、以前のバージョン の横にある 表示 をクリックします。

  5. 不要な過去バージョンを見つけ、次のいずれかの操作を行います。

    • 削除マーカーを削除するには、操作 列の 完全に削除 をクリックします。

    • オブジェクトのバージョンを削除するには、操作列のimage.png アイコンにポインターを合わせて、完全に削除をクリックします。

    複数の過去バージョンを選択し、ページ下部の 完全に削除 をクリックすることもできます。

  6. OK をクリックします。

    あるいは、ライフサイクルルールを設定して、定期的に過去のオブジェクトバージョンを削除することもできます。詳細については、「ライフサイクルルールの概要」をご参照ください。

OSS SDK

以下のコードは、OSS SDK を使用してバージョン管理が有効なバケットから特定のバージョンのオブジェクトを削除する方法の例を示しています。他の SDK の使用方法については、「SDK 概要」をご参照ください。

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

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

        // OSSClient インスタンスを作成します。
        // OSSClient の使用が完了したら、shutdown メソッドを呼び出してリソースを解放します。
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);        
        OSS ossClient = OSSClientBuilder.create()
        .endpoint(endpoint)
        .credentialsProvider(credentialsProvider)
        .clientConfiguration(clientBuilderConfiguration)
        .region(region)               
        .build();

        try {
            // 指定されたバージョンのオブジェクトを削除します。
            ossClient.deleteVersion(bucketName, objectName , versionId);
        } 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();
            }
        }
    }
}
const OSS = require("ali-oss");

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

// オブジェクトの versionId を指定します。
const versionId = "versionId";
// オブジェクトを指定します。
const objectName = "exampleobject.txt";
async function deleteVersionObject() {
  const result = await client.delete(objectName, {
    versionId,
  });
  console.log(result);
}

deleteVersionObject();
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";
// オブジェクトの完全なパスを指定します。完全なパスにはバケット名を含めないでください。例:exampledir/exampleobject.txt。
var objectName = "exampledir/exampleobject.txt";
// オブジェクトまたは削除マーカーのバージョン ID を指定します。
var versionid = "yourObjectVersionidOrDelMarkerVersionid";
// バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを 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
{
    // 削除するオブジェクトまたは削除マーカーのバージョン ID を指定します。
    var request = new DeleteObjectRequest(bucketName, objectName)
    {
        VersionId = versionid
    };
    client.DeleteObject(request);
    Console.WriteLine("Delete object succeeded");
}
catch (Exception ex)
{
    Console.WriteLine("Delete object failed. {0}", ex.Message);
}
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;

int main(void)
{
    /* OSS アカウント情報を初期化します。 */
            
    /* yourEndpoint を、バケットが配置されているリージョンのエンドポイントに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。 */
    std::string Endpoint = "yourEndpoint";
    /* yourRegion を、バケットが配置されているリージョンに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを cn-hangzhou に設定します。 */
    std::string Region = "yourRegion";
    /* バケット名を指定します。例:examplebucket。 */
    std::string BucketName = "examplebucket";
    /* オブジェクトの完全なパスを指定します。完全なパスにはバケット名を含めないでください。例:exampledir/exampleobject.txt。 */
    std::string ObjectName = "exampledir/exampleobject.txt";

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

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

    /* 指定された versionId のオブジェクトまたは指定された versionId の削除マーカーに関連付けられたオブジェクトを削除します。 */
    auto outcome = client.DeleteObject(DeleteObjectRequest(BucketName, ObjectName, "yourObjectVersionIdOrDeleteMarkerVersionId"));
    /* オブジェクトの versionId が指定された場合、返される delete_marker は None で、返される versionId は指定されたオブジェクトの versionId です。 */
    /* 削除マーカーの versionId が指定された場合、返される delete_marker は True で、返される versionId は指定された削除マーカーの versionId です。 */
    if (!outcome.isSuccess()) {
        /* 例外を処理します。 */
        std::cout << "DeleteObject fail" <<
        ",code:" << outcome.error().Code() <<
        ",message:" << outcome.error().Message() <<
        ",requestId:" << outcome.error().RequestId() << std::endl;
        return -1;
    }

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

import (
	"context"
	"flag"
	"log"

	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)

// グローバル変数を定義します。
var (
	region     string // バケットが配置されているリージョン。
	bucketName string // バケット名。
	objectName string // オブジェクト名。
)

// init はコマンドラインフラグを初期化するために使用されます。
func init() {
	flag.StringVar(&region, "region", "", "The region in which the bucket is located.")
	flag.StringVar(&bucketName, "bucket", "", "The name of the bucket.")
	flag.StringVar(&objectName, "object", "", "The name of the object.")
}

func main() {
	// コマンドラインフラグを解析します。
	flag.Parse()

	// バケット名が提供されているかどうかを確認します。
	if len(bucketName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, bucket name required")
	}

	// リージョンが提供されているかどうかを確認します。
	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, region required")
	}

	// オブジェクト名が提供されているかどうかを確認します。
	if len(objectName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, object name required")
	}

	// デフォルト設定をロードし、認証情報プロバイダーおよびリージョンを設定します。
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

	// OSS クライアントを作成します。
	client := oss.NewClient(cfg)

	// オブジェクトを削除するリクエストを作成します。
	request := &oss.DeleteObjectRequest{
		Bucket:    oss.Ptr(bucketName),      // バケット名。
		Key:       oss.Ptr(objectName),      // オブジェクト名。
		VersionId: oss.Ptr("yourVersionId"), // 実際のオブジェクトのバージョン ID に置き換えます。
	}

	// 削除操作を実行し、結果を処理します。
	result, err := client.DeleteObject(context.TODO(), request)
	if err != nil {
		log.Fatalf("failed to delete object %v", err)
	}

	// 結果を出力します。
	log.Printf("delete object result:%#v\n", result)
}
<?php

// 依存ライブラリが正しくロードされるように、オートローダーファイルをインポートします。
require_once __DIR__ . '/../vendor/autoload.php';

use AlibabaCloud\Oss\V2 as Oss;

// コマンドライン引数の説明を定義します。
$optsdesc = [
    "region" => ['help' => 'The region in which the bucket is located.', 'required' => True], // バケットが配置されているリージョン。このパラメーターは必須です。
    "endpoint" => ['help' => 'The domain names that other services can use to access OSS.', 'required' => False], // エンドポイント。このパラメーターはオプションです。
    "bucket" => ['help' => 'The name of the bucket', 'required' => True], // バケット名。このパラメーターは必須です。
    "key" => ['help' => 'The name of the object', 'required' => True], // オブジェクト名。このパラメーターは必須です。
];

// getopt に必要なロングオプション形式に引数の説明を変換します。
// 各引数の後にコロン (:) を追加して、引数に値が必要であることを示します。
$longopts = \array_map(function ($key) {
    return "$key:";
}, array_keys($optsdesc));

// コマンドライン引数を解析します。
$options = getopt("", $longopts);

// すべての必須引数が指定されていることを確認します。
foreach ($optsdesc as $key => $value) {
    if ($value['required'] === True && empty($options[$key])) {
        $help = $value['help']; // 引数のヘルプ情報を取得します。
        echo "Error: the following arguments are required: --$key, $help" . PHP_EOL;
        exit(1); // 必須引数が不足している場合、プログラムを終了します。
    }
}

// 解析された引数から値を取得します。
$region = $options["region"]; // バケットが配置されているリージョン。
$bucket = $options["bucket"]; // バケット名。
$key = $options["key"];       // オブジェクト名。

// 環境変数から認証情報をロードします。
// EnvironmentVariableCredentialsProvider を使用して、環境変数から Access Key ID および Access Key Secret を読み取ります。
$credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider();

// SDK のデフォルト設定を使用します。
$cfg = Oss\Config::loadDefault();
$cfg->setCredentialsProvider($credentialsProvider); // 認証情報プロバイダーを設定します。
$cfg->setRegion($region); // バケットが配置されているリージョンを設定します。
if (isset($options["endpoint"])) {
    $cfg->setEndpoint($options["endpoint"]); // エンドポイントが提供されている場合、エンドポイントを設定します。
}

// OSS クライアントインスタンスを作成します。
$client = new Oss\Client($cfg);

// 指定されたオブジェクトを削除する DeleteObjectRequest オブジェクトを作成します。
$request = new Oss\Models\DeleteObjectRequest(
            bucket: $bucket,
            key: $key,
            versionId:"yourversionid", // 削除するオブジェクトのバージョン番号を指定します。
);

// オブジェクト削除操作を実行します。
$result = $client->deleteObject($request);

// 削除結果を出力します。
// 削除が成功したかどうかを確認するために、HTTP ステータスコードおよびリクエスト ID を出力します。
printf(
    'status code:' . $result->statusCode . PHP_EOL . // HTTP ステータスコード。たとえば、204 は削除が成功したことを示します。
    'request id:' . $result->requestId . PHP_EOL     // リクエスト ID。リクエストのデバッグまたは追跡に使用されます。
);

ossutil

ossutil を使用してバージョン管理が有効なバケットからオブジェクトを削除する方法の詳細については、「rm (削除)」をご参照ください。

REST API

カスタム要件がある場合は、REST API リクエストを直接送信できます。この場合、リクエスト署名を手動で計算する必要があります。詳細については、「DeleteObject」をご参照ください。

オブジェクトの復元

バケットでバージョン管理が有効になっている場合、OSS はバケット内のオブジェクトのすべてのバージョンを保持します。オブジェクトの特定の過去バージョンを復元でき、それが現在のバージョンになります。

オブジェクトの過去バージョンを次の 2 つの方法のいずれかで復元できます。

  • オブジェクトの過去バージョンをコピーする

    コピーされたオブジェクトが現在のバージョンとなり、すべてのオブジェクトバージョンが保持されます。

    図に示すように、オブジェクトの過去バージョン (バージョン ID 222222) を同じバケットにコピーすると、OSS は新しい ID (バージョン ID 444444) を持つ新しいバージョンを作成し、それを現在のバージョンにします。過去バージョン (バージョン ID 222222) も保持されます。

  • オブジェクトの現在のバージョンを完全に削除する

    次の図に示すように、DELETE リクエストでバージョン ID を指定してオブジェクトの現在のバージョン (バージョン ID 222222) を完全に削除すると、直前のバージョン (ID 111111) が現在のバージョンになります。

重要

一度完全に削除されたバージョンは復元できないため、過去バージョンをコピーして復元することを推奨します。

OSS コンソールを使用する

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

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

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

  4. オブジェクト ページで、以前のバージョン の右側にある 表示 をクリックします。

  5. オブジェクトの過去バージョンを復元します。

    重要

    一度に復元できるオブジェクトバージョンは 1 つだけです。削除マーカーは復元できません。

    • 単一のオブジェクトを復元する

      目的のバージョンの 操作 列で、回復 をクリックします。

    • 複数のオブジェクトを復元する

      目的の過去バージョンを選択し、ページ下部の 回復 をクリックし、表示されるダイアログボックスで OK をクリックします。

OSS SDK を使用する

以下のコード例は、一般的な OSS 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";
        // 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // ソースバケット名を指定します。
        String sourceBucketName = "srcexamplebucket";
        // ソースオブジェクトの完全なパスを指定します。完全なパスにはバケット名を含めないでください。
        String sourceObjectName = "srcexampleobject.txt";
        // 送信先バケット名を指定します。送信先バケットはソースバケットと同じリージョンに配置されている必要があります。
        String destinationBucketName = "desexamplebucket";
        // 送信先オブジェクトの完全なパスを指定します。完全なパスにはバケット名を含めないでください。
        String destinationObjectName = "desexampleobject.txt";
        String versionId  = "CAEQMxiBgICAof2D0BYiIDJhMGE3N2M1YTI1NDQzOGY5NTkyNTI3MGYyMzJm****";
        // バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを cn-hangzhou に設定します。
        String region = "cn-hangzhou";

        // OSSClient インスタンスを作成します。
        // OSSClient の使用が完了したら、shutdown メソッドを呼び出してリソースを解放します。
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);        
        OSS ossClient = OSSClientBuilder.create()
        .endpoint(endpoint)
        .credentialsProvider(credentialsProvider)
        .clientConfiguration(clientBuilderConfiguration)
        .region(region)               
        .build();

        try {
            CopyObjectRequest copyObjectRequest = new CopyObjectRequest(sourceBucketName, sourceObjectName, destinationBucketName, destinationObjectName);
            copyObjectRequest.setSourceVersionId(versionId);
            CopyObjectResult copyObjectResult = ossClient.copyObject(copyObjectRequest);
            System.out.println("ETag: " + copyObjectResult.getETag() + " LastModified: " + copyObjectResult.getLastModified());
            System.out.println("dest object versionid: " + copyObjectResult.getVersionId());
        } 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();
            }
        }
    }
}
const OSS = require('ali-oss');

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

// ソースオブジェクトの versionId を指定します。
const versionId = 'versionId';
// ソースオブジェクトを指定します。
const srcObject = 'srcObject.txt';
// ソースバケットを指定します。
const srcBucket = 'srcBucket';
// 送信先オブジェクトを指定します。
const targetObject = 'targetObject.txt';
async function Copy() {
  try {
    const result = await client.copy(targetObject, srcObject, srcBucket, {
      meta: {
        versionId: versionId
      }
    });

    console.log(result);
  } catch (error) {
    console.error(error);
  }
}

Copy()
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");
// ソースバケット名を指定します。
var sourceBucket = "yourSourceBucketName";
// ソースオブジェクトの完全なパスを指定します。完全なパスにはバケット名を含めないでください。
var sourceObject = "yourSourceObjectName";
// 送信先バケット名を指定します。送信先バケットはソースバケットと同じリージョンに配置されている必要があります。
var targetBucket = "yourDestBucketName";
// 送信先オブジェクトの完全なパスを指定します。完全なパスにはバケット名を含めないでください。
var targetObject = "yourDestObjectName";
// ソースオブジェクトのバージョン ID を指定します。
var versionid = "yourArchiveObjectVersionid";
// バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを 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
{
    var metadata = new ObjectMetadata();
    metadata.AddHeader("mk1", "mv1");
    metadata.AddHeader("mk2", "mv2");
    var req = new CopyObjectRequest(sourceBucket, sourceObject, targetBucket, targetObject)
    {
        // NewObjectMetadata の値が null の場合、COPY モードが使用され、ソースオブジェクトのメタデータが送信先オブジェクトにコピーされます。NewObjectMetadata の値が null でない場合、REPLACE モードが使用され、ソースオブジェクトのメタデータが送信先オブジェクトのメタデータを上書きします。
        NewObjectMetadata = metadata, 
        // オブジェクトのバージョン ID を指定します。
        SourceVersionId = versionid
    };
    // オブジェクトをコピーします。
    var result = client.CopyObject(req);
    Console.WriteLine("Copy object succeeded, vesionid:{0}", result.VersionId);
}
catch (OssException ex)
{
    Console.WriteLine("Failed with error code: {0}; Error info: {1}. \nRequestID: {2} \tHostID: {3}",
        ex.ErrorCode, ex.Message, ex.RequestId, ex.HostId);
}
catch (Exception ex)
{
    Console.WriteLine("Failed with error info: {0}", ex.Message);
}
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;

int main(void)
{
    /* OSS アカウント情報を初期化します。 */
            
    /* Endpoint を、バケットが配置されているリージョンのエンドポイントに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、Endpoint を https://oss-cn-hangzhou.aliyuncs.com に設定します。 */
    std::string Endpoint = "yourEndpoint";
    /* Region を、バケットが配置されているリージョンに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、Region を cn-hangzhou に設定します。 */
    std::string Region = "yourRegion";
    /* ソースバケット名を指定します。例:srcexamplebucket。 */
    std::string SourceBucketName = "srcexamplebucket";
    /* 送信先バケット名を指定します。送信先バケットはソースバケットと同じリージョンに配置されている必要があります。例:destbucket。 */
    std::string CopyBucketName = "destbucket";
    /* ソースオブジェクトの完全なパスを指定します。完全なパスにはバケット名を含めないでください。例:srcdir/scrobject.txt。 */
    std::string SourceObjectName = "srcdir/scrobject.txt";
    /* 送信先オブジェクトの完全なパスを指定します。完全なパスにはバケット名を含めないでください。例:destdir/destobject.txt。 */
    std::string CopyObjectName = "destdir/destobject.txt";


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

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

    CopyObjectRequest request(CopyBucketName, CopyObjectName);
    request.setCopySource(SourceBucketName, SourceObjectName);
    /* ソースオブジェクトのバージョン ID を指定します。 */
    request.setVersionId("yourSourceObjectVersionId");

    /* 指定されたバージョンのオブジェクトをコピーします。 */
    auto outcome = client.CopyObject(request);

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

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

import (
	"context"
	"flag"
	"log"

	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)

// グローバル変数を定義します。
var (
	region         string // オブジェクトが保存されているリージョン。
	srcBucketName  string // ソースバケット名。
	srcObjectName  string // ソースオブジェクト名。
	destBucketName string // 送信先バケット名。
	destObjectName string // 送信先オブジェクト名。
)

// コマンドラインパラメーターを初期化するために使用される init 関数を指定します。
func init() {
	flag.StringVar(&region, "region", "", "The region in which the bucket is located.")
	flag.StringVar(&srcBucketName, "src-bucket", "", "The name of the source bucket.")
	flag.StringVar(&srcObjectName, "src-object", "", "The name of the source object.")
	flag.StringVar(&destBucketName, "dest-bucket", "", "The name of the destination bucket.")
	flag.StringVar(&destObjectName, "dest-object", "", "The name of the destination object.")
}

func main() {
	// コマンドラインパラメーターを解析します。
	flag.Parse()

	// ソースバケット名が指定されているかどうかを確認します。
	if len(srcBucketName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, source bucket name required")
	}

	// リージョンが指定されているかどうかを確認します。
	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, region required")
	}

	// 送信先バケット名が指定されていない場合、ソースバケット名を使用します。
	if len(destBucketName) == 0 {
		destBucketName = srcBucketName
	}

	// ソースオブジェクト名が指定されているかどうかを確認します。
	if len(srcObjectName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, source object name required")
	}

	// 送信先オブジェクト名が指定されているかどうかを確認します。
	if len(destObjectName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, destination object name required")
	}

	// デフォルト設定をロードし、認証情報プロバイダーおよびリージョンを指定します。
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

	// OSS クライアントを作成します。
	client := oss.NewClient(cfg)

	// コピーリクエストを作成します。
	copyRequest := &oss.CopyObjectRequest{
		Bucket:           oss.Ptr(destBucketName),            // 送信先バケット名。
		Key:              oss.Ptr(destObjectName),            // 送信先オブジェクト名。
		SourceKey:        oss.Ptr(srcObjectName),             // ソースオブジェクト名。
		SourceBucket:     oss.Ptr(srcBucketName),             // ソースバケット名。
		SourceVersionId:  oss.Ptr("yourVersionId"),           // ソースオブジェクトの実際のバージョン ID を指定します。
		StorageClass:     oss.StorageClassStandard,           // ストレージクラスを Standard に設定します。
		TaggingDirective: oss.Ptr("Replace"),                 // ソースオブジェクトのタグはコピーされません。
		Tagging:          oss.Ptr("tag1=value1&tag2=value2"), // 送信先オブジェクトの実際のタグを指定します。
	}

	// 操作を実行し、結果を処理します。
	copyResult, err := client.CopyObject(context.TODO(), copyRequest)
	if err != nil {
		log.Fatalf("failed to copy object: %v", err)
	}

	// 結果を表示します。
	log.Printf("copy object result versionId:%#v\n", *copyResult.VersionId)

}
<?php

// 依存関係をロードするために autoload ファイルをインクルードします。
require_once __DIR__ . '/../vendor/autoload.php';

use AlibabaCloud\Oss\V2 as Oss;

// コマンドラインパラメーターの説明を指定します。
$optsdesc = [
    "region" => ['help' => The region in which the bucket is located.', 'required' => True], // (必須) バケットが配置されているリージョンを指定します。
    "endpoint" => ['help' => The domain names that other services can use to access OSS.', 'required' => False], // (オプション) 他のサービスが OSS にアクセスするために使用できるエンドポイントを指定します。
    "bucket" => ['help' => The name of the bucket, 'required' => True], // (必須) 送信先バケット名を指定します。
    "key" => ['help' => The name of the object, 'required' => True], // (必須) 送信先オブジェクト名を指定します。
    "src-bucket" => ['help' => 'The name of the source bucket', 'required' => False], // (オプション) ソースバケット名を指定します。
    "key" => ['help' => The name of the object, 'required' => True], // (必須) ソースオブジェクト名を指定します。
];

// getopt に必要なロングオプションリストにパラメーターの説明を変換します。
// 各パラメーターの末尾にコロン (:) を追加して、値が必要であることを示します。
$longopts = \array_map(function ($key) {
    return "$key:";
}, array_keys($optsdesc));

// コマンドラインパラメーターを解析します。
$options = getopt("", $longopts);

// 必須パラメーターが設定されているかどうかを確認します。
foreach ($optsdesc as $key => $value) {
    if ($value['required'] === True && empty($options[$key])) {
        $help = $value['help']; // パラメーターのヘルプ情報を取得します。
        echo "Error: the following arguments are required: --$key, $help" . PHP_EOL;
        exit(1); // 必須パラメーターが設定されていない場合、プログラムを終了します。
    }
}

// 解析されたパラメーターから値を取得します。
$region = $options["region"]; // バケットが配置されているリージョン。
$bucket = $options["bucket"]; // 送信先バケット名。
$key = $options["key"]; // 送信先オブジェクト名。
$srcKey = $options["src-key"]; // ソースオブジェクト名。

// 環境変数からアクセス認証情報を取得します。
// EnvironmentVariableCredentialsProvider 環境変数から AccessKey ID および AccessKey Secret を取得します。
$credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider();

// SDK のデフォルト設定を使用します。
$cfg = Oss\Config::loadDefault();
$cfg->setCredentialsProvider($credentialsProvider); // 認証情報プロバイダーを指定します。
$cfg->setRegion($region); // バケットが配置されているリージョンを指定します。
if (isset($options["endpoint"])) {
    $cfg->setEndpoint($options["endpoint"]); // エンドポイントが提供されている場合、エンドポイントを指定します。
}

// OSSClient インスタンスを作成します。
$client = new Oss\Client($cfg);

// ソースオブジェクトをコピーする CopyObjectRequest オブジェクトを作成します。
$request = new Oss\Models\CopyObjectRequest(
            bucket: $bucket,
            key: $key,
            sourceVersionId: "yourVersionId",// ソースオブジェクトのバージョン ID を指定します。
);

if (!empty($options["src-bucket"])) {
    $request->sourceBucket = $options["src-bucket"]; // ソースバケット名が提供されている場合、sourceBucket パラメーターを指定します。
}
$request->sourceKey = $srcKey; // ソースオブジェクト名を指定します。

// オブジェクトコピー操作を実行します。
$result = $client->copyObject($request);

// オブジェクトコピー結果を表示します。
printf(
    'status code:' . $result->statusCode . PHP_EOL . // HTTP ステータスコード。たとえば、HTTP ステータスコード 200 はリクエストが成功したことを示します。
    'request id:' . $result-> requestId. PHP_EOL // リクエストをデバッグまたはトレースするために使用されるリクエスト ID。
);
import argparse
import alibabacloud_oss_v2 as oss

# コマンドライン引数パーサを作成し、スクリプトの目的(バケット内のオブジェクトをコピーする)を説明します。
parser = argparse.ArgumentParser(description="copy object sample")

# 必須のリージョン、送信先バケット名、ソースバケット名、送信先オブジェクト名、ソースオブジェクト名、ソースオブジェクトのバージョン ID、およびオプションのエンドポイントを含むコマンドライン引数を定義します。
parser.add_argument('--region', help='The region in which the bucket is located.', required=True)
parser.add_argument('--bucket', help='The name of the destination bucket.', required=True)
parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS')
parser.add_argument('--key', help='The name of the destination object.', required=True)
parser.add_argument('--source_key', help='The name of the source object.', required=True)
parser.add_argument('--source_bucket', help='The name of the source bucket.', required=True)
parser.add_argument('--source_version_id', help='The version ID of the source object.',required=True)

def main():
    # コマンドライン引数を解析して、ユーザーが入力した値を取得します。
    args = parser.parse_args()

    # 本人確認のために、環境変数からアクセス認証情報を読み込みます。
    credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()

    # デフォルトの SDK 構成を使用して構成オブジェクトを作成し、認証プロバイダーを設定します。
    cfg = oss.config.load_default()
    cfg.credentials_provider = credentials_provider

    # コマンドライン引数に基づいて、構成オブジェクトのリージョンプロパティを設定します。
    cfg.region = args.region

    # カスタムエンドポイントが指定されている場合は、構成オブジェクトのエンドポイントプロパティを更新します。
    if args.endpoint is not None:
        cfg.endpoint = args.endpoint

    # 上記の構成を使用して OSS クライアントを初期化し、OSS との対話の準備をします。
    client = oss.Client(cfg)

    # 指定されたオブジェクトをコピーするリクエストを送信します。
    result = client.copy_object(oss.CopyObjectRequest(
        bucket=args.bucket,  # 送信先バケット名。
        key=args.key,  # 送信先オブジェクト名。
        source_key=args.source_key,  # ソースオブジェクト名。
        source_bucket=args.source_bucket,  # ソースバケット名。
        source_version_id=args.source_version_id,  # ソースオブジェクトのバージョン ID。
    ))

    # 操作結果に関する情報を出力して、リクエスト状態を確認します。
    print(f'status code: {result.status_code},'
          f' request id: {result.request_id},'
          f' version id: {result.version_id},'
          f' hash crc64: {result.hash_crc64},'
          f' source version id: {result.source_version_id},'
          f' server side encryption: {result.server_side_encryption},'
          f' server side data encryption: {result.server_side_data_encryption},'
          f' last modified: {result.last_modified},'
          f' etag: {result.etag},'
          )

# このスクリプトが直接実行された場合、処理ロジックを開始するために main 関数を呼び出します。
if __name__ == "__main__":
    main()  # スクリプトのエントリポイント。プログラムフローはここから始まります。

ossutil を使用する

ossutil を使用してオブジェクトの過去バージョンを復元するには、「revert (バージョンの復元)」をご参照ください。

RESTful API を使用する

アプリケーションにカスタム要件がある場合は、RESTful API リクエストを直接送信できます。この場合、リクエスト署名を手動で計算するコードを記述する必要があります。詳細については、「CopyObject」をご参照ください。