Object Storage Service (OSS) は、ホットデータからコールドデータまで、さまざまなデータストレージシナリオに対応するために、標準、低頻度アクセス (IA)、アーカイブ、コールドアーカイブ、ディープコールドアーカイブといったストレージクラスを提供しています。OSS では、オブジェクトが一度作成されると、その内容は変更できません。オブジェクトのストレージクラスを変換したい場合は、`Bucket.CopyObject` メソッドを使用してオブジェクトをコピーして新しいオブジェクトを作成し、新しいオブジェクトのストレージクラスを変換する必要があります。
注意事項
このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントを使用します。同一リージョン内の他の Alibaba Cloud サービスから OSS にアクセスするには、内部エンドポイントを使用します。サポートされているリージョンとエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。
このトピックでは、アクセス認証情報は環境変数から取得されます。アクセス認証情報の設定方法の詳細については、「アクセス認証情報の設定」をご参照ください。
このトピックでは、OSS エンドポイントを使用して OSSClient インスタンスを作成します。カスタムドメイン名またはセキュリティトークンサービス (STS) を使用して OSSClient インスタンスを作成する場合は、「一般的なシナリオの設定例」をご参照ください。
オブジェクトのストレージクラスを変換するには、
oss:GetObject、oss:PutObject、oss:RestoreObjectの権限が必要です。詳細については、「RAM ユーザーへのカスタムポリシーのアタッチ」をご参照ください。
例
低頻度アクセス (IA)、アーカイブ、コールドアーカイブ、またはディープコールドアーカイブのオブジェクトのストレージクラスを変換するか、最低保存期間が終了する前にオブジェクトを削除すると、最低保存期間より短いストレージに対する料金が請求されます。詳細については、「最低保存期間より短いストレージ期間のオブジェクトはどのように課金されますか?」をご参照ください。
標準または低頻度アクセスからアーカイブ、コールドアーカイブ、ディープコールドアーカイブへのストレージクラスの変換
次のコードは、オブジェクトのストレージクラスを標準または低頻度アクセスからアーカイブ、コールドアーカイブ、またはディープコールドアーカイブに変換する方法を示しています。
import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.CopyObjectRequest;
import com.aliyun.oss.model.CopyObjectResult;
import com.aliyun.oss.model.ObjectMetadata;
import com.aliyun.oss.model.StorageClass;
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";
// オブジェクトの完全なパスを指定します。バケット名は含めないでください。例:exampleobject.txt。
String objectName = "exampleobject.txt";
// バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを 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 request = new CopyObjectRequest(bucketName, objectName, bucketName, objectName) ;
// ObjectMetadata オブジェクトを作成します。
ObjectMetadata objectMetadata = new ObjectMetadata();
// オブジェクトのストレージクラスをアーカイブに変換します。
objectMetadata.setHeader("x-oss-storage-class", StorageClass.Archive);
// オブジェクトのストレージクラスをコールドアーカイブに変換します。
// objectMetadata.setHeader("x-oss-storage-class", StorageClass.ColdArchive);
// オブジェクトのストレージクラスをディープコールドアーカイブに変換します。
// objectMetadata.setHeader("x-oss-storage-class", StorageClass.DeepColdArchive);
request.setNewObjectMetadata(objectMetadata);
// オブジェクトのストレージクラスを変更します。
CopyObjectResult result = ossClient.copyObject(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();
}
}
}
}アーカイブから標準または低頻度アクセスへのストレージクラスの変換
次のコードは、オブジェクトのストレージクラスをアーカイブから標準または低頻度アクセスに変換する方法を示しています。
import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.CopyObjectRequest;
import com.aliyun.oss.model.CopyObjectResult;
import com.aliyun.oss.model.ObjectMetadata;
import com.aliyun.oss.model.StorageClass;
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";
// オブジェクトの完全なパスを指定します。バケット名は含めないでください。例:exampleobject.txt。
String objectName = "exampleobject.txt";
// バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを 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 {
// オブジェクトのメタデータを取得します。
ObjectMetadata objectMetadata = ossClient.getObjectMetadata(bucketName, objectName);
// オブジェクトがアーカイブオブジェクトであるかどうかを確認します。そうである場合は、ストレージクラスを変更する前に解凍する必要があります。
StorageClass storageClass = objectMetadata.getObjectStorageClass();
System.out.println("storage type:" + storageClass);
if (storageClass == StorageClass.Archive) {
// オブジェクトを解凍します。
ossClient.restoreObject(bucketName, objectName);
// オブジェクトが解凍されるのを待ちます。
do {
Thread.sleep(1000);
objectMetadata = ossClient.getObjectMetadata(bucketName, objectName);
} while (!objectMetadata.isRestoreCompleted());
}
// CopyObjectRequest オブジェクトを作成します。
CopyObjectRequest request = new CopyObjectRequest(bucketName, objectName, bucketName, objectName) ;
// ObjectMetadata オブジェクトを作成します。
objectMetadata = new ObjectMetadata();
// オブジェクトのストレージクラスを低頻度アクセスに変換します。
objectMetadata.setHeader("x-oss-storage-class", StorageClass.IA);
// オブジェクトのストレージクラスを標準に変換します。
// objectMetadata.setHeader("x-oss-storage-class", StorageClass.Standard);
request.setNewObjectMetadata(objectMetadata);
// オブジェクトのストレージクラスを変更します。
CopyObjectResult result = ossClient.copyObject(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();
}
}
}
}関連ドキュメント
オブジェクトストレージクラスを変換するための完全なサンプルコードについては、「GitHub の例」をご参照ください。
オブジェクトストレージクラスを変換するための API 操作の詳細については、「CopyObject」をご参照ください。