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