通过资源组授予多个Bucket相同权限

资源组是一种基于资源的权限管理方式。您可以将需要授予同样权限的Bucket归为同一个资源组,然后统一为该资源组授权,从而提升授权效率。

背景信息

企业用户采用为每个项目创建云账号的方式来隔离资源,或者企业的不同子公司或部门为实现业务上云时创建了不同的云账号,导致一家企业拥有大量的云账号,最终无法统一管理、监控和审计云上资源。

account

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

rg

注意事项

  • 华东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用户进行分类和授权,从而更好的管理用户及其权限。

  1. 创建用户组UserGroup1并添加用户组成员。

    通过RAM控制台创建用户组时,用户组名称命名为UserGroup1。具体操作,请参见创建RAM用户组。用户组创建完成后,将所有需要访问资源的用户添加到用户组。具体操作,请参见为RAM用户组添加RAM用户

  2. 创建资源组。

    1. 打开资源管理控制台

    2. 在左侧导航栏,选择资源组>资源组

    3. 资源组页面,单击创建资源组

    4. 创建资源组面板,填写资源组名称ResourcegroupA,并自定义资源组标识,例如Group1

    5. 单击确认

      此时,资源组的状态处于创建中。大约三秒后,单击资源组_刷新列表。如果状态变为可用,表示资源组ResourcegroupA创建成功。

    6. 重复上述步骤创建ResourcegroupB。

  3. 为目标Bucket选择所属资源组。

    1. 登录OSS管理控制台

    2. 单击Bucket 列表,然后单击目标存储空间examplebucket1。

    3. 选择Bucket 配置 > 资源组

    4. 资源组页面,单击设置

    5. 选择所属资源组为ResourcegroupA,然后单击保存

    6. 重复上述步骤为examplebucket2~examplebucket10选择所属资源组ResourcegroupA,为examplebucket11~examplebucket20选择所属资源组ResourcegroupB。

  4. 为资源组授权。

    1. 在资源管理控制台的左侧导航栏,选择资源组>资源组。

    2. 单击目标资源组右侧的权限管理

    3. 权限管理页签,单击新增授权

    4. 新增授权面板,按如下说明完成各配置项。

      配置项

      说明

      授权范围

      选中指定资源组,并从下拉列表中选择ResourcegroupA。

      授权主体

      填写已创建的用户组UserGroup1。

      选择权限

      选中系统策略后,为资源组ResourcegroupA授予只读访问对象存储服务(OSS)的权限AliyunOSSReadOnlyAccess

    5. 单击确定

    6. 单击完成

    7. 重复上述步骤为资源组ResourcegroupB授予管理对象存储服务(OSS)权限AliyunOSSFullAccess

使用阿里云SDK

仅Java SDK及Python SDK支持配置Bucket所属资源组。

import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
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";
        // 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // 填写Bucket名称,例如examplebucket。
        String bucketName = "examplebucket";
        // 填写资源组ID。如果未填写资源组ID,则Bucket归属于默认资源组。
        String rgId = "rg-aekz****";
        // 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou。
        String region = "cn-hangzhou";
        
        // 创建OSSClient实例。
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);        
        OSS ossClient = OSSClientBuilder.create()
        .endpoint(endpoint)
        .credentialsProvider(credentialsProvider)
        .clientConfiguration(clientBuilderConfiguration)
        .region(region)               
        .build();

        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
from oss2.credentials import EnvironmentVariableCredentialsProvider

# 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())

# 填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"

# 填写Endpoint对应的Region信息,例如cn-hangzhou。注意,v4签名下,必须填写该参数
region = "cn-hangzhou"

# yourBucketName填写存储空间名称。
bucket = oss2.Bucket(auth, endpoint, "yourBucketName", region=region)

# 填写资源组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