资源组是一种基于资源的权限管理方式。您可以根据不同的业务需求对存储空间(Bucket)进行分组,为不同的资源组设置不同的访问权限,实现资源组范围内的权限管理。
背景信息
企业用户采用为每个项目创建云账号的方式来隔离资源,或者企业的不同子公司或部门为实现业务上云时创建了不同的云账号,导致一家企业拥有大量的云账号,最终无法统一管理、监控和审计云上资源。

为解决以上业务痛点,OSS支持用户通过单个阿里云账号,根据不同使用场景以资源组的方式对不同云资源进行合理分类,赋予企业内不同项目成员按项目自治管理云资源的能力。

注意事项
- 仅华东1(杭州)、华东2(上海)、华北1(青岛)、华北2(北京)、华北 3(张家口)、华北5(呼和浩特)、华北6(乌兰察布)、华南1(深圳)、华南2(河源)、华南3(广州)、西南1(成都)、中国香港、美国(硅谷)、美国(弗吉尼亚)、日本(东京)、新加坡、澳大利亚(悉尼)、马来西亚(吉隆坡)、印度尼西亚(雅加达)、印度(孟买)、德国(法兰克福)、英国(伦敦)、阿联酋(迪拜)地域支持配置资源组。
- 无地域属性的Bucket不支持配置资源组。
- 一个资源组可以包含不同地域的Bucket。一个Bucket只能属于一个资源组。
- 仅允许在Bucket拥有者名下不同资源组之间转移Bucket。
使用OSS控制台
假设某互联网公司使用了20个Bucket存储不同部门的测试数据。要求examplebucket1~examplebucket10的数据所有员工可读(公共读),examplebucket11~examplebucket20的数据所有员工可读可写(公共读写)。如果不使用资源组,您需要分别对每个Bucket进行授权,非常繁琐。如果使用了资源组,您可以将需要授予同样权限的Bucket归为一组,然后统一给该资源组授权,从而极大提升授权效率。
此外,考虑到要为多名员工赋予相同权限,您需要通过创建用户组并对RAM用户进行分类并授权,从而更好的管理用户及其权限。
- 创建用户组UserGroup1并添加用户组成员。
- 创建资源组。
- 为目标Bucket选择所属资源组。
- 登录OSS管理控制台。
- 单击Bucket列表,然后单击目标存储空间examplebucket1。
- 选择 。
- 单击设置。
- 选择所属资源组为ResourcegroupA,然后单击保存。
- 重复上述步骤为examplebucket2~examplebucket10选择所属资源组ResourcegroupA,为examplebucket11~examplebucket20选择所属资源组ResourcegroupB。
- 为资源组授权。
使用阿里云SDK
仅Java SDK及Python SDK支持配置Bucket所属资源组。
import com.aliyun.oss.*;
import com.aliyun.oss.model.SetBucketResourceGroupRequest;
public class Demo {
public static void main(String[] args) throws Throwable {
// Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
String accessKeyId = "yourAccessKeyId";
String accessKeySecret = "yourAccessKeySecret";
// 填写Bucket名称,例如examplebucket。
String bucketName = "examplebucket";
// 填写资源组ID。如果未填写资源组ID,则Bucket归属于默认资源组。
String rgId = "rg-aekz****";
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
try {
// 创建setBucketResourceGroupRequest对象。
SetBucketResourceGroupRequest setBucketResourceGroupRequest = new SetBucketResourceGroupRequest(bucketName,rgId);
// 配置Bucket所属资源组。
ossClient.setBucketResourceGroup(setBucketResourceGroupRequest);
} 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 (ClientException 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 {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}
# -*- coding: utf-8 -*-
import oss2
# 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
auth = oss2.Auth('yourAccessKeyId', 'yourAccessKeySecret')
# 填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
# 填写Bucket名称,例如examplebucket。
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'examplebucket')
# 填写资源组ID。如果未填写资源组ID,则Bucket归属于默认资源组。
resource_group_id = 'rg-aek27tc****'
# 配置Bucket所属资源组。
result = bucket.put_bucket_resource_group(resource_group_id)
print('配置资源组成功,返回状态为:' + str(result.status))
使用REST API
如果您的程序自定义要求较高,您可以直接发起REST API请求。直接发起REST API请求需要手动编写代码计算签名。更多信息,请参见PutBucketResourceGroup。