大規模なデータセットを共有する場合、バケットに対してリクエスタ支払いモードを有効にすることができます。この機能により、データ転送料金やリクエスト料金などのデータアクセスコストをデータリクエスタに転嫁できます。バケット所有者は、ストレージ料金やその他の固定コストのみを負担します。バケットに対してリクエスタ支払いを有効にすると、匿名アクセスが無効になり、すべてのリクエストで認証が必要になります。
適用範囲
リクエスタ支払いは、リージョン属性を持つバケットに対してのみ有効にできます。
仕組み
OSS は次のロジックに基づいてリクエストを処理します:
-
リクエストに
x-oss-request-payerヘッダーが含まれている場合、OSS はリクエスタを認証します。認証が成功すると、リクエスタにデータ転送料金とリクエスト料金が請求されます。 -
リクエストに
x-oss-request-payerヘッダーが含まれていない場合:-
リクエスタがバケット所有者である場合、リクエストは通常どおり処理され、バケット所有者にすべての料金が請求されます。
-
リクエスタがバケット所有者でない場合、リクエストは拒否されます。
-
バケット所有者の設定
ステップ 1:リクエスタ支払いの有効化
-
OSS コンソール にログインします。
-
バケット をクリックし、次にターゲットバケットの名前をクリックします。
-
左側のナビゲーションペインで、を選択します。
-
Pay-by-requester ページで、リクエスト元による支払い スイッチをオンにします。
-
表示されるダイアログボックスで、OK をクリックします。
ステップ 2:リクエスタへのアクセス権限の付与
バケットポリシーを使用して、リクエスタにアクセス権限を付与します。これらの権限がないと、リクエスタはデータにアクセスできません。
-
バケット ページで、対象バケットの名前をクリックします。
-
左側のナビゲーションペインで、を選択します。
-
バケット承認ポリシー ページの GUI で追加 タブで、新規権限 をクリックします。
-
新規権限 パネルで、ポリシーを設定します。ユーザー には、[その他のアカウント] を選択し、要求元の Alibaba Cloud アカウント ID または RAM ロールの ARN を入力します。形式は
arn:sts::{RoleOwnerUid}:assumed-role/{RoleName}/{RoleSessionName}です。 -
OK をクリックします。
リクエスタとしてのデータアクセス
リクエスタとして、OSS を有効化 しておく必要があり、リクエスタ支払いが有効になっているバケットにアクセスする際には、リクエストで発生する料金を支払うことを示す必要があります。
コンソール
-
OSS コンソール にログインします。
-
左側のナビゲーションペインで、お気に入りのパス の横にあるプラス記号 (+) をクリックします。
-
お気に入りパスの追加 ダイアログボックスで、次の表の説明に従ってパラメーターを設定します。
パラメータ
説明
追加方法
[他の承認されたバケットから追加] を選択して、承認されたバケットをお気に入りパスに追加します。
リージョン
承認されたバケットが存在するリージョンを選択します。
バケット
承認されたバケットの名前を入力します。
[リクエスト元による支払い]
理解して同意 を選択して支払いに同意すると、ファイルパスで指定されたリソースにアクセスできるようになります。データ転送料金やリクエスト料金など、バケットへのアクセスによって発生した料金が請求されます。
SDK
次のコードでは、PutObject、GetObject、DeleteObject 操作を例として、オブジェクトアクセスに対するサードパーティ支払者を指定する方法を示します。オブジェクトに対する他の読み取りおよび書き込み操作の支払者を指定する方法も同様です。
リクエスタがオブジェクト操作を実行する場合、HTTP ヘッダーに x-oss-request-payer:requester パラメータを含める必要があります。含めない場合、リクエストは失敗します。
Java
import com.aliyun.oss.ClientBuilderConfiguration;
import com.aliyun.oss.OSS;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.*;
import java.io.ByteArrayInputStream;
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";
// オブジェクトの完全なパスを指定します。例: exampledir/exampleobject.txt。完全なパスにバケット名を含めることはできません。
String objectName = "exampledir/exampleobject.txt";
Payer payer = Payer.Requester;
// バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを 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 {
// PutObject 操作の支払者を指定します。
String content = "hello";
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, new ByteArrayInputStream(content.getBytes()));
putObjectRequest.setRequestPayer(payer);
ossClient.putObject(putObjectRequest);
// GetObject 操作の支払者を指定します。
GetObjectRequest getObjectRequest = new GetObjectRequest(bucketName, objectName);
getObjectRequest.setRequestPayer(payer);
OSSObject ossObject = ossClient.getObject(getObjectRequest);
ossObject.close();
// DeleteObject 操作の支払者を指定します。
GenericRequest genericRequest = new GenericRequest(bucketName, objectName);
genericRequest.setRequestPayer(payer);
ossClient.deleteObject(genericRequest);
} 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 (Throwable 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 {
// OSSClient インスタンスをシャットダウンします。
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}
Python
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
from oss2.headers import OSS_REQUEST_PAYER
# 環境変数からアクセス資格情報を取得します。このサンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
# バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
# エンドポイントが配置されているリージョン (cn-hangzhou など) を指定します。このパラメーターは V4 署名に必要であることに注意してください。
region = "cn-hangzhou"
# yourBucketName をバケットの名前に設定します。
bucket = oss2.Bucket(auth, endpoint, "yourBucketName", region=region)
# オブジェクトの完全なパスを指定します。完全なパスにバケット名を含めることはできません。例: exampledir/exampleobject.txt。
object_name = 'exampledir/exampleobject.txt'
headers = dict()
headers[OSS_REQUEST_PAYER] = "requester"
# ファイルをアップロードするときにヘッダーを指定します。
result = bucket.put_object(object_name, 'test-content', headers=headers)
# ファイルをダウンロードするときにヘッダーを指定します。
result = bucket.get_object(object_name, headers=headers)
# ファイルを削除するときにヘッダーを指定します。
result = bucket.delete_object(object_name, headers=headers)
Go
package main
import (
"fmt"
"io"
"os"
"strings"
"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 {
fmt.Println("Error:", err)
os.Exit(-1)
}
// 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))
payerClient, err := oss.New("yourEndpoint", "", "", clientOptions...)
if err != nil {
fmt.Println("New Error:", err)
os.Exit(-1)
}
// バケット名を指定します。
payerBucket, err := payerClient.Bucket("examplebucket")
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// バケットの所有者がリクエスト元支払いモードを有効にした後、外部のリクエスト元は、承認されたコンテンツにアクセスするために oss.RequestPayer(oss.Requester) パラメーターを設定する必要があります。
// バケットの所有者がリクエスト元支払いモードを有効にしていない場合、外部のリクエスト元は oss.RequestPayer(oss.Requester) パラメーターを含めずに承認されたコンテンツにアクセスできます。
// オブジェクトをアップロードします。
// オブジェクトの完全なパスを指定します。完全なパスにバケット名を含めることはできません。例: exampledir/exampleobject.txt。
key := "exampledir/exampleobject.txt"
err = payerBucket.PutObject(key, strings.NewReader("objectValue"), oss.RequestPayer("requester"))
if err != nil {
fmt.Println("put Error:", err)
os.Exit(-1)
}
// バケット内のすべてのオブジェクトをリスト表示します。
lor, err := payerBucket.ListObjects(oss.RequestPayer(oss.Requester))
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// オブジェクト名のリストを出力します。
for _, l := range lor.Objects {
fmt.Println("the Key name is :", l.Key)
}
// オブジェクトをダウンロードします。
body, err := payerBucket.GetObject(key, oss.RequestPayer(oss.Requester))
if err != nil {
fmt.Println("Get Error:", err)
os.Exit(-1)
}
// データを読み取った後、ストリームを閉じます。ストリームを閉じないと、接続リークが発生する可能性があります。これにより、リクエストに利用可能な接続が枯渇し、プログラムが失敗する可能性があります。
defer body.Close()
// 取得したコンテンツを読み取って出力します。
data, err := io.ReadAll(body)
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
fmt.Println("data:", string(data))
// オブジェクトを削除します。
err = payerBucket.DeleteObject(key, oss.RequestPayer(oss.Requester))
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
}
Node.js
const OSS = require('ali-oss');
const bucket = 'bucket-name';
const payer = 'Requester';
const client = new OSS({
// region をバケットが配置されているリージョンに設定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、region を 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,
// bucket をご使用のバケット名に設定します。
bucket: 'yourBucketName',
});
async function main() {
await put();
await get();
await del();
}
async function put() {
const result = await client.putBucketRequestPayment(bucket, payer);
console.log('putBucketRequestPayment:', result);
// PutObject 操作の支払いを指定します。
const response = await client.put('fileName', path.normalize('D:\\localpath\\examplefile.txt'), {
headers: {
'x-oss-request-payer': 'requester'
}
});
console.log('put:', response);
}
async function get() {
const result = await client.putBucketRequestPayment(bucket, payer);
console.log('putBucketRequestPayment:', result);
// GetObject 操作の支払いを指定します。
const response = await client.get('fileName', {
headers: {
'x-oss-request-payer': 'requester'
}
});
console.log('get:', response);
}
async function del() {
const result = await client.putBucketRequestPayment(bucket, payer);
console.log('putBucketRequestPayment:', result);
// DeleteObject 操作の支払いを指定します。
const response = await client.delete('fileName', {
headers: {
'x-oss-request-payer': 'requester'
}
});
console.log('delete:', response);
}
main();
C#
using System;
using System.IO;
using System.Text;
using Aliyun.OSS;
using Aliyun.OSS.Common;
namespace Samples
{
public class Program
{
public static void Main(string[] args)
{
// yourEndpoint を、バケットが配置されているリージョンのエンドポイントに設定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
var endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 環境変数からアクセス認証情報を取得します。 このサンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
// バケット名を指定します。 例:examplebucket。
var bucketName = "examplebucket";
var objectName = "example.txt";
var objectContent = "More than just cloud.";
// バケットが配置されているリージョンを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを 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);
try
{
byte[] binaryData = Encoding.ASCII.GetBytes(objectContent);
MemoryStream requestContent = new MemoryStream(binaryData);
// PutObject 操作の支払いを指定します。
var putRequest = new PutObjectRequest(bucketName, objectName, requestContent);
putRequest.RequestPayer = RequestPayer.Requester;
var result = client.PutObject(putRequest);
// GetObject 操作の支払いを指定します。
var getRequest = new GetObjectRequest(bucketName, objectName);
getRequest.RequestPayer = RequestPayer.Requester;
var getResult = client.GetObject(getRequest);
// DeleteObject 操作の支払いを指定します。
var delRequest = new DeleteObjectRequest(bucketName, objectName);
delRequest.RequestPayer = RequestPayer.Requester;
client.DeleteObject(delRequest);
}
catch (OssException ex)
{
Console.WriteLine("Failed with error code: {0}; Error info: {1}. \nRequestID:{2}\tHostID:{3}",
ex.ErrorCode, ex.Message, ex.RequestId, ex.HostId);
}
catch (Exception ex)
{
Console.WriteLine("Failed with error info: {0}", ex.Message);
}
}
}
}
PHP
<?php
if (is_file(__DIR__ . '/../autoload.php')) {
require_once __DIR__ . '/../autoload.php';
}
if (is_file(__DIR__ . '/../vendor/autoload.php')) {
require_once __DIR__ . '/../vendor/autoload.php';
}
use OSS\Credentials\EnvironmentVariableCredentialsProvider;
use OSS\OssClient;
use OSS\Core\OssException;
// 環境変数からアクセス認証情報を取得します。 サンプルコードを実行する前に、環境変数 OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET が設定されていることを確認してください。
$provider = new EnvironmentVariableCredentialsProvider();
// この例では、中国 (杭州) リージョンのエンドポイントを使用します。 実際のエンドポイントを指定してください。
$endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
// バケット名を指定します。 例: examplebucket。
$bucket= "examplebucket";
// オブジェクトの完全なパスを指定します。 完全なパスにバケット名を含めないでください。 例: exampledir/exampleobject.txt。
$object = "exampledir/exampleobject.txt";
// バケットのリクエスト元支払いモードを有効にします。
$options = array(
OssClient::OSS_HEADERS => array(
OssClient::OSS_REQUEST_PAYER => 'requester',
));
try {
$config = array(
"provider" => $provider,
"endpoint" => $endpoint,
"signatureVersion" => OssClient::OSS_SIGNATURE_VERSION_V4,
"region"=> "cn-hangzhou"
);
$ossClient = new OssClient($config);
// 第三者が PutObject 操作を呼び出すときに支払いを指定します。
$content = "hello";
$ossClient->putObject($bucket, $object, $content, $options);
// 第三者が GetObject 操作を呼び出すときに支払いを指定します。
$ossClient->getObject($bucket, $object, $options);
// 第三者が DeleteObject 操作を呼び出すときに支払いを指定します。
$ossClient->deleteObject($bucket, $object, $options);
} catch (OssException $e) {
printf(__FUNCTION__ . ": FAILED\n");
printf($e->getMessage() . "\n");
return;
}
print(__FUNCTION__ . ": OK" . "\n");
C++
#include <alibabacloud/oss/OssClient.h>
#include <fstream>
using namespace AlibabaCloud::OSS;
int main(void)
{
/* OSS アカウント情報を初期化します。*/
/* yourEndpoint を、バケットが配置されているリージョンのエンドポイントに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。*/
std::string Endpoint = "yourEndpoint";
/* yourRegion を、バケットが配置されているリージョンに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを cn-hangzhou に設定します。*/
std::string Region = "yourRegion";
/* リクエスト元がアクセスするバケットの名前を指定します。例:examplebucket */
std::string BucketName = "examplebucket";
/* リクエスト元がアクセスするオブジェクトの完全なパスを指定します。完全なパスにバケット名を含めることはできません。例:exampledir/exampleobject.txt */
std::string ObjectName = "exampleobject.txt";
/* ネットワークリソースを初期化します。*/
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);
/* ファイルをアップロードする際に、リクエスト元支払いモードを設定します。*/
std::shared_ptr<std::iostream> content = std::make_shared<std::stringstream>();
*content << "test cpp sdk";
PutObjectRequest putrequest(BucketName, ObjectName, content);
putrequest.setRequestPayer(RequestPayer::Requester);
auto putoutcome = client.PutObject(putrequest);
/* ファイルをローカルメモリにダウンロードする際に、リクエスト元支払いモードを設定します。*/
GetObjectRequest getrequest(BucketName, ObjectName);
getrequest.setRequestPayer(RequestPayer::Requester);
auto getoutcome = client.GetObject(getrequest);
/* ファイルを削除する際に、リクエスト元支払いモードを設定します。*/
DeleteObjectRequest delrequest(BucketName, ObjectName);
delrequest.setRequestPayer(RequestPayer::Requester);
auto deloutcome = client.DeleteObject(delrequest);
/* ネットワークリソースを解放します。*/
ShutdownSdk();
return 0;
}
ossutil
ossutil を使用する前に、ossutil をインストールする必要があります。
たとえば、cp コマンドを使用してオブジェクトをダウンロードする場合、--request-payer=requester パラメータを指定します。
ossutil cp oss://examplebucket/examplefile.txt /localpath --request-payer=requester
API
REST API リクエストを直接行う場合は、リクエストに x-oss-request-payer: requester ヘッダーを含めます。このヘッダーは署名計算にも含める必要があります。署名計算の詳細については、「ヘッダーに署名を含める」をご参照ください。
GET /oss.jpg HTTP/1.1
Host: oss-example.oss-cn-hangzhou.aliyuncs.com
Date: Fri, 24 Feb 2012 06:38:30 GMT
Authorization: OSS4-HMAC-SHA256 Credential=LTAI********************/20120224/cn-hangzhou/oss/aliyun_v4_request,Signature=a7c3554c729d71929e0b84489addee6b2e8d5cb48595adfc51868c299c0c218e
本番環境での注意事項
-
RAM ロール経由のアクセスに対する課金:リクエスタが Alibaba Cloud RAM ロールを引き受けてデータにアクセスする場合、RAM ロールが所属するアカウントがリクエストの料金を支払います。
-
誤った方法:リクエスタがバケット所有者のアカウントの RAM ロールを引き受けてアクセス権限を取得できるようにします。このシナリオでは、すべてのリクエストがバケット所有者として実行され、その結果発生するリクエスト料金とデータ転送料金はバケット所有者に請求されます。この方法では、コストをリクエスタに転嫁できません。
-
正しい方法:バケットポリシーを使用して、リクエスタに直接アクセス権限を付与します。
-
-
事前署名付き URL の落とし穴:
-
誤った方法:バケット所有者が自分のアクセス認証情報 (AccessKey ペアまたは STS 一時認証情報) を使用して事前署名付き URL を生成し、共有します。この場合、リクエストはバケット所有者として行われ、バケット所有者に料金が請求されます。
-
正しい方法:リクエスタが自分のアクセス認証情報 (AccessKey ペアまたは STS 一時認証情報) を使用して事前署名付き URL を生成し、URL 生成時に
x-oss-request-payer=requesterパラメータを含めます。署名の計算方法の詳細については、「URL に署名を含める」をご参照ください。この URL が共有されて使用されると、料金はそれを生成したリクエスタに請求されます。
-
-
互換性のリスク:リクエスタ支払いを有効にすると、静的 Web サイトホスティングに必要な匿名アクセスが妨げられる可能性があり、Web サイトが利用できなくなる場合があります。Web サイトのフロントエンドリソース (HTML、CSS、JS) と、リクエスタ支払いが必要なデータを別々のバケットにデプロイすることを推奨します。
課金
バケットに対してリクエスタ支払いを有効にする前は、すべての料金がバケット所有者によって支払われます。リクエスタ支払いを有効にした後は、リクエスタのアカウントが次の課金項目の料金を支払います。バケット所有者のアカウントには、他のすべての課金項目の料金が引き続き請求されます。課金項目の完全なリストについては、OSS 料金をご参照ください。
|
料金 |
課金項目 |
|
インターネット経由のアウトバウンドトラフィック |
|
|
オリジントラフィック |
|
|
PUT リクエスト |
|
|
GET リクエスト |
|
|
低頻度アクセスからのデータ取得 |
|
|
アーカイブストレージからのデータ取得 |