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

Object Storage Service:オブジェクトのストレージクラスの変更 (Go SDK V1)

最終更新日:Nov 29, 2025

Object Storage Service (OSS) は、標準、低頻度アクセス (IA)、アーカイブ、コールドアーカイブ、ディープコールドアーカイブなど、複数のストレージクラスを提供します。これらのストレージクラスは、ホットデータからコールドデータまで、さまざまなデータストレージのニーズに対応します。OSS では、オブジェクトの作成後にその内容を変更することはできません。つまり、既存のオブジェクトのストレージクラスを直接変更することはできません。代わりに、新しいオブジェクトを作成する必要があります。オブジェクトのストレージクラスを変更するには、Bucket.CopyObject メソッドを使用します。このメソッドは、ソースオブジェクトを目的のストレージクラスを持つ新しいオブジェクトにコピーします。

注意事項

  • このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントを使用します。OSS と同じリージョンにある他の Alibaba Cloud サービスから OSS にアクセスする場合は、内部エンドポイントを使用してください。OSS のリージョンとエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。

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

  • このトピックでは、OSS エンドポイントを使用して OSSClient インスタンスを作成します。カスタムドメイン名または Security Token Service (STS) を使用して OSSClient インスタンスを作成する場合は、「クライアントの設定 (Go SDK V1)」をご参照ください。

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

サンプルコード

次のコードは、Bucket.CopyObject メソッドを使用してオブジェクトのストレージクラスを変更する方法の例を示しています:

  1. オブジェクトのストレージクラスを標準または低頻度アクセスからアーカイブに変更します:

    package main
    
    import (
    	"log"
    
    	"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 {
    		log.Fatalf("Failed to create credentials provider: %v", err)
    	}
    
    	// OSSClient インスタンスを作成します。
    	// yourEndpoint をバケットのエンドポイントに設定します。たとえば、中国 (杭州) リージョンの場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。他のリージョンの場合は、実際のエンドポイントを使用します。
    	// yourRegion をバケットが配置されているリージョンに設定します。たとえば、中国 (杭州) リージョンの場合、リージョンを cn-hangzhou に設定します。他のリージョンの場合は、実際のリージョンを使用します。
    	clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
    	clientOptions = append(clientOptions, oss.Region("yourRegion"))
    	// 署名バージョンを設定します。
    	clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
    	client, err := oss.New("yourEndpoint", "", "", clientOptions...)
    	if err != nil {
    		log.Fatalf("Failed to create OSS client: %v", err)
    	}
    
    	// yourBucketName をバケットの名前に設定します。
    	bucketName := "yourBucketName" // 実際のバケット名に置き換えます。
    	// yourObjectName をオブジェクトの完全なパスに設定します。バケット名は含めないでください。
    	objectName := "yourObjectName" // 実際のオブジェクトパスに置き換えます。
    
    	bucket, err := client.Bucket(bucketName)
    	if err != nil {
    		log.Fatalf("Failed to get bucket: %v", err)
    	}
    
    	// オブジェクトのストレージクラスを変更します。たとえば、アーカイブに変更します。
    	_, err = bucket.CopyObject(objectName, objectName, oss.ObjectStorageClass(oss.StorageArchive))
    	if err != nil {
    		log.Fatalf("Failed to change storage class of object: %v", err)
    	}
    
    	log.Println("Storage class changed successfully.")
    }
    
  2. オブジェクトのストレージクラスをアーカイブから標準に変更します:

    package main
    
    import (
    	"log"
    	"time"
    
    	"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 {
    		log.Fatalf("Failed to create credentials provider: %v", err)
    	}
    
    	// OSSClient インスタンスを作成します。
    	// yourEndpoint をバケットのエンドポイントに設定します。たとえば、中国 (杭州) リージョンの場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。他のリージョンの場合は、実際のエンドポイントを使用します。
    	// yourRegion をバケットが配置されているリージョンに設定します。たとえば、中国 (杭州) リージョンの場合、リージョンを cn-hangzhou に設定します。他のリージョンの場合は、実際のリージョンを使用します。
    	clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
    	clientOptions = append(clientOptions, oss.Region("yourRegion"))
    	// 署名バージョンを設定します。
    	clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
    	client, err := oss.New("yourEndpoint", "", "", clientOptions...)
    	if err != nil {
    		log.Fatalf("Failed to create OSS client: %v", err)
    	}
    
    	// yourBucketName をバケットの名前に設定します。
    	bucketName := "yourBucketName" // 実際のバケット名に置き換えます。
    	// yourObjectName をオブジェクトの完全なパスに設定します。バケット名は含めないでください。
    	objectName := "yourObjectName" // 実際のオブジェクトパスに置き換えます。
    
    	bucket, err := client.Bucket(bucketName)
    	if err != nil {
    		log.Fatalf("Failed to get bucket: %v", err)
    	}
    
    	// オブジェクトがアーカイブオブジェクトであるかどうかを確認します。そうである場合は、ストレージクラスを変更する前に解凍する必要があります。
    	meta, err := bucket.GetObjectDetailedMeta(objectName)
    	if err != nil {
    		log.Fatalf("Failed to get object detailed metadata: %v", err)
    	}
    
    	log.Printf("X-Oss-Storage-Class: %s\n", meta.Get(oss.HTTPHeaderOssStorageClass))
    	if meta.Get(oss.HTTPHeaderOssStorageClass) == string(oss.StorageArchive) {
    		// オブジェクトを解凍します。
    		err = bucket.RestoreObject(objectName)
    		if err != nil {
    			log.Fatalf("Failed to restore object: %v", err)
    		}
    
    		// オブジェクトが解凍されるのを待ちます。通常、これには約 1 分かかります。
    		meta, err = bucket.GetObjectDetailedMeta(objectName)
    		for meta.Get("X-Oss-Restore") == "ongoing-request=\"true\"" {
    			log.Printf("X-Oss-Restore: %s\n", meta.Get("X-Oss-Restore"))
    			time.Sleep(1 * time.Second)
    			meta, err = bucket.GetObjectDetailedMeta(objectName)
    			if err != nil {
    				log.Fatalf("Failed to get object detailed metadata during restore process: %v", err)
    			}
    		}
    	}
    
    	// 解凍されたオブジェクトのストレージクラスを変更します。たとえば、標準に変更します。
    	_, err = bucket.CopyObject(objectName, objectName, oss.ObjectStorageClass(oss.StorageStandard))
    	if err != nil {
    		log.Fatalf("Failed to change storage class of object: %v", err)
    	}
    
    	log.Println("Storage class changed successfully.")
    }
    

関連ドキュメント

オブジェクトのストレージクラスの変更に使用される API 操作の詳細については、「CopyObject」をご参照ください。