資源群組是一種基於資源的許可權管理方式。您可以將需要授予同樣許可權的Bucket歸為同一個資源群組,然後統一為該資源群組授權,從而提升授權效率。
背景資訊
企業使用者採用為每個專案建立雲帳號的方式來隔離資源,或者企業的不同子公司或部門為實現業務上雲時建立了不同的雲帳號,導致一家企業擁有大量的雲帳號,最終無法統一管理、監控和審計雲上資源。

為解決以上業務痛點,OSS支援使用者通過單個阿里雲帳號,根據不同使用情境以資源群組的方式對不同雲資源進行合理分類,賦予企業內不同專案成員按專案自治管理雲資源的能力。

注意事項
一個資源群組可以包含不同地區的Bucket。一個Bucket只能屬於一個資源群組。
僅允許在Bucket擁有者名下不同資源群組之間轉移Bucket。
操作方式
使用OSS控制台
假設某互連網公司使用了20個Bucket儲存不同部門的測試資料。要求examplebucket1~examplebucket10的資料所有員工可讀(公用讀取),examplebucket11~examplebucket20的資料所有員工可讀可寫(公用讀寫)。如果不使用資源群組,您需要分別對每個Bucket進行授權,非常繁瑣。如果使用了資源群組,您可以將需要授予同樣許可權的Bucket歸為一組,然後統一為該資源群組授權,從而極大提升授權效率。
此外,考慮到要為多名員工賦予相同許可權,您需要建立使用者組並對RAM使用者進行分類和授權,從而更好的系統管理使用者及其許可權。
建立使用者組UserGroup1並添加使用者群組成員。
通過RAM控制台建立使用者組時,使用者組名稱命名為UserGroup1。具體操作,請參見建立RAM使用者組。使用者組建立完成後,將所有需要訪問資源的使用者添加到使用者組。具體操作,請參見為RAM使用者組添加RAM使用者。
建立資源群組。
開啟資源管理主控台。
在左側導覽列,選擇資源群組>資源群組。
在資源群組頁面,單擊建立資源群組。
在建立資源群組面板,填寫資源群組名稱為ResourcegroupA,並自訂資源群組標識,例如Group1。
單擊確認。
此時,資源群組的狀態處於建立中。大約三秒後,單擊
。如果狀態變為可用,表示資源群組ResourcegroupA建立成功。重複上述步驟建立ResourcegroupB。
為目標Bucket選擇所屬資源群組。
登入OSS管理主控台。
單擊Bucket 列表,然後單擊目標儲存空間examplebucket1。
選擇Bucket 配置 > 資源群組。
在資源群組頁面,單擊設定。
選擇所屬資源群組為ResourcegroupA,然後單擊保存。
重複上述步驟為examplebucket2~examplebucket10選擇所屬資源群組ResourcegroupA,為examplebucket11~examplebucket20選擇所屬資源群組ResourcegroupB。
為資源群組授權。
在資源管理主控台的左側導覽列,選擇資源群組>資源群組。
單擊目標資源群組右側的許可權管理。
在許可權管理頁簽,單擊新增授權。
在新增授權面板,按如下說明完成各配置項。
配置項
說明
授權範圍
選中指定資源群組,並從下拉式清單中選擇ResourcegroupA。
授權主體
填寫已建立的使用者組UserGroup1。
選擇許可權
選中系統策略後,為資源群組ResourcegroupA授予唯讀訪問Object Storage Service服務(OSS)的許可權
AliyunOSSReadOnlyAccess。單擊確定。
單擊完成。
重複上述步驟為資源群組ResourcegroupB授予管理Object Storage Service服務(OSS)許可權
AliyunOSSFullAccess。
使用阿里雲SDK
僅Java SDK、Python SDK和Go SDK支援配置Bucket所屬資源群組。請參見SDK簡介。
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();
}
}
}
}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()
// 填寫資源群組ID。如果未填寫資源群組ID,則bucket歸屬於預設資源群組
var groupId string = "rg-aekz****"
// 檢查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)
// 建立設定儲存空間資源群組的請求
request := &oss.PutBucketResourceGroupRequest{
Bucket: oss.Ptr(bucketName), // 儲存空間名稱
BucketResourceGroupConfiguration: &oss.BucketResourceGroupConfiguration{
ResourceGroupId: oss.Ptr(groupId),
},
}
// 發送設定儲存空間資源群組的請求
result, err := client.PutBucketResourceGroup(context.TODO(), request)
if err != nil {
log.Fatalf("failed to put bucket resource group %v", err)
}
// 列印設定儲存空間資源群組的結果
log.Printf("put bucket resource group result:%#v\n", result)
}
import argparse
import alibabacloud_oss_v2 as oss
# 建立命令列參數解析器,並描述指令碼用途:設定儲存空間(Bucket)的資源群組配置
parser = argparse.ArgumentParser(description="put bucket resource group sample")
# 定義命令列參數,包括必需的地區、儲存空間名稱、可選的endpoint以及資源群組ID
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('--resource_group_id',
help='The ID of the resource group to which the bucket belongs. (Optional, default is an empty string)',
default='')
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_resource_group(oss.PutBucketResourceGroupRequest(
bucket=args.bucket, # 儲存空間名
bucket_resource_group_configuration=oss.BucketResourceGroupConfiguration(
resource_group_id=args.resource_group_id, # 資源群組ID
),
))
# 列印操作結果的狀態代碼和請求ID,以便確認請求狀態
print(f'status code: {result.status_code},'
f' request id: {result.request_id},'
)
# 當此指令碼被直接執行時,調用main函數開始處理邏輯
if __name__ == "__main__":
main() # 指令碼進入點,控製程序流程從這裡開始使用命令列工具ossutil
您可以使用命令列工具ossutil配置資源群組,ossutil的安裝請參見安裝ossutil。
以下命令用於配置儲存空間examplebucket資源群組ID為rg-123。
ossutil api put-bucket-resource-group --bucket examplebucket --resource-group-configuration "{\"ResourceGroupId\":\"rg-123\"}"關於該命令的更多資訊,請參見put-bucket-resource-group。
相關API
以上操作方式底層基於API實現,如果您的程式自訂要求較高,您可以直接發起REST API請求。直接發起REST API請求需要手動編寫代碼計算簽名。更多資訊,請參見PutBucketResourceGroup。