通常情況下,儲存空間(Bucket)的擁有者需要支付Bucket產生的所有費用。然而,您可以為Bucket開啟要求者付費模式,使通過身分識別驗證的要求者支付訪問Bucket內資料時產生的流量、請求次數、資料處理費用,而Bucket的擁有者僅支付儲存等其他費用。當您希望共用資料,但又不希望支付因共用資料產生的額外費用時,您可以開啟要求者付費模式。
請求方式 不允許匿名訪問
如果您在Bucket上啟用了要求者付費模式,則不允許匿名訪問該Bucket。請求方必須提供身分識別驗證資訊,以便OSS能夠識別請求方,從而對請求方而非Bucket擁有者收取請求所產生的費用。
當要求者是通過扮演阿里雲RAM角色來請求資料時,該角色所屬的賬戶將為此請求付費。
請求中需攜帶要求標頭x-oss-request-payer
如果您在Bucket上啟用了要求者付費模式,請求中必須攜帶x-oss-request-payer
要求標頭,且取值為requester ,以表明請求方已瞭解需要支付請求和資料下載費用。否則,請求方無法通過驗證。
資料擁有者訪問該Bucket時,可以不攜帶x-oss-request-payer
要求標頭。當資料擁有者作為要求者訪問該Bucket時,請求產生的費用由資料擁有者(也是要求者)來支付。
費用說明 Bucket開啟要求者付費前,所有費用均由Bucket擁有者支付。Bucket開啟要求者付費模式後,由Bucket擁有者支付的計費項目將產生變化。Bucket擁有者以及要求者支付的詳細說明如下:
費用
計費項目
支付者
儲存費用
標準儲存(本地冗餘)容量
Bucket擁有者
標準儲存(同城冗餘)容量
Bucket擁有者
低頻訪問(本地冗餘)容量
Bucket擁有者
低頻訪問(同城冗餘)容量
Bucket擁有者
歸檔(本地冗餘)容量
Bucket擁有者
歸檔(同城冗餘)容量
Bucket擁有者
冷歸檔(本地冗餘)容量
Bucket擁有者
深度冷歸檔(本地冗餘)容量
Bucket擁有者
低頻訪問(本地冗餘)不足規定時間長度容量
Bucket擁有者
Archive Storage(本地冗餘)不足規定時間長度容量
Bucket擁有者
Archive Storage(同城冗餘)不足規定時間長度容量
Bucket擁有者
冷Archive Storage不足規定時間長度容量
Bucket擁有者
深度冷Archive Storage不足規定時間長度容量
Bucket擁有者
流量費用
外網流出流量
要求者
外網流入流量
免費
內網流出流量
免費
內網流入流量
免費
CDN回源流出流量
要求者
跨地區複製流量
Bucket擁有者
① 請求費用
Put類型請求次數
要求者
Get類型請求次數
要求者
取回請求
Bucket擁有者
Select掃描資料量
Bucket擁有者
低頻訪問資料取回容量
要求者
Archive Storage資料取回容量
要求者
歸檔直讀資料取回容量
Bucket擁有者
冷Archive Storage資料取回容量
Bucket擁有者
深度冷Archive Storage資料取回容量
Bucket擁有者
對象標籤費用
對象標籤
Bucket擁有者
傳輸加速費用
傳輸加速AccM2MIn
Bucket擁有者
傳輸加速AccM2MOut
Bucket擁有者
傳輸加速AccM2OIn
Bucket擁有者
傳輸加速AccM2OOut
Bucket擁有者
傳輸加速AccO2MIn
Bucket擁有者
傳輸加速AccO2MOut
Bucket擁有者
傳輸加速AccO2OIn
Bucket擁有者
傳輸加速AccO2OOut
Bucket擁有者
臨時儲存費用
臨時儲存容量(本地冗餘)
Bucket擁有者
DDoS防護費用
高防資源預留費用
Bucket擁有者
高防資源提前釋放費用
Bucket擁有者
高防流量防護費用
Bucket擁有者
高防請求防護費用
Bucket擁有者
資料索引費用
Meta管理費
公測階段,免費
Bucket查詢費
公測階段,免費
說明 ① 如果要求者未在請求中(GET、HEAD或POST)聲明要求者付費的要求標頭x-oss-request-payer
,則由Bucket擁有者支付Put類和Get類請求次數費用。
操作步驟 使用OSS控制台 登入OSS管理主控台 。
單擊Bucket 列表 ,然後單擊目標Bucket名稱。
在左側導覽列,選擇。
在要求者付費 頁面,開啟請求者付費 開關。
在彈出的對話方塊,單擊確定 。
說明 如果您需要關閉要求者付費,您可以關閉請求者付費 開關,然後單擊確定 。
使用阿里雲SDK 以下僅列舉常見SDK的佈建要求者付費模式的程式碼範例。關於其他SDK的佈建要求者付費模式的程式碼範例,請參見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{
// 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 <?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");
Node.js 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')
Python # -*- 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)
C# 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);
}
Go 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)
}
}
C++ #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佈建要求者付費模式的具體操作, 請參見佈建要求者付費模式 。