通常情況下,存儲空間(Bucket)的擁有者需要支付Bucket產生的所有費用。然而,您可以為Bucket開啟請求者付費模式,使通過身份驗證的請求者支付訪問Bucket內數據時產生的流量、請求次數、數據處理費用,而Bucket的擁有者僅支付存儲等其他費用。當您希望共享數據,但又不希望支付因共享數據產生的額外費用時,您可以開啟請求者付費模式。
無地域屬性存儲空間不支持開啟請求者付費模式。
使用場景
共享大型數據集。例如某研究機構希望所有客戶都能訪問包含郵政編碼目錄、參考數據、地理空間信息或網絡爬取等數據的共享數據集,同時希望下載數據產生的流量費用和請求次數費用需由請求者支付。
配置步驟如下:
確保共享數據集所屬Bucket的讀寫權限ACL為公共讀。具體操作,請參見設置Bucket ACL。
為該Bucket開啟請求者付費模式。
將生產數據交付給您的客戶或合作伙伴。例如,某公司需要將生產數據交付給該公司的合作伙伴,下載數據產生的流量費用和請求次數費用需要由合作伙伴支付。
配置步驟如下:
確保生產數據所屬Bucket的讀寫權限ACL為私有。具體操作,請參見設置Bucket ACL。
為該Bucket開啟請求者付費模式。
通過Bucket Policy授權您的合作伙伴訪問該Bucket內指定的生產數據。具體操作,請參見基于Bucket Policy實現跨賬號訪問OSS。
重要您需要將Bucket授權給合作伙伴的RAM用戶,而不是將您賬號下RAM用戶的AccessKey提供給合作伙伴進行訪問。原因是當合作伙伴通過您賬號下的RAM用戶訪問時,請求者是您自身,請求費用仍需要您(請求者)來支付。
請求方式
不允許匿名訪問
如果您在Bucket上啟用了請求者付費模式,則不允許匿名訪問該Bucket。請求方必須提供身份驗證信息,以便OSS能夠識別請求方,從而對請求方而非Bucket擁有者收取請求所產生的費用。
當請求者是通過扮演阿里云RAM角色來請求數據時,該角色所屬的賬戶將為此請求付費。
請求中需攜帶請求頭
x-oss-request-payer
如果您在Bucket上啟用了請求者付費模式,請求中必須攜帶
x-oss-request-payer
請求頭,且取值為requester,以表明請求方已了解需要支付請求和數據下載費用。否則,請求方無法通過驗證。對于POST、GET和HEAD請求,需在請求中包含
x-oss-request-payer:requester
信息。詳情請參見簽名版本4(推薦)。對于簽名URL,需在請求中包含
x-oss-request-payer=requester
信息。詳情請參見簽名版本4(推薦)。
數據擁有者訪問該Bucket時,可以不攜帶
x-oss-request-payer
請求頭。當數據擁有者作為請求者訪問該Bucket時,請求產生的費用由數據擁有者(也是請求者)來支付。
費用說明
Bucket開啟請求者付費前,所有費用均由Bucket擁有者支付。Bucket開啟請求者付費模式后,由Bucket擁有者支付的計費項將產生變化。Bucket擁有者以及請求者支付的詳細說明如下:
費用 | 計費項 | 支付者 |
標準存儲(本地冗余)容量 | Bucket擁有者 | |
標準存儲(同城冗余)容量 | Bucket擁有者 | |
低頻訪問(本地冗余)容量 | Bucket擁有者 | |
低頻訪問(同城冗余)容量 | Bucket擁有者 | |
歸檔(本地冗余)容量 | Bucket擁有者 | |
歸檔(同城冗余)容量 | Bucket擁有者 | |
冷歸檔(本地冗余)容量 | Bucket擁有者 | |
深度冷歸檔(本地冗余)容量 | Bucket擁有者 | |
低頻訪問(本地冗余)不足規定時長容量 | Bucket擁有者 | |
歸檔存儲(本地冗余)不足規定時長容量 | Bucket擁有者 | |
歸檔存儲(同城冗余)不足規定時長容量 | Bucket擁有者 | |
冷歸檔存儲不足規定時長容量 | Bucket擁有者 | |
深度冷歸檔存儲不足規定時長容量 | Bucket擁有者 | |
無地域屬性存儲容量 | Bucket擁有者 | |
外網流出流量 | 請求者 | |
外網流入流量 | 免費 | |
內網流出流量 | 免費 | |
內網流入流量 | 免費 | |
CDN回源流出流量 | 請求者 | |
跨區域復制流量 | Bucket擁有者 | |
①請求費用 | Put類型請求次數 | 請求者 |
Get類型請求次數 | 請求者 | |
取回請求 | Bucket擁有者 | |
圖片處理 | 請求者 | |
圖片高級壓縮 | Bucket擁有者 | |
視頻截幀 | 請求者 | |
Select掃描數據量 | Bucket擁有者 | |
低頻訪問數據取回容量 | 請求者 | |
歸檔存儲數據取回容量 | 請求者 | |
歸檔直讀數據取回容量 | Bucket擁有者 | |
冷歸檔存儲數據取回容量 | Bucket擁有者 | |
深度冷歸檔存儲數據取回容量 | Bucket擁有者 | |
對象標簽 | Bucket擁有者 | |
傳輸加速AccM2MIn | Bucket擁有者 | |
傳輸加速AccM2MOut | Bucket擁有者 | |
傳輸加速AccM2OIn | Bucket擁有者 | |
傳輸加速AccM2OOut | Bucket擁有者 | |
傳輸加速AccO2MIn | Bucket擁有者 | |
傳輸加速AccO2MOut | Bucket擁有者 | |
傳輸加速AccO2OIn | Bucket擁有者 | |
傳輸加速AccO2OOut | Bucket擁有者 | |
臨時存儲容量(本地冗余) | Bucket擁有者 | |
高防資源預留費用 | Bucket擁有者 | |
高防資源提前釋放費用 | Bucket擁有者 | |
高防流量防護費用 | Bucket擁有者 | |
高防請求防護費用 | Bucket擁有者 | |
Meta管理費 | 公測階段,免費 | |
Bucket查詢費 | 公測階段,免費 | |
敏感數據保護掃描容量 | Bucket擁有者 | |
OSS加速器容量 | Bucket擁有者 | |
元數據管理 | Bucket擁有者 | |
跨區域復制RTC | Bucket擁有者 |
①如果請求者未在請求中(GET、HEAD或POST)聲明請求者付費的請求頭x-oss-request-payer
,則由Bucket擁有者支付Put類和Get類請求次數費用。
操作步驟
使用OSS控制臺
登錄OSS管理控制臺。
單擊Bucket 列表,然后單擊目標Bucket名稱。
在左側導航欄,選擇 。
在請求者付費頁面,打開請求者付費開關。
在彈出的對話框,單擊確定。
說明如果您需要關閉請求者付費,您可以關閉請求者付費開關,然后單擊確定。
使用阿里云SDK
以下僅列舉常見SDK的設置請求者付費模式的代碼示例。關于其他SDK的設置請求者付費模式的代碼示例,請參見SDK簡介。
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{
// Endpoint以華東1(杭州)為例,其它Region請按實際情況填寫。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 從環境變量中獲取訪問憑證。運行本代碼示例之前,請確保已設置環境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// 填寫Bucket名稱,例如examplebucket。
String bucketName = "examplebucket";
// 創建OSSClient實例。
OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);
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();
}
}
}
}
<?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以杭州為例,其它Region請按實際情況填寫。
$endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
// 填寫Bucket名稱,例如examplebucket。
$bucket= "examplebucket";
try {
$config = array(
"provider" => $provider,
"endpoint" => $endpoint,
);
$ossClient = new OssClient($config);
$ossClient->putBucketRequestPayment($bucket, "Requester");
} catch (OssException $e) {
printf(__FUNCTION__ . ": FAILED\n");
printf($e->getMessage() . "\n");
return;
}
print(__FUNCTION__ . ": OK" . "\n");
const OSS = require('ali-oss')
const client = new OSS({
// yourregion填寫Bucket所在地域。以華東1(杭州)為例,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
});
async function setBucketRequestPayment(bucket, Payer) {
try {
// bucket填寫需要設置請求者付費模式的存儲空間名稱。
// Payer取值為Requester或BucketOwner。
// Payer設置為Requester,表明該存儲空間已開啟請求者付費模式,由請求者支付讀取存儲空間(Bucket)內數據時產生的流量費用和請求費用。
// Payer設置為BucketOwner,表明該存儲空間不開啟請求者付費模式(默認狀態),即請求產生的費用由數據擁有者(BucketOwner)來支付。
const result = await client.putBucketRequestPayment(bucket, Payer);
console.log(result);
} catch (e) {
console.log(e);
}
}
setBucketRequestPayment('bucketName', 'Requester')
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
from oss2.models import PAYER_BUCKETOWNER, PAYER_REQUESTER
# 從環境變量中獲取訪問憑證。運行本代碼示例之前,請確保已設置環境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# yourEndpoint填寫Bucket所在地域對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
# 填寫Bucket名稱,例如examplebucket。
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'examplebucket')
# 設置請求者付費模式,默認的付費者為PAYER_BUCKETOWNER。
result = bucket.put_bucket_request_payment(PAYER_REQUESTER)
print("http respon status: ", result.status)
using Aliyun.OSS;
using Aliyun.OSS.Common;
// yourEndpoint填寫Bucket所在地域對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為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");
// 填寫Bucket名稱。
var bucketName = "examplebucket";
// 創建OSSClient實例。
var client = new OssClient(endpoint, accessKeyId, accessKeySecret);
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);
}
package main
import (
"fmt"
"os"
"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填寫Bucket對應的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實際情況填寫。
client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))
if err != nil {
fmt.Println("New Error:", err)
os.Exit(-1)
}
// 初始化請求者付費模式。
reqPayConf := oss.RequestPaymentConfiguration{
Payer: "Requester",
}
// 設置請求者付費模式。
err = client.SetBucketRequestPayment("<yourBucketName>", reqPayConf)
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
}
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;
int main(void)
{
/*初始化OSS賬號信息。*/
/*yourEndpoint填寫Bucket所在地域對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。*/
std::string Endpoint = "yourEndpoint";
/*填寫Bucket名稱,例如examplebucket。*/
std::string BucketName = "examplebucket";
/*初始化網絡等資源。*/
InitializeSdk();
ClientConfiguration conf;
/* 從環境變量中獲取訪問憑證。運行本代碼示例之前,請確保已設置環境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。*/
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClient client(Endpoint, credentialsProvider, conf);
/*設置請求者付費模式。*/
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;
}
使用命令行工具ossutil
關于使用ossutil設置請求者付費模式的具體操作, 請參見設置請求者付費模式。
使用REST API
如果您的程序自定義要求較高,您可以直接發起REST API請求。直接發起REST API請求需要手動編寫代碼計算簽名。更多信息,請參見PutBucketRequestPayment。