Object Storage Service (OSS) は、標準、低頻度アクセス (IA)、アーカイブ、コールドアーカイブ、ディープコールドアーカイブなど、複数のストレージクラスを提供します。これらのストレージクラスは、ホットデータからコールドデータまで、さまざまなデータストレージのニーズに対応します。OSS では、オブジェクトの作成後にその内容を変更することはできません。つまり、既存のオブジェクトのストレージクラスを直接変更することはできません。代わりに、新しいオブジェクトを作成する必要があります。オブジェクトのストレージクラスを変更するには、Bucket.CopyObject メソッドを使用します。このメソッドは、ソースオブジェクトを目的のストレージクラスを持つ新しいオブジェクトにコピーします。
注意事項
このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントを使用します。OSS と同じリージョンにある他の Alibaba Cloud サービスから OSS にアクセスする場合は、内部エンドポイントを使用してください。OSS のリージョンとエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。
このトピックでは、環境変数からアクセス認証情報を取得します。アクセス認証情報の設定方法の詳細については、「アクセス認証情報の設定」をご参照ください。
このトピックでは、OSS エンドポイントを使用して OSSClient インスタンスを作成します。カスタムドメイン名または Security Token Service (STS) を使用して OSSClient インスタンスを作成する場合は、「クライアントの設定 (Go SDK V1)」をご参照ください。
オブジェクトのストレージクラスを変換するには、
oss:GetObject、oss:PutObject、およびoss:RestoreObjectの権限が必要です。詳細については、「RAM ユーザーへのカスタムポリシーのアタッチ」をご参照ください。
サンプルコード
次のコードは、Bucket.CopyObject メソッドを使用してオブジェクトのストレージクラスを変更する方法の例を示しています:
オブジェクトのストレージクラスを標準または低頻度アクセスからアーカイブに変更します:
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.") }オブジェクトのストレージクラスをアーカイブから標準に変更します:
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」をご参照ください。