通常情况下,存储空间(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拥有者 |
归档存储(本地冗余)不足规定时长容量 | Bucket拥有者 |
归档存储(同城冗余)不足规定时长容量 | Bucket拥有者 |
冷归档存储不足规定时长容量 | Bucket拥有者 |
深度冷归档存储不足规定时长容量 | Bucket拥有者 |
流量费用 | 外网流出流量 | 请求者 |
外网流入流量 | 免费 |
内网流出流量 | 免费 |
内网流入流量 | 免费 |
CDN回源流出流量 | 请求者 |
跨区域复制流量 | Bucket拥有者 |
①请求费用 | Put类型请求次数 | 请求者 |
Get类型请求次数 | 请求者 |
取回请求 | Bucket拥有者 |
| Select扫描数据量 | Bucket拥有者 |
低频访问数据取回容量 | 请求者 |
归档存储数据取回容量 | 请求者 |
归档直读数据取回容量 | Bucket拥有者 |
冷归档存储数据取回容量 | Bucket拥有者 |
深度冷归档存储数据取回容量 | 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简介。
import com.aliyun.oss.ClientBuilderConfiguration;
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.common.comm.SignVersion;
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";
// 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou。
String region = "cn-hangzhou";
// 创建OSSClient实例。
// 当OSSClient实例不再使用时,调用shutdown方法以释放资源。
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();
}
}
}
}
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,
authorizationV4: true,
// yourBucketName填写Bucket名称。
bucket: 'yourBucketName',
});
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')
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";
// 填写Bucket所在地域对应的Region。以华东1(杭州)为例,Region填写为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);
client.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);
}
#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";
/ *yourRegion填写Bucket所在地域对应的Region。以华东1(杭州)为例,Region填写为cn - hangzhou。 * /
std::string Region = "yourRegion";
/*填写Bucket名称,例如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;
}
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", "", "The region in which the bucket is located.")
flag.StringVar(&bucketName, "bucket", "", "The name of the bucket.")
}
func main() {
// 解析命令行参数
flag.Parse()
// 检查bucket名称是否为空
if len(bucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, bucket name required")
}
// 检查region是否为空
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, region required")
}
// 加载默认配置并设置凭证提供者和区域
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("failed to put bucket request payment %v", err)
}
// 打印设置存储空间请求支付方式的结果
log.Printf("put bucket request payment result:%#v\n", putResult)
}
import argparse
import alibabacloud_oss_v2 as oss
# 创建命令行参数解析器,并描述脚本用途:设置存储空间(Bucket)的请求支付配置
parser = argparse.ArgumentParser(description="put bucket request payment sample")
# 定义命令行参数,包括必需的区域、存储空间名称、可选的endpoint以及支付方
parser.add_argument('--region', help='The region in which the bucket is located.', required=True)
parser.add_argument('--bucket', help='The name of the bucket.', required=True)
parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS')
parser.add_argument('--payer', help='Indicates who pays the download and request fees. Possible values: "Requester" or "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
# 如果提供了自定义endpoint,则更新配置对象中的endpoint属性
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
require_once __DIR__ . '/../vendor/autoload.php'; // 引入自动加载文件,加载依赖库
use AlibabaCloud\Oss\V2 as Oss;
// 定义命令行参数描述
$optsdesc = [
"region" => ['help' => 'The region in which the bucket is located.', 'required' => True], // 地域是必填项,存储空间所在的地域,例如 oss-cn-hangzhou。
"endpoint" => ['help' => 'The domain names that other services can use to access OSS.', 'required' => False], // 访问域名是可选项,其他服务可以用来访问OSS的域名。
"bucket" => ['help' => 'The name of the bucket', '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"]; // 存储空间名称。
// 使用环境变量加载凭证信息(AccessKeyId 和 AccessKeySecret)
$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"]); // 如果提供了访问域名,则设置访问域名。
}
// 创建OSS客户端实例
$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的安装请参见安装ossutil。
以下示例展示了如何为存储空间examplebucket
设置请求者付费模式。
ossutil api put-bucket-request-payment --bucket examplebucket --request-payment-configuration "{\"Payer\":\"Requester\"}"
如果您想了解该命令的更多信息,请参见put-bucket-request-payment。