Object Storage Service (OSS) のアーカイブ、コールドアーカイブ、またはディープコールドアーカイブストレージタイプのオブジェクトは、凍結ステータスで保存されます。この状態ではコストを節約できますが、オブジェクトを直接読み取ることはできません。これらのオブジェクトをダウンロード、処理、または分析する前に、読み取り可能な状態に解凍する必要があります。
仕組み
解凍により、凍結ステータスのオブジェクトの一時的な読み取り可能なレプリカが作成されます。この操作では、元のオブジェクトのストレージタイプは変更されません。オブジェクトは次の状態を遷移します:
凍結: オブジェクトの初期の読み取り不可能な状態。メタデータのクエリやオブジェクトの削除など、読み取り以外の操作のみがサポートされます。
解凍中:
RestoreObjectリクエストが送信されると、オブジェクトはこの状態になります。リクエストは非同期で処理されます。最初のリクエストに対して、API は
202 Acceptedを返します。オブジェクトがこの状態のときに同じ優先度で別の解凍リクエストを送信すると、API は
409 Conflictエラーを返します。これは、操作がすでに進行中であることを示します。ただし、より高い優先度で新しいリクエストを送信して、プロセスを迅速化することができます。
解凍済み: 一時的なレプリカが作成され、オブジェクトはこの状態になります。これでオブジェクトのコンテンツを読み取ることができます。この状態で別の解凍リクエストを送信すると、API は
200 OKを返し、一時的なレプリカの有効期間を延長します。レプリカの有効期限切れ: レプリカの有効期間が終了すると、一時的なレプリカは削除されます。オブジェクトを再度読み取るには、別の解凍リクエストを送信する必要があります。
解凍優先度の選択
解凍の完了に必要な時間は、ストレージタイプと選択した優先度によって異なります。実際の解凍時間は異なる場合があります。
オブジェクトのストレージタイプ | 復元優先度 | 説明 |
アーカイブ | / | 解凍は 1 分以内に完了します。 |
コールドアーカイブ | 迅速 | 解凍は 1 時間以内に完了します。 |
標準 | 解凍は 2~5 時間以内に完了します。 | |
バルク | 解凍は 5~12 時間以内に完了します。 | |
ディープコールドアーカイブ | 迅速 | 解凍は 12 時間以内に完了します。 |
標準 | 解凍は 48 時間以内に完了します。 |
レプリカの有効期間の選択
レプリカの有効期間は、オブジェクトが解凍された後、読み取り可能な状態を維持する日数です。この期間中、追加のデータ取得料金を発生させることなく、いつでもオブジェクトにアクセスできます。ビジネスニーズに基づいて合理的な期間を計画してください。オブジェクトを一度だけ読み取る場合は、期間を 1 日に設定します。一定期間にわたってオブジェクトに頻繁にアクセスする場合は、データ取得料金の繰り返しを避けるために、より長い期間を設定します。
オブジェクトのストレージタイプ | 説明 |
アーカイブ | 1 から 7 までの正の整数。単位: 日。 |
コールドアーカイブ | 1 から 365 までの正の整数。単位: 日。 |
ディープコールドアーカイブ | 1 から 365 までの正の整数。単位: 日。 |
復元の実行
解凍優先度とレプリカの有効期間を決定した後、解凍を開始できます。
コンソール
コンソールは、同じフォルダ内のオブジェクトの一括解凍をサポートしていません。一括解凍を実行するには、ossutil、SDK、または API を使用します。
OSS コンソールにログインします。
[バケット] をクリックし、ターゲットバケットの名前をクリックします。
左側のナビゲーションウィンドウで、[ファイル] > [オブジェクト] を選択します。
ターゲットオブジェクトの [操作] 列で、 を選択します。表示されるダイアログボックスで、[解凍優先度] と [レプリカの有効期間] を設定します。
SDK
SDK を使用してプログラムでオブジェクトを解凍すると、より柔軟な自動化とエラー処理が可能になります。
import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.*;
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";
// アーカイブオブジェクトの完全なパスを指定します。完全なパスにバケット名を含めないでください。
String objectName = "exampledir/object";
// バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを 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();
if (storageClass == StorageClass.Archive) {
// オブジェクトを解凍します。
ossClient.restoreObject(bucketName, objectName);
// オブジェクトが解凍されるのを待つ時間を指定します。
do {
Thread.sleep(1000);
objectMetadata = ossClient.getObjectMetadata(bucketName, objectName);
} while (!objectMetadata.isRestoreCompleted());
}
// 解凍されたオブジェクトをクエリします。
OSSObject ossObject = ossClient.getObject(bucketName, objectName);
ossObject.getObjectContent().close();
} 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 time
import argparse
import alibabacloud_oss_v2 as oss
# コマンドライン引数パーサーを作成します。
parser = argparse.ArgumentParser(description="restore object sample")
# 必須のコマンドライン引数を追加します。
parser.add_argument('--region', help='The region in which the bucket is located.', required=True)
parser.add_argument('--bucket', help='The name of the bucket.', required=True)
parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS.')
parser.add_argument('--key', help='The name of the object.', required=True)
def main():
# 受信したコマンドライン引数を解析します。
args = parser.parse_args()
# 環境変数から認証情報を読み込みます。
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
# デフォルトの SDK 設定を使用します。
cfg = oss.config.load_default()
# 資格情報プロバイダーを環境変数ベースの認証に設定します。
cfg.credentials_provider = credentials_provider
# リージョンを設定します。
cfg.region = args.region
# エンドポイントが指定されている場合は、エンドポイントを設定項目として設定します。
if args.endpoint is not None:
cfg.endpoint = args.endpoint
# OSS クライアントを作成します。
client = oss.Client(cfg)
# オブジェクトを解凍するリクエストを実行します。
result = client.restore_object(oss.RestoreObjectRequest(
bucket=args.bucket,
key=args.key,
restore_request=oss.RestoreRequest(
days=1,
# オプション: コールドアーカイブまたはディープコールドアーカイブオブジェクトの解凍優先度を設定します。有効な値: Expedited、Standard、および Bulk。デフォルト値: Standard。
# tier="Bulk",
)
))
# 解凍リクエストの結果を出力します。
print(f'status code: {result.status_code},'
f' request id: {result.request_id},'
f' version id: {result.version_id},'
f' restore priority: {result.restore_priority},'
)
# オブジェクトが解凍されたかどうかを確認するループ。
while True:
# オブジェクトヘッダーを取得します。
result = client.head_object(oss.HeadObjectRequest(
bucket=args.bucket,
key=args.key,
))
# 解凍状態を確認します。
if result.restore and result.restore != 'ongoing-request="true"':
print('Restore is successful')
break
# 5 秒後にもう一度確認します。
time.sleep(5)
print(result.restore)
# プログラムのエントリポイント。
if __name__ == "__main__":
main()
const OSS = require('ali-oss')
const client = new OSS({
// バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを oss-cn-hangzhou に設定します。
region: 'yourRegion',
// 環境変数からアクセス資格情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
accessKeyId: process.env.OSS_ACCESS_KEY_ID,
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
authorizationV4: true,
// バケットの名前を指定します。例: examplebucket。
bucket: 'examplebucket',
});
// 解凍するアーカイブオブジェクトの名前を指定します。例: exampleobject.txt。
client.restore('exampleobject.txt').then((res) => {
console.log(res);
}).catch(err => {
console.log(err);
})using Aliyun.OSS;
using Aliyun.OSS.Model;
using Aliyun.OSS.Model;
using System.Net;
using System.Text;
using Aliyun.OSS.Common;
// バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
var endpoint = "yourEndpoint";
// 環境変数からアクセス資格情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
// バケットの名前を指定します。
var bucketName = "examplebucket";
// オブジェクトの完全なパスを指定します。パスにバケット名を含めることはできません。
var objectName = "yourObjectName";
// オブジェクトのコンテンツを指定します。
var objectContent = "More than just cloud.";
int maxWaitTimeInSeconds = 600;
// バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを cn-hangzhou に設定します。
const string region = "cn-hangzhou";
// ClientConfiguration インスタンスを作成し、要件に基づいてデフォルトのパラメーターを変更します。
var conf = new ClientConfiguration();
// 署名アルゴリズム V4 を使用します。
conf.SignatureVersion = SignatureVersion.V4;
// OSSClient インスタンスを作成します。
var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf);
client.SetRegion(region);
try
{
// アーカイブバケットを作成します。
var bucket = client.CreateBucket(bucketName, StorageClass.Archive);
Console.WriteLine("Create Archive bucket succeeded, {0} ", bucket.Name);
}
catch (Exception ex)
{
Console.WriteLine("Create Archive bucket failed, {0}", ex.Message);
}
// オブジェクトをバケットにアップロードし、オブジェクトのストレージタイプをアーカイブに設定します。
try
{
byte[] binaryData = Encoding.ASCII.GetBytes(objectContent);
MemoryStream requestContent = new MemoryStream(binaryData);
client.PutObject(bucketName, objectName, requestContent);
Console.WriteLine("Put object succeeded, {0}", objectName);
}
catch (Exception ex)
{
Console.WriteLine("Put object failed, {0}", ex.Message);
}
var metadata = client.GetObjectMetadata(bucketName, objectName);
string storageClass = metadata.HttpMetadata["x-oss-storage-class"] as string;
if (storageClass != "Archive")
{
Console.WriteLine("StorageClass is {0}", storageClass);
return;
}
// アーカイブオブジェクトを解凍します。
RestoreObjectResult result = client.RestoreObject(bucketName, objectName);
Console.WriteLine("RestoreObject result HttpStatusCode : {0}", result.HttpStatusCode);
if (result.HttpStatusCode != HttpStatusCode.Accepted)
{
throw new OssException(result.RequestId + ", " + result.HttpStatusCode + " ,");
}
while (maxWaitTimeInSeconds > 0)
{
var meta = client.GetObjectMetadata(bucketName, objectName);
string restoreStatus = meta.HttpMetadata["x-oss-restore"] as string;
if (restoreStatus != null && restoreStatus.StartsWith("ongoing-request=\"false\"", StringComparison.InvariantCultureIgnoreCase))
{
break;
}
Thread.Sleep(1000);
// 最大待機時間が 1 秒減少します。
maxWaitTimeInSeconds--;
}
if (maxWaitTimeInSeconds == 0)
{
Console.WriteLine("RestoreObject is timeout. ");
throw new TimeoutException();
}
else
{
Console.WriteLine("RestoreObject is successful. ");
}// オブジェクトを解凍します。
RestoreObjectRequest restore = new RestoreObjectRequest();
// バケットの名前を指定します。例: examplebucket。
restore.setBucketName("examplebucket");
// オブジェクトの完全なパスを指定します。完全なパスにバケット名を含めないでください。例: exampleobject.txt。
restore.setObjectKey("exampleobject.txt");
OSSAsyncTask task = oss.asyncRestoreObject(restore, new OSSCompletedCallback<RestoreObjectRequest,
RestoreObjectResult>() {
@Override
public void onSuccess(RestoreObjectRequest request, RestoreObjectResult result) {
Log.i("info", "code::"+result.getStatusCode());
}
@Override
public void onFailure(RestoreObjectRequest request, ClientException clientException,
ServiceException serviceException) {
Log.e("errorMessage", "error: "+serviceException.getRawMessage());
}
});
task.waitUntilFinished();OSSRestoreObjectRequest *request = [OSSRestoreObjectRequest new];
// バケットの名前を指定します。例: examplebucket。
request.bucketName = @"examplebucket";
// オブジェクトの完全なパスを指定します。完全なパスにバケット名を含めないでください。例: exampleobject.txt。
request.objectKey = @"exampleobject.txt";
OSSTask *restoreObjectTask = [client restoreObject:request];
[restoreObjectTask continueWithBlock:^id _Nullable(OSSTask * _Nonnull task) {
if (!task.error) {
NSLog(@"restore object success");
} else {
NSLog(@"restore object failed, error: %@", task.error);
}
return nil;
}];
// 同期ブロッキングを実装して、タスクが完了するのを待ちます。
// [restoreObjectTask waitUntilFinished];#include <alibabacloud/oss/OssClient.h>
#include <thread>
#include <chrono>
#include <algorithm>
using namespace AlibabaCloud::OSS;
int main(void)
{
/* OSS へのアクセスに使用されるアカウントに関する情報を初期化します。*/
/* バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。*/
std::string Endpoint = "yourEndpoint";
/* バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを cn-hangzhou に設定します。*/
std::string Region = "yourRegion";
/* バケットの名前を指定します。例: examplebucket。*/
std::string BucketName = "examplebucket";
/* アーカイブオブジェクトの完全なパスを指定します。完全なパスにバケット名を含めないでください。*/
std::string ObjectName = "yourObjectName";
/* ネットワークリソースなどのリソースを初期化します。*/
InitializeSdk();
ClientConfiguration conf;
conf.signatureVersion = SignatureVersionType::V4;
/* 環境変数からアクセス資格情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。*/
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClient client(Endpoint, credentialsProvider, conf);
client.SetRegion(Region);
/* アーカイブオブジェクトを解凍します。*/
auto outcome = client.RestoreObject(BucketName, ObjectName);
/* アーカイブ以外のストレージタイプのオブジェクトは解凍できません。*/
if (!outcome.isSuccess()) {
/* 例外を処理します。*/
std::cout << "RestoreObject fail, code:" << outcome.error().Code() <<
", message:" << outcome.error().Message() <<
", requestId:" << outcome.error().RequestId() << std::endl;
return -1;
}
std::string onGoingRestore("ongoing-request=\"false\"");
int maxWaitTimeInSeconds = 600;
while (maxWaitTimeInSeconds > 0)
{
auto meta = client.HeadObject(BucketName, ObjectName);
std::string restoreStatus = meta.result().HttpMetaData()["x-oss-restore"];
std::transform(restoreStatus.begin(), restoreStatus.end(), restoreStatus.begin(), ::tolower);
if (!restoreStatus.empty() &&
restoreStatus.compare(0, onGoingRestore.size(), onGoingRestore)==0) {
std::cout << " success, restore status:" << restoreStatus << std::endl;
/* アーカイブオブジェクトが解凍されました。*/
break;
}
std::cout << " info, WaitTime:" << maxWaitTimeInSeconds
<< "; restore status:" << restoreStatus << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(10));
maxWaitTimeInSeconds--;
}
if (maxWaitTimeInSeconds == 0)
{
std::cout << "RestoreObject fail, TimeoutException" << std::endl;
}
/* ネットワークリソースなどのリソースを解放します。*/
ShutdownSdk();
return 0;
}#include "oss_api.h"
#include "aos_http_io.h"
/* バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。*/
const char *endpoint = "yourEndpoint";
/* バケットの名前を指定します。例: examplebucket。*/
const char *bucket_name = "examplebucket";
/* オブジェクトの完全なパスを指定します。完全なパスにバケット名を含めないでください。例: exampledir/exampleobject.txt。*/
const char *object_name = "exampledir/exampleobject.txt";
/* バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを cn-hangzhou に設定します。*/
const char *region = "yourRegion";
void init_options(oss_request_options_t *options)
{
options->config = oss_config_create(options->pool);
/* char* 文字列を使用して aos_string_t 型のデータを初期化します。*/
aos_str_set(&options->config->endpoint, endpoint);
/* 環境変数からアクセス資格情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。*/
aos_str_set(&options->config->access_key_id, getenv("OSS_ACCESS_KEY_ID"));
aos_str_set(&options->config->access_key_secret, getenv("OSS_ACCESS_KEY_SECRET"));
// 2 つの追加パラメーターを指定します。
aos_str_set(&options->config->region, region);
options->config->signature_version = 4;
/* CNAME を使用するかどうかを指定します。値 0 は CNAME が使用されないことを示します。*/
options->config->is_cname = 0;
/* タイムアウト期間などのネットワークパラメーターを指定します。*/
options->ctl = aos_http_controller_create(options->pool, 0);
}
int main(int argc, char *argv[])
{
/* main() で aos_http_io_initialize メソッドを呼び出して、ネットワークリソースやメモリリソースなどのグローバルリソースを初期化します。*/
if (aos_http_io_initialize(NULL, 0) != AOSE_OK) {
exit(1);
}
/* メモリを管理するためのメモリプールを作成します。aos_pool_t は apr_pool_t と同等です。メモリプールを作成するためのコードは APR ライブラリに含まれています。*/
aos_pool_t *pool;
/* メモリプールを作成します。2 番目のパラメーターの値は NULL です。この値は、プールが他のメモリプールを継承しないことを示します。*/
aos_pool_create(&pool, NULL);
/* オプションを作成して初期化します。このパラメーターには、エンドポイント、access_key_id、access_key_secret、is_cname、curl などのグローバル設定情報が含まれます。*/
oss_request_options_t *oss_client_options;
/* メモリプール内のメモリリソースをオプションに割り当てます。*/
oss_client_options = oss_request_options_create(pool);
/* oss_client_options を初期化します。*/
init_options(oss_client_options);
/* パラメーターを初期化します。*/
aos_string_t bucket;
aos_string_t object;
aos_table_t *headers = NULL;
aos_table_t *resp_headers = NULL;
aos_status_t *resp_status = NULL;
aos_str_set(&bucket, bucket_name);
aos_str_set(&object, object_name);
headers = aos_table_make(pool, 0);
/* オブジェクトを解凍します。*/
do {
headers = aos_table_make(pool, 0);
resp_status = oss_restore_object(oss_client_options, &bucket, &object, headers, &resp_headers);
printf("restore object resp_status->code: %d \n", resp_status->code);
if (resp_status->code != 409) {
break;
} else {
printf("restore object is already in progress, resp_status->code: %d \n", resp_status->code);
apr_sleep(5000);
}
} while (1);
/* メモリプールを解放します。この操作により、リクエストに割り当てられたメモリリソースが解放されます。*/
aos_pool_destroy(pool);
/* 割り当てられたグローバルリソースを解放します。*/
aos_http_io_deinitialize();
return 0;
}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 // オブジェクト名。
)
// init 関数はコマンドラインパラメーターを初期化します。
func init() {
flag.StringVar(®ion, "region", "", "The region in which the bucket is located.")
flag.StringVar(&bucketName, "bucket", "", "The name of the bucket.")
flag.StringVar(&objectName, "object", "", "The name of the object.")
}
func main() {
// コマンドラインパラメーターを解析します。
flag.Parse()
// バケット名が空かどうかを確認します。
if len(bucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, bucket name required")
}
// リージョンが空かどうかを確認します。
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, region required")
}
// オブジェクト名が空かどうかを確認します。
if len(objectName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, object name required")
}
// デフォルトの設定を読み込み、資格情報プロバイダーとリージョンを設定します。
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
// OSS クライアントを作成します。
client := oss.NewClient(cfg)
// オブジェクトを解凍するリクエストを作成します。
request := &oss.RestoreObjectRequest{
Bucket: oss.Ptr(bucketName), // バケット名。
Key: oss.Ptr(objectName), // オブジェクト名。
RestoreRequest: &oss.RestoreRequest{
Days: 3, // 解凍状態の期間を 3 日に設定します。
},
}
// オブジェクトを解凍するリクエストを送信します。
result, err := client.RestoreObject(context.TODO(), request)
if err != nil {
log.Fatalf("failed to restore object %v", err)
}
// 解凍操作の結果を出力します。
log.Printf("restore object result:%#v\n", result)
}
<?php
// 依存ライブラリが正しく読み込まれるように、オートロードファイルをインクルードします。
require_once __DIR__ . '/../vendor/autoload.php';
use AlibabaCloud\Oss\V2 as Oss;
// コマンドラインパラメーターの説明を定義します。
$optsdesc = [
"region" => ['help' => 'The region in which the bucket is located.', 'required' => True], // 必須。バケットが配置されているリージョン。
"endpoint" => ['help' => 'The domain names that other services can use to access OSS.', 'required' => False], // オプション。エンドポイント。
"bucket" => ['help' => 'The name of the bucket', 'required' => True], // 必須。バケットの名前。
"key" => ['help' => 'The name of the object', 'required' => True], // 必須。オブジェクトの名前。
];
// パラメーターの説明を getopt で必要なロングオプション形式に変換します。
// 各パラメーターの末尾にコロン (:) を追加して、パラメーターに値が必要であることを示します。
$longopts = \array_map(function ($key) {
return "$key:";
}, array_keys($optsdesc));
// コマンドラインパラメーターを解析します。
$options = getopt("", $longopts);
// 必須パラメーターが存在するかどうかを確認します。
foreach ($optsdesc as $key => $value) {
if ($value['required'] === True && empty($options[$key])) {
$help = $value['help']; // パラメーターのヘルプ情報を取得します。
echo "Error: the following arguments are required: --$key, $help" . PHP_EOL;
exit(1); // 必須パラメーターがない場合はプログラムを終了します。
}
}
// 解析されたパラメーターから値を抽出します。
$region = $options["region"]; // バケットが配置されているリージョン。
$bucket = $options["bucket"]; // バケットの名前。
$key = $options["key"]; // オブジェクトの名前。
// 環境変数から資格情報情報を読み込みます。
// EnvironmentVariableCredentialsProvider を使用して、環境変数からアクセスキー ID とアクセスキーシークレットを読み取ります。
$credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider();
// SDK のデフォルト設定を使用します。
$cfg = Oss\Config::loadDefault();
$cfg->setCredentialsProvider($credentialsProvider); // 資格情報プロバイダーを設定します。
$cfg->setRegion($region); // バケットが配置されているリージョンを設定します。
if (isset($options["endpoint"])) {
$cfg->setEndpoint($options["endpoint"]); // エンドポイントが指定されている場合は、エンドポイントを設定します。
}
// OSS クライアントインスタンスを作成します。
$client = new Oss\Client($cfg);
// アーカイブオブジェクトを解凍するために RestoreObjectRequest オブジェクトを作成します。
$request = new Oss\Models\RestoreObjectRequest(bucket: $bucket, key: $key);
// オブジェクトを解凍します。
$result = $client->restoreObject($request);
// 解凍結果を出力します。
printf(
'status code:' . $result->statusCode . PHP_EOL . // HTTP ステータスコード。たとえば、200 は成功を示します。
'request id:' . $result->requestId . PHP_EOL // リクエスト ID。リクエストのデバッグまたはトレースに使用されます。
);
ossutil
ossutil は、OSS を管理するためのコマンドラインインターフェイス (CLI) ツールです。スクリプト化された自動一括解凍タスクに適しています。
コマンドの詳細については、「restore (オブジェクトの解凍)」をご参照ください。
ossbrowser
ossbrowser は、コンソールと同様のバケットレベルの操作をサポートしています。ossbrowser UI の指示に従ってオブジェクトを解凍できます。ossbrowser の使用方法の詳細については、「一般的な操作」をご参照ください。
API
アプリケーションに高度なカスタマイズ要件がある場合は、RESTful API を直接呼び出すことができます。API を直接呼び出す場合は、コードに署名計算を含める必要があります。詳細については、「RestoreObject」をご参照ください。
課金
課金項目 | 説明 | 適用可能なストレージタイプ |
解凍されたデータ量 (GB 単位) に基づいて計算される 1 回限りの料金で、解凍の主なコストです。 | アーカイブ、コールドアーカイブ、ディープコールドアーカイブ | |
各 | アーカイブ (PUT リクエストとして課金)、コールドアーカイブ、およびディープコールドアーカイブ (取得リクエストとして課金) | |
オブジェクトの元のストレージタイプのストレージ料金は、解凍中および解凍後も引き続き適用されます。 | アーカイブ、コールドアーカイブ、ディープコールドアーカイブ | |
一時的なレプリカはストレージ領域を消費し、その有効期間に対して日割り料金が発生します。 | コールドアーカイブ、ディープコールドアーカイブ |
クォータと制限
1 つのリージョン内の単一の Alibaba Cloud アカウントの場合、コールドアーカイブオブジェクトの解凍クォータは平均で毎秒約 500 オブジェクトです。3 つの解凍優先度にわたる合計解凍クォータは、1 日あたり 100 TB から 120 TB です。 より高いクォータを申請するには、テクニカルサポートにお問い合わせください。
1 つのリージョン内の単一の Alibaba Cloud アカウントの場合、ディープコールドアーカイブオブジェクトの解凍クォータは平均で毎秒約 100 オブジェクトです。2 つの解凍優先度にわたる合計解凍クォータは、1 日あたり 10 TB から 15 TB です。 より高いクォータを申請するには、テクニカルサポートにお問い合わせください。
コールドアーカイブおよびディープコールドアーカイブオブジェクトのクォータを超過した後でも、解凍リクエストを送信できます。これらのリクエストはキューに入れられ、解凍時間は選択した優先度で指定された時間よりも長くなる場合があります。
> [解凍]