デフォルトでは、バケットの所有者が、バケットに対して発生したすべての料金を支払います。ただし、バケットに対してリクエスト元支払いモードを有効にすることで、認証されたリクエスト元が、バケット内のデータにアクセスするときに発生するリクエスト、データ処理、およびトラフィックの料金を支払うようにすることができます。所有者は、ストレージ料金などのその他の料金のみを支払います。 リクエスト元支払いモードを有効にすることで、他のリクエスト元によるデータへのアクセスによって発生する料金を支払うことなく、バケット内のデータを共有できます。
シナリオ 大規模なデータセットを共有する。たとえば、研究機関が郵便番号ディレクトリ、参照データ、地理空間情報、または Web クローラーによって収集されたデータを含む公開データセットを OSS バケットにアップロードし、すべての顧客がそのデータセットにアクセスできるようにしたいと考えているとします。さらに、研究機関は、リクエスト元がデータセットへのアクセスによって発生するリクエスト料金とトラフィック料金を支払うことを望んでいます。
このビジネス要件を満たすために、研究機関は OSS で次の設定を行うことができます。
公開データセットが格納されているバケットのアクセス制御リスト (ACL) を公開読み取りに設定します。詳細については、「バケット ACL 」をご参照ください。
バケットに対してリクエスト元支払いモードを有効にします。
本番データを顧客またはパートナーに配信する。たとえば、OSS 内の本番データをパートナーがアクセスできるようにし、パートナーが本番データをダウンロードするときにリクエスト料金とトラフィック料金を支払うようにしたいと考えているとします。
このビジネス要件を満たすために、OSS で次の設定を行うことができます。
本番データが格納されているバケットの ACL を非公開に設定します。詳細については、「バケット ACL 」をご参照ください。
バケットに対してリクエスト元支払いモードを有効にします。
バケットポリシーを使用して、パートナーにバケット内の本番データへのアクセス権限を付与します。詳細については、「チュートリアル: バケットポリシーを追加して別の Alibaba Cloud アカウントの RAM ユーザーに権限を付与する 」をご参照ください。
重要 パートナーの RAM ユーザーに、バケット内の本番データへのアクセス権限が付与されていることを確認してください。リクエスト元支払いモードの場合、Alibaba Cloud アカウントの RAM ユーザーの AccessKey ペアをパートナーと共有しないでください。共有すると、リクエスト元がお客様の Alibaba Cloud アカウントの RAM ユーザーを使用して本番データにアクセスするため、お客様にリクエスト料金とトラフィック料金が請求されます。
リクエストメソッド 匿名ユーザーからのリクエストは許可されていません
バケットに対してリクエスト元支払いモードを有効にした場合、匿名ユーザーはバケットにアクセスできません。リクエスト元は認証情報を提供する必要があります。OSS は、提供された情報に基づいてリクエスト元を識別できます。このようにして、リクエスト元にはリクエスト料金とトラフィック料金が請求されます。
リクエスト元が Alibaba Cloud アカウントの RAM ユーザーを使用してデータのリクエストを行う場合、RAM ユーザーが属する Alibaba Cloud アカウントに、リクエスト元によって送信されたリクエストと生成されたトラフィックの料金が請求されます。
リクエストには x-oss-request-payer
ヘッダーが含まれている必要があります
バケットに対してリクエスト元支払いモードを有効にした場合、リクエスト元はバケットへのリクエストに x-oss-request-payer
ヘッダーを指定し、ヘッダーの値を requester に設定する必要があります。これは、リクエスト元にリクエストとトラフィックの料金が請求されることをリクエスト元が理解していることを確認するためです。設定しないと、リクエストを認証できません。
POST、GET、および HEAD リクエストには、x-oss-request-payer:requester
ヘッダーが含まれている必要があります。詳細については、「(推奨) V4 署名を含める 」をご参照ください。
署名付き URL を使用するリクエストには、x-oss-request-payer=requester
ヘッダーが含まれている必要があります。詳細については、「(推奨) V4 署名を含める 」をご参照ください。
バケット所有者は、自分のバケットにアクセスするために送信されるリクエストに x-oss-request-payer
ヘッダーを含める必要はありません。バケット所有者には、自身のリクエストと生成されたトラフィックの料金が請求されます。
課金 バケットに対してリクエスト元支払いモードが有効になる前は、バケットの所有者がバケットに関連付けられたすべての料金を支払います。リクエスト元支払いモードが有効になった後、バケット所有者に適用される課金項目は、リクエスト元支払いモードが有効になる前の課金項目とは異なります。次の表に、リクエスト元支払いモードが有効になった後のバケット所有者とリクエスト元の課金項目を示します。
課金カテゴリ
課金項目
支払者
ストレージ
標準 LRS オブジェクトのストレージ使用量
バケット所有者
標準 ZRS オブジェクトのストレージ使用量
バケット所有者
IA LRS オブジェクトのストレージ使用量
バケット所有者
IA ZRS オブジェクトのストレージ使用量
バケット所有者
アーカイブ LRS オブジェクトのストレージ使用量
バケット所有者
アーカイブ ZRS オブジェクトのストレージ使用量
バケット所有者
コールドアーカイブ LRS オブジェクトのストレージ使用量
バケット所有者
ディープコールドアーカイブ LRS オブジェクトのストレージ使用量
バケット所有者
最小ストレージ期間未満で保存されている IA LRS オブジェクトのストレージ使用量
バケット所有者
最小ストレージ期間未満で保存されているアーカイブ LRS オブジェクトのストレージ使用量
バケット所有者
最小ストレージ期間未満で保存されているアーカイブ ZRS オブジェクトのストレージ使用量
バケット所有者
最小ストレージ期間未満で保存されているコールドアーカイブ オブジェクトのストレージ使用量
バケット所有者
最小ストレージ期間未満で保存されているディープコールドアーカイブ オブジェクトのストレージ使用量
バケット所有者
トラフィック
インターネット経由のアウトバウンド トラフィック
リクエスト元
インターネット経由のインバウンド トラフィック
無料
内部ネットワーク経由のアウトバウンド トラフィック
無料
内部ネットワーク経由のインバウンド トラフィック
無料
オリジン トラフィック
リクエスト元
CRR トラフィック
バケット所有者
API 操作の呼び出し *1
PUT リクエストの数
リクエスト元
GET リクエストの数
リクエスト元
データ取得リクエスト
バケット所有者
SelectObject のスキャン済みデータ容量
バケット所有者
IA オブジェクトの取得
リクエスト元
アーカイブ オブジェクトの取得
リクエスト元
リアルタイム アクセスが有効になっているアーカイブ済みオブジェクトの取得
バケット所有者
コールドアーカイブ オブジェクトの取得
バケット所有者
ディープコールドアーカイブ オブジェクトの取得
バケット所有者
オブジェクトのタグ付け
オブジェクトのタグ付け
バケット所有者
転送アクセラレーション
AccM2MIn
バケット所有者
AccM2MOut
バケット所有者
AccM2OIn
バケット所有者
AccM2OOut
バケット所有者
AccO2MIn
バケット所有者
AccO2MOut
バケット所有者
AccO2OIn
バケット所有者
AccO2OOut
バケット所有者
一時ストレージ
一時レプリカ (LRS) 容量
バケット所有者
DDoS 対策
予約済み OSS DDoS 対策インスタンス
バケット所有者
最小使用期間内にリリースされた OSS DDoS 対策インスタンスの残りの期間
バケット所有者
OSS DDoS 対策インスタンスによって保護されているトラフィック
バケット所有者
OSS DDoS 対策インスタンスによって保護されている API リクエスト
バケット所有者
データのインデックス作成
メタデータ管理
パブリックプレビュー中で無料
バケットクエリ
パブリックプレビュー中で無料
RTC トラフィック料金
RTC 対応 CRR タスク
バケット所有者
説明 *1 リクエスト元が GET、HEAD、または POST リクエストに x-oss-request-payer:requester
ヘッダーを含めない場合、PUT リクエストと GET リクエストの料金はバケット所有者に請求されます。
手順 OSS コンソールを使用する OSS コンソール にログインします。
左側のナビゲーションウィンドウで、バケットリスト をクリックします。[バケット] ページで、目的のバケットを見つけてクリックします。
左側のナビゲーションツリーで、 を選択します。
Pay-by-requester ページで、リクエスタ・ペイ をオンにします。
表示されるメッセージで、OK をクリックします。
説明 リクエスト元支払いを無効にするには、リクエスタ・ペイ をオフにして、表示されるメッセージで OK をクリックします。
OSS SDK を使用する 次のサンプル コードは、一般的なプログラミング言語の OSS SDK を使用してバケットのリクエスト元支払いモードを設定する方法の例を示しています。他のプログラミング言語の OSS SDK を使用してバケットのリクエスト元支払いモードを設定する方法の詳細については、「概要 」をご参照ください。
Java 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.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";
// バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを cn-hangzhou に設定します。
String region = "cn-hangzhou";
// OSSClient インスタンスを作成します。
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
try {
// バケットに対してリクエスト元支払いモードを有効にします。
Payer payer = Payer.Requester;
ossClient.setBucketRequestPayment(bucketName, payer);
} 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();
}
}
}
}
Node.js 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,
// バケットの名前を指定します。
bucket: 'yourBucketName',
});
async function setBucketRequestPayment(bucket, Payer) {
try {
// リクエスト元支払いモードを有効にするバケットの名前を指定します。
// Payer を Requester または BucketOwner に設定します。
// Payer を Requester に設定すると、バケットに対してリクエスト元支払いモードが有効になります。リクエスト元がバケット内のデータを読み取るときに発生するトラフィック料金とリクエスト料金は、リクエスト元に請求されます。
// Payer を BucketOwner に設定すると、バケットに対してリクエスト元支払いモードが無効になります。これは、バケットのデフォルト設定です。この場合、生成されたリクエスト料金はバケット所有者に請求されます。
const result = await client.putBucketRequestPayment(bucket, Payer);
console.log(result);
} catch (e) {
console.log(e);
}
}
setBucketRequestPayment('bucketName', 'Requester')
C# using Aliyun.OSS;
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";
// バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを 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);
c.SetRegion(region);
try
{
// バケットに対してリクエスト元支払いモードを有効にします。
var request = new SetBucketRequestPaymentRequest(bucketName, RequestPayer.Requester);
client.SetBucketRequestPayment(request);
Console.WriteLine("Set bucket:{0} RequestPayment succeeded ", bucketName);
}
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);
}
C++ #include <alibabacloud/oss/OssClient.h>
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";
/* ネットワークリソースなどのリソースを初期化します。*/
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);
/* バケットに対してリクエスト元支払いモードを有効にします。*/
SetBucketRequestPaymentRequest request(BucketName);
request.setRequestPayer(RequestPayer::Requester);
auto outcome = client.SetBucketRequestPayment(request);
if (!outcome.isSuccess()) {
/* 例外を処理します。*/
std::cout << "SetBucketRequestPayment fail" <<
",code:" << outcome.error().Code() <<
",message:" << outcome.error().Message() <<
",requestId:" << outcome.error().RequestId() << std::endl;
return -1;
}
/* ネットワークリソースなどのリソースを解放します。*/
ShutdownSdk();
return 0;
}
Go 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 // バケットの名前。
)
// コマンドライン パラメーターを初期化するために使用される init 関数を指定します。
func init() {
flag.StringVar(®ion, "region", "", "バケットが配置されているリージョン。")
flag.StringVar(&bucketName, "bucket", "", "バケットの名前。")
}
func main() {
// コマンドライン パラメーターを解析します。
flag.Parse()
// バケット名が空かどうかを確認します。
if len(bucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("無効なパラメーター、バケット名が必要です")
}
// リージョンが空かどうかを確認します。
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("無効なパラメーター、リージョンが必要です")
}
// デフォルト設定を読み込み、認証情報プロバイダーとリージョンを指定します。
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
// OSS クライアントを作成します。
client := oss.NewClient(cfg)
// リクエストの支払者を指定するリクエストを作成します。
putRequest := &oss.PutBucketRequestPaymentRequest{
Bucket: oss.Ptr(bucketName), // バケットの名前。
PaymentConfiguration: &oss.RequestPaymentConfiguration{
Payer: oss.Requester, // リクエストの支払者をリクエスト元に設定します。
},
}
// リクエストの支払者を指定するリクエストを送信します。
putResult, err := client.PutBucketRequestPayment(context.TODO(), putRequest)
if err != nil {
log.Fatalf("バケット リクエストの支払の設定に失敗しました %v", err)
}
// リクエストの結果を表示します。
log.Printf("バケット リクエストの支払の結果:%#v\n", putResult)
}
Python import argparse
import alibabacloud_oss_v2 as oss
# コマンドライン引数パーサーを作成し、スクリプトの目的を記述します: バケットのリクエスト支払設定を設定する
parser = argparse.ArgumentParser(description="バケット リクエスト支払サンプル")
# コマンドライン引数を定義します。必須のリージョン、バケット名、オプションのエンドポイント、および支払者を含みます
parser.add_argument('--region', help='バケットが配置されているリージョン。', required=True)
parser.add_argument('--bucket', help='バケットの名前。', required=True)
parser.add_argument('--endpoint', help='他のサービスが OSS にアクセスするために使用できるドメイン名')
parser.add_argument('--payer', help='ダウンロード料金とリクエスト料金を誰が支払うかを示します。可能な値: "Requester" または "BucketOwner"', 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 との対話の準備をするために、上記の構成で OSS クライアントを初期化します
client = oss.Client(cfg)
# 指定されたバケットのリクエスト支払設定を設定するリクエストを送信します
result = client.put_bucket_request_payment(oss.PutBucketRequestPaymentRequest(
bucket=args.bucket, # バケット名
request_payment_configuration=oss.RequestPaymentConfiguration(
payer=args.payer, # 支払者。「Requester」または「BucketOwner」を指定できます
),
))
# 操作結果のステータス コードとリクエスト ID を出力して、リクエスト ステータスを確認します
print(f'status code: {result.status_code},'
f' request id: {result.request_id},'
)
# このスクリプトが直接実行された場合は、main 関数を呼び出して処理ロジックを開始します
if __name__ == "__main__":
main() # スクリプトのエントリ ポイント。プログラム フローの制御はここから開始されます
PHP <?php
require_once __DIR__ . '/../vendor/autoload.php'; // オブジェクトと依存関係ライブラリを自動的にロードします。
use AlibabaCloud\Oss\V2 as Oss;
// コマンドライン パラメーターを指定します。
$optsdesc = [
"region" => ['help' => 'バケットが配置されているリージョン。', 'required' => True], // (必須) バケットが配置されているリージョンを指定します。例: oss-cn-hangzhou。
"endpoint" => ['help' => '他のサービスが OSS にアクセスするために使用できるドメイン名。', 'required' => False], // (オプション) 他のサービスが OSS にアクセスするために使用できるエンドポイントを指定します。
"bucket" => ['help' => 'バケットの名前', 'required' => True], // (必須) バケットの名前を指定します。
];
$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"; // 必須パラメーターが設定されていないことを指定します。
exit(1);
}
}
// コマンドライン パラメーターの値を取得します。
$region = $options["region"]; // バケットが配置されているリージョン。
$bucket = $options["bucket"]; // バケットの名前。
// 環境変数を使用して認証情報 (AccessKey ID と AccessKey シークレット) をロードします。
$credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider();
// SDK のデフォルト設定を使用します。
$cfg=Oss\Config::loadDefault(); // SDK のデフォルト設定を読み込みます。
$cfg->setCredentialsProvider($credentialsProvider); // 認証情報プロバイダーを指定します。
$cfg->setRegion($region); // リージョンを指定します。
if (isset($options["endpoint"])) {
$cfg->setEndpoint($options["endpoint"]); // エンドポイントが提供されている場合は、エンドポイントを指定します。
}
// OSSClient インスタンスを作成します。
$client = new Oss\Client($cfg);
// リクエストの支払者を指定するリクエストを作成します。
$request = new Oss\Models\PutBucketRequestPaymentRequest(
$bucket,
new Oss\Models\RequestPaymentConfiguration('Requester')
);
// putBucketRequestPayment メソッドを使用して、リクエストの支払者を指定します。
$result = $client->putBucketRequestPayment($request);
// 返された結果を表示します。
printf(
'status code:' . $result-> statusCode. PHP_EOL . // HTTP レスポンス ステータス コード。
'request id:' . $result->requestId // リクエストの一意の識別子。
);
ossutil を使用する ossutil を使用して、リクエスト元支払いモードの設定を行うことができます。インストールの詳細については、「ossutil のインストール 」をご参照ください。
以下は、examplebucket
のリクエスト元支払いモードの設定を行うためのサンプル コマンドです。
ossutil api put-bucket-request-payment --bucket examplebucket --request-payment-configuration "{\"Payer\":\"Requester\"}"
このコマンドの詳細については、「put-bucket-request-payment 」をご参照ください。
関連 API 操作 上記で説明したメソッドは、基本的に RESTful API に基づいて実装されており、ビジネスで高度なカスタマイズが必要な場合は、RESTful API を直接呼び出すことができます。API を直接呼び出すには、コードに署名の計算を含める必要があります。詳細については、「PutBucketRequestPayment 」をご参照ください。