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

Object Storage Service:OSS SDK for Go 2.0 を使用してオブジェクトのストレージクラスを変換する

最終更新日:Aug 06, 2025

Object Storage Service (OSS) は、ホットデータからコールドデータまでのさまざまなデータストレージシナリオに対応するために、標準、低頻度アクセス (IA)、アーカイブ、コールドアーカイブ、ディープコールドアーカイブというストレージクラスを提供しています。OSS では、オブジェクトが作成されると、そのコンテンツを変更することはできず、コピーのストレージクラスのみを変換できます。このトピックでは、Copier.Copy または Client.CopyObject メソッドを使用してコピーを作成し、そのストレージクラスを変更する方法について説明します。

使用上の注意

  • このトピックのサンプルコードでは、中国 (杭州) リージョンのリージョン ID cn-hangzhou を使用しています。 デフォルトでは、パブリックエンドポイントを使用してバケット内のリソースにアクセスします。 バケットが配置されているのと同じリージョン内の他の Alibaba Cloud サービスを使用してバケット内のリソースにアクセスする場合は、内部エンドポイントを使用します。 Object Storage Service (OSS) でサポートされているリージョンとエンドポイントの詳細については、「OSS のリージョンとエンドポイント」をご参照ください。

  • このトピックでは、アクセス認証情報は環境変数から取得されます。アクセス認証情報の構成方法の詳細については、「アクセス認証情報を構成する」をご参照ください。

  • オブジェクトのストレージクラスを変更するには、oss:GetObjectoss:PutObject、および oss:RestoreObject 権限が必要です。 詳細については、「RAM ユーザーにカスタムポリシーを付与する方法」をご参照ください。

サンプルコード

(推奨) Copier を使用してストレージクラスを変換する

Copier.Copy メソッドを使用してオブジェクトのストレージクラスを変換することをお勧めします。このメソッドは、単純コピーとマルチパートコピーのインターフェイスを統合し、リクエストのパラメーターに基づいて適切なメソッドを自動的に選択します。

次のコードは、Copier.Copy メソッドを使用して、オブジェクトのストレージクラスを標準からアーカイブに変換する例を示しています。

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", "", "バケットが配置されているリージョン。")
	flag.StringVar(&srcBucketName, "src-bucket", "", "ソースバケットの名前。")
	flag.StringVar(&srcObjectName, "src-object", "", "ソースオブジェクトの名前。")
	flag.StringVar(&destBucketName, "dest-bucket", "", "デスティネーションバケットの名前。")
	flag.StringVar(&destObjectName, "dest-object", "", "デスティネーションオブジェクトの名前。")
}

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

	// ソースバケット名が指定されているかどうかを確認します。
	if len(srcBucketName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("無効なパラメーターです。バケット名が必要です。")
	}

	// リージョンが指定されているかどうかを確認します。
	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("無効なパラメーターです。リージョンが必要です。")
	}

	// デスティネーションバケット名が指定されていない場合は、ソースバケット名が使用されます。
	if len(destBucketName) == 0 {
		destBucketName = srcBucketName
	}

	// ソースオブジェクト名が指定されているかどうかを確認します。
	if len(srcObjectName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("無効なパラメーターです。ソースオブジェクト名が必要です。")
	}

	// デスティネーションオブジェクト名が指定されているかどうかを確認します。
	if len(destObjectName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("無効なパラメーターです。デスティネーションオブジェクト名が必要です。")
	}

	// デフォルトの構成を読み込み、認証情報プロバイダーとリージョンを指定します。
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

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

	// Copier を作成します。
	c := client.NewCopier()

	// オブジェクトをコピーするリクエストを作成します。
	request := &oss.CopyObjectRequest{
		Bucket:       oss.Ptr(destBucketName), // デスティネーションバケットの名前。
		Key:          oss.Ptr(destObjectName), // デスティネーションオブジェクトの名前。
		SourceKey:    oss.Ptr(srcObjectName),  // ソースオブジェクトの名前。
		SourceBucket: oss.Ptr(srcBucketName),  // ソースバケットの名前。
		StorageClass: oss.StorageClassArchive, // ストレージクラスをアーカイブとして指定します。
	}

	// ソースオブジェクトをコピーします。
	result, err := c.Copy(context.TODO(), request)
	if err != nil {
		log.Fatalf("オブジェクトのコピーに失敗しました %v", err) // コピーに失敗した場合は、エラーメッセージを記録して終了します。
	}

	// 結果を表示します。
	log.Printf("オブジェクトのコピー結果:%#v\n", result)
}

CopyObject メソッドを使用してストレージクラスを変換する

次のコードは、CopyObject メソッドを使用して、オブジェクトのストレージクラスを標準からアーカイブに変換する例を示しています。

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 // ソースオブジェクトの名前。
	destBucketName string // デスティネーションバケットの名前。
	destObjectName string // デスティネーションオブジェクトの名前。
)

// コマンドラインパラメーターを初期化するために使用する init 関数を指定します。
func init() {
	flag.StringVar(&region, "region", "", "バケットが配置されているリージョン。")
	flag.StringVar(&bucketName, "bucket", "", "ソースバケットの名前。")
	flag.StringVar(&objectName, "src-object", "", "ソースオブジェクトの名前。")
	flag.StringVar(&destBucketName, "dest-bucket", "", "デスティネーションバケットの名前。")
	flag.StringVar(&destObjectName, "dest-object", "", "デスティネーションオブジェクトの名前。")
}

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

	// ソースバケット名が指定されているかどうかを確認します。
	if len(bucketName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("無効なパラメーターです。ソースバケット名が必要です。")
	}

	// リージョンが指定されているかどうかを確認します。
	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("無効なパラメーターです。リージョンが必要です。")
	}

	// デスティネーションバケット名が指定されていない場合は、ソースバケット名が使用されます。
	if len(destBucketName) == 0 {
		destBucketName = bucketName
	}

	// ソースオブジェクト名が指定されているかどうかを確認します。
	if len(objectName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("無効なパラメーターです。ソースオブジェクト名が必要です。")
	}

	// デスティネーションオブジェクト名が指定されているかどうかを確認します。
	if len(destObjectName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("無効なパラメーターです。デスティネーションオブジェクト名が必要です。")
	}

	// デフォルトの構成を読み込み、認証情報プロバイダーとリージョンを指定します。
	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(objectName),     // ソースオブジェクトの名前。
		SourceBucket: oss.Ptr(bucketName),     // ソースバケットの名前。
		StorageClass: oss.StorageClassArchive, // ストレージクラスをアーカイブに変換します。
	}

	// ソースオブジェクトをコピーし、結果を処理します。
	copyResult, err := client.CopyObject(context.TODO(), copyRequest)
	if err != nil {
		log.Fatalf("オブジェクトのコピーに失敗しました: %v", err)
	}
	log.Printf("オブジェクトのコピー結果: %#v\n", copyResult)
}

関連情報

  • Copier を使用してオブジェクトのストレージクラスを変換するために呼び出すことができる API 操作の詳細については、「Copier.Copy」をご参照ください。

  • CopyObject メソッドを使用してオブジェクトのストレージクラスを変換するために呼び出すことができる API 操作の詳細については、「CopyObject」をご参照ください。