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

Object Storage Service:一度に複数のオブジェクトを復元するにはどうすればよいですか?

最終更新日:May 06, 2024

Archiveオブジェクトのリアルタイムアクセスを有効にしない場合、Archiveオブジェクトは復元した後にのみアクセスできます。 object Storage Service (OSS) コンソールを使用して、毎回1つのオブジェクトのみを復元できます。 OSSコンソールを使用して、ディレクトリ内の複数のオブジェクトを一度に復元することはできません。 一度に複数のオブジェクトを復元するには、他の方法を使用できます。 このトピックでは、一度に複数のオブジェクトを復元する方法について説明します。

解決策

バケット内の複数のオブジェクトを一度に復元するには、次の手順を実行します。

1. すべてのオブジェクトを一覧表示します。

  • バケット内のオブジェクトを一覧表示するには、バケットインベントリ機能を使用することを推奨します。 詳細については、「バケットインベントリ」をご参照ください。

  • ListObjects操作を呼び出してオブジェクトを一覧表示することもできます。 ただし、この操作では、在庫ベースのリストよりも高い料金が発生します。 詳細については、「オブジェクトのリスト」および「API操作呼び出し料金」をご参照ください。

2. バケットインベントリ機能を使用してオブジェクトをリストする場合、返されたインベントリリストでStorageClassがArchiveであるオブジェクトをフィルタリングし、バケット名を除くオブジェクトの完全なパスを記録します。

説明

OSS SDKを使用してオブジェクトを一覧表示する場合は、KeyとStorageClassの組み合わせを使用して、オブジェクトのパスとそのストレージクラスを取得します。 次のサンプルコードは、"s" オブジェクトのパスとそのストレージクラスを返します。

System.out.println("fileurl" + s.getKey()+ "&stu:" + s.getStorageClass());

3. 対応するパス内のオブジェクトを一度に復元します。 次のいずれかの方法を使用して、一度に複数のオブジェクトを復元できます。 詳細については、「オブジェクトの復元」をご参照ください。

  • ossutil: 他の2つの方法と比較して、コマンドライン操作に精通している場合、ossutilはよりシンプルで効率的に使用できます。

  • OSS SDK: ossutilと比較して、OSS SDKの使用はより複雑で、コードの読み取りと変更が必要です。 コードはコンパイルされ、ローカルデバイスで実行されます。 ただし、OSS SDKはコードの再利用性が向上します。 このトピックの後半では、OSS SDK for Javaを使用して一度に複数のオブジェクトを復元する方法を示すコードサンプルを提供します。

  • OSS API: OSS APIは、一度に複数のオブジェクトを復元するAPI操作を提供しません。 復元する各オブジェクトに対してRestoreObject操作を呼び出す必要があります。 操作を呼び出すときに署名を計算するコードを記述する必要があります。 アプリケーションで高度なカスタマイズが必要な場合は、OSS APIを使用することを推奨します。

SDKの例

追加情報

オブジェクトの復元トピックで提供されているJavaサンプルコードは、1つのオブジェクトのみを復元します。 一度に複数のオブジェクトを復元するには、JavaサンプルコードのobjectName変数を、復元するオブジェクトのパスを格納するリスト型の変数に置き換えます。 次のサンプルコードは、「オブジェクトの復元」トピックで提供されているJavaサンプルコードを変更して、一度に複数のオブジェクトを復元します。

説明

復元が完了したかどうかを確認するには、OSSオブジェクトが復元されているかどうかを確認するにはどうすればよいですか。

コールドアーカイブまたはディープコールドアーカイブオブジェクトを復元する場合は、「概要」をご参照ください。対応する [オブジェクトの復元] トピックへのリンクをクリックします。

com.aliyun.oss.ClientExceptionをインポートします。com.aliyun.oss.OSSをインポートします。impor t com.aliyun.oss.com mon.auth.*;
com.aliyun.oss.OSSClientBuilderをインポートします。com.aliyun.oss.OSSExceptionをインポートします。com.aliyun.oss.mo delをインポートします。*;

java.util.ArrayListをインポートします。java.util.Listをインポートします。public classデモ {
    public static void main(String[] args) throws Exception {
        // この例では、中国 (北京) リージョンのエンドポイントが使用されます。 実際のエンドポイントを指定します。 
        String endpoint = "oss-cn-beijing.aliyuncs.com";
        // 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。 
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // バケットの名前を指定します。 例: examplebucket. 
        String bucketName = "examplebucket";
        // 復元するアーカイブオブジェクトの完全なパスのリストを作成します。 オブジェクトの完全なパスにバケット名を含めないでください。 
        List<String> filePaths = new ArrayList<>();
        filePaths.add("filePath1");
        filePaths.add("filePath2");

        // Create an OSSClient instance. 
        OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);

        try {
            for (String filePath : filePaths) {
                ObjectMetadata objectMetadata = ossClient.getObjectMetadata(bucketName, filePath);
                // オブジェクトがアーカイブオブジェクトかどうかを確認します。 
                StorageClass storageClass = objectMetadata.getObjectStorageClass();
                if (storageClass == StorageClass.Archive) {
                    // オブジェクトを復元します。 
                    ossClient.restoreObject(bucketName、filePath);
                }
                System.out.println(filePath + 「解凍開始」);
            }
        } catch (Exception e) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "しかし、何らかの理由でエラー応答で拒否されました。");
            System.out.println("エラーメッセージ:" + oe.getErrorMessage());
            System.out.println("エラーコード:" + oe.getErrorCode());
            System.out.println("リクエストID:" + oe.getRequestId());
            System.out.println("ホストID:" + oe.getHostId());
        } catch (ClientException e) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + 「ネットワークにアクセスできないなど」;
            System.out.println("エラーメッセージ:" + ce.getMessage());
        } 最後に{
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}

参考資料