为高性能桶设置存储桶策略(PUT Bucket Policy),通过声明式的授权语句控制账号对桶及对象的访问权限。该接口属于控制面,使用基础凭证签名,不走 session。
注意事项
Resource 必须精确匹配当前请求的桶,高性能桶的资源形态为 qcs::cosrapid:<Region>:uid/<APPID>:<BucketName>-x--<APPID>/*;指向其他桶、跨地域或通配 * 均会被拒绝(InvalidArgument)。Principal 的 key 仅支持 qcs 与 service;qcs 形如 qcs::cam::uin/<主账号uin>:uin/<子账号uin>。Effect 取值为 allow 或 deny;Action 原样透传 CAM。put_bucket_policy 会以本次提交的策略整体覆盖桶上原有策略,而非增量合并,需提交完整的目标策略集合。仅桶所属账号下获得授权的身份可调用。未获授权时返回
403 AccessDenied;请求已获授权但所属账号与桶所属账号不符时,返回 405 MethodNotAllowed。设置存储桶策略属于控制面接口,使用基础凭证签名,不走 session。
请求
方法原型
def put_bucket_policy(self, Bucket, Policy, **kwargs)
参数说明
参数名称 | 参数描述 | 类型 | 是否必选 |
Bucket | 高性能桶完整名称,格式为 <BucketName>-x--<APPID> | string | 是 |
Policy | 桶策略内容,可为 JSON 字符串或 JSON dict | string / dict | 是 |
kwargs | 可选请求参数,使用本文列出的参数 | dict | 否 |
策略字段:
字段 | 参数描述 | 类型 | 是否必选 |
Version | 策略语法版本,通常为 2.0 | string | 否 |
Statement | 授权语句列表 | list | 是 |
Statement.Principal | 被授权者,key 仅支持 qcs 与 service;qcs 形如 qcs::cam::uin/<主账号uin>:uin/<子账号uin> | dict | 是 |
Statement.Action | 授权的操作列表,形如 name/cos:CreateSession、name/cos:GetObject | list | 是 |
Statement.Effect | 授权效果,取值 allow 或 deny(大小写不敏感) | string | 是 |
Statement.Resource | 授权作用的资源,需精确匹配当前请求的桶 | list | 是 |
Statement.Condition | 生效条件,原样透传 CAM | dict | 否 |
Statement.Sid | 语句标识符 | string | 否 |
响应
参数名称 | 参数描述 | 类型 |
None | 设置成功无返回内容,对应 HTTP 204 | None |
错误码
实际案例
# -*- coding=utf-8 -*-import osfrom qcloud_cos import CosConfig, CosS3Client# 高性能桶经 VPC 内网 HTTP 80 端口接入,SDK 的网关 DNS 负载均衡也仅对 HTTP 请求生效;SDK 默认 https,此处需显式指定 http。config = CosConfig(Scheme='http',Region='ap-guangzhou',SecretId=os.environ['COS_SECRET_ID'],SecretKey=os.environ['COS_SECRET_KEY'],Token=os.environ.get('COS_SECURITY_TOKEN'),EnableRapidDomain=True)client = CosS3Client(config)policy = {'version': '2.0','Statement': [{'Sid': 'allow-get-and-session','Effect': 'allow','Principal': {'qcs': ['qcs::cam::uin/100000000001:uin/100000000011'],},'Action': ['name/cos:CreateSession','name/cos:GetObject',],'Resource': ['qcs::cosrapid:ap-guangzhou:uid/1250000000:examplebucket-x--1250000000/*',],},],}client.put_bucket_policy(Bucket='examplebucket-x--1250000000', Policy=policy)print('bucket policy set')