全部產品
Search
文件中心

Object Storage Service:開啟要求者付費模式讓要求者支付流量、請求次數、資料處理費用

更新時間:Jun 19, 2024

通常情況下,儲存空間(Bucket)的擁有者需要支付Bucket產生的所有費用。然而,您可以為Bucket開啟要求者付費模式,使通過身分識別驗證的要求者支付訪問Bucket內資料時產生的流量、請求次數、資料處理費用,而Bucket的擁有者僅支付儲存等其他費用。當您希望共用資料,但又不希望支付因共用資料產生的額外費用時,您可以開啟要求者付費模式。

使用情境

  • 共用大型資料集。例如某研究機構希望所有客戶都能訪問包含郵遞區號目錄、參考資料、地理空間資訊或網路爬取等資料的共用資料集,同時希望下載資料產生的流量費用和請求次數費用需由要求者支付。

    配置步驟如下:

    1. 確保共用資料集所屬Bucket的讀寫權限ACL為公用讀取。具體操作,請參見設定Bucket ACL

    2. 為該Bucket開啟要求者付費模式。

  • 將生產資料交付給您的客戶或夥伴。例如,某公司需要將生產資料交付給該公司的夥伴,下載資料產生的流量費用和請求次數費用需要由夥伴支付。

    配置步驟如下:

    1. 確保生產資料所屬Bucket的讀寫權限ACL為私人。具體操作,請參見設定Bucket ACL

    2. 為該Bucket開啟要求者付費模式。

    3. 通過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擁有者

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控制台

  1. 登入OSS管理主控台

  2. 單擊Bucket 列表,然後單擊目標Bucket名稱。

  3. 在左側導覽列,選擇Bucket 配置 > 請求者付費

  4. 要求者付費頁面,開啟請求者付費開關。

  5. 在彈出的對話方塊,單擊確定

    說明

    如果您需要關閉要求者付費,您可以關閉請求者付費開關,然後單擊確定

使用阿里雲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