リソースグループは、リソースベースのアクセス制御方式です。同じ権限を付与するバケットを同じリソースグループに追加し、そのリソースグループに権限を付与できます。これにより、権限付与の効率が向上します。
背景情報
企業ユーザーは、異なるプロジェクト、子会社、部門のリソースを分離するために、複数の Alibaba Cloud アカウントを作成することがあります。ただし、これにより、企業ユーザーは、これらの Alibaba Cloud アカウントにあるリソースを一元的に管理、監視、監査することが困難になります。

Object Storage Service (OSS) では、ビジネスシナリオに基づいて Alibaba Cloud アカウント内のリソースを分類するためのリソースグループを作成できます。このようにして、企業内のユーザーは、リソースグループを使用してプロジェクト内のリソースを効率的に管理できます。

注意事項
1 つのリソースグループには、異なるリージョンのバケットを含めることができます。1 つのバケットは、1 つのリソースグループにのみ所属できます。
バケットは、同じ所有者によって作成されたリソースグループ間でのみ転送できます。
方法
OSS コンソールを使用する
次の例では、会社のさまざまな部門のテストデータが 20 個のバケットに保存されています。従業員全員に 10 個のバケットに保存されているデータの書き込みと読み取りを許可し、他の 10 個のバケットに保存されているデータの読み取りのみを許可します。リソースグループを使用しない場合は、各バケットに必要な権限を個別に構成する必要があります。リソースグループを使用する場合は、同じ権限を必要とするバケットをリソースグループに追加し、リソースグループに必要な権限を構成できます。
また、複数の RAM ユーザー (従業員) に同じ権限を付与するには、ユーザーグループを作成する必要があります。ユーザーグループの機能は、リソースグループと同様です。
ユーザーグループを作成し、RAM ユーザーをユーザーグループに追加します。
RAM コンソール で、UserGroup1 という名前のユーザーグループを作成します。詳細については、「RAM ユーザーグループを作成する」をご参照ください。ユーザーグループを作成したら、バケット内のデータにアクセスする必要があるすべての RAM ユーザーをユーザーグループに追加します。詳細については、「RAM ユーザーを RAM ユーザーグループに追加する」をご参照ください。
リソースグループを作成します。
リソース管理コンソール にログインします。
左側のナビゲーションウィンドウで、[リソースグループ] > [リソースグループ] を選択します。
[リソースグループ] ページで、[リソースグループの作成] をクリックします。
[リソースグループの作成] パネルで、[リソースグループ名] パラメーターと [リソースグループ ID] パラメーターを構成します。この例では、[リソースグループ名] を ResourcegroupA に設定し、[リソースグループ ID] を Group1 に設定します。
[OK] をクリックします。
リソースグループのステータスが [作成中] になります。約 3 秒待って、
アイコンをクリックします。リソースグループのステータスが [利用可能] になったら、ResourcegroupA が作成されます。上記の手順を繰り返して、ResourcegroupB という名前のリソースグループを作成します。
バケットのリソースグループを選択します。
OSS コンソール にログインします。
バケットリスト をクリックし、examplebucket1 バケットをクリックします。
バケットの設定 > リソースグループ を選択します。
[リソースグループ] ページで、設定 をクリックします。
リソースグループ に ResourcegroupA を選択し、設定 をクリックします。
上記の手順を繰り返して、すべての従業員に読み取りのみを許可するバケットに ResourcegroupA を選択し、すべての従業員に読み取りと書き込みを許可するバケットに ResourcegroupB を選択します。
リソースグループにアクセスするために必要な権限を構成します。
リソース管理コンソールにログオンします。左側のナビゲーションウィンドウで、[リソースグループ] > [リソースグループ] を選択します。
リストからリソースグループを見つけ、[操作] 列の [権限の管理] をクリックします。
[権限] タブで、[権限の付与] をクリックします。
[権限の付与] パネルで、パラメーターを構成します。次の表にパラメーターを示します。
パラメーター
説明
承認範囲
[特定のリソースグループ] を選択します。次に、ドロップダウンリストから ResourcegroupA を選択します。
プリンシパル
UserGroup1 と入力します。
ポリシーの選択
[システムポリシー] を選択します。[権限ポリシー名] 列で、
AliyunOSSReadOnlyAccessをクリックして、UserGroup1 内の RAM ユーザーに ResourcegroupA 内のバケットのオブジェクトを読み取るだけの権限を付与します。[OK] をクリックします。
[完了] をクリックします。
上記の手順を繰り返して、
AliyunOSSFullAccessポリシーを UserGroup1 内の RAM ユーザーにアタッチし、RAM ユーザーに ResourcegroupB 内のバケットのオブジェクトの読み取りと書き込みを許可します。
OSS SDK を使用する
リソースグループの構成に使用できる OSS SDK は、Java、Python、Go のみです。詳細については、「概要」をご参照ください。
import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.SetBucketResourceGroupRequest;
public class Demo {
public static void main(String[] args) throws Throwable {
// この例では、中国 (杭州) リージョンのエンドポイントを使用しています。実際のエンドポイントを指定してください。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID 環境変数と OSS_ACCESS_KEY_SECRET 環境変数が構成されていることを確認してください。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// バケットの名前を指定します。例: examplebucket。
String bucketName = "examplebucket";
// リソースグループの ID を指定します。リソースグループ ID を指定しない場合、バケットはデフォルトのリソースグループに属します。
String rgId = "rg-aekz****";
// バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを 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);
// バケットが属するリソースグループを構成します。
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", "", "バケットが配置されているリージョン。")
flag.StringVar(&bucketName, "bucket", "", "バケットの名前。")
}
func main() {
// コマンドラインパラメーターを解析します。
flag.Parse()
// リソースグループの ID を指定します。リソースグループ ID を指定しない場合、バケットはデフォルトのリソースグループに属します。
var groupId string = "rg-aekz****"
// バケット名が空かどうかを確認します。
if len(bucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("無効なパラメーター、バケット名が必要です")
}
// リージョンが空かどうかを確認します。
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("無効なパラメーター、リージョンが必要です")
}
// デフォルトの構成を読み込み、認証情報プロバイダーとリージョンを指定します。
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
// OSSClient インスタンスを作成します。
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("バケットリソースグループの設定に失敗しました %v", err)
}
// リクエストの結果を表示します。
log.Printf("バケットリソースグループの設定結果:%#v\n", result)
}
import argparse
import alibabacloud_oss_v2 as oss
# コマンドライン引数パーサーを作成し、スクリプトの目的 (バケットのリソースグループを構成する) について説明します。
parser = argparse.ArgumentParser(description="バケットリソースグループのサンプルを設定する")
# コマンドライン引数を定義します。必須パラメーター (リージョンとバケット名) とオプションパラメーター (エンドポイントとリソースグループ ID) を含めます。
parser.add_argument('--region', help='バケットが配置されているリージョン。', required=True)
parser.add_argument('--bucket', help='バケットの名前。', required=True)
parser.add_argument('--endpoint', help='他のサービスが OSS にアクセスするために使用できるドメイン名')
parser.add_argument('--resource_group_id',
help='バケットが属するリソースグループの ID。(オプション、デフォルトは空の文字列)',
default='')
def main():
# コマンドライン引数を解析して、入力された値を取得します。
args = parser.parse_args()
# 認証のために環境変数からアクセス認証情報を読み込みます。
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
# デフォルトの構成を使用して cfg オブジェクトを作成し、認証情報プロバイダーを指定します。
cfg = oss.config.load_default()
cfg.credentials_provider = credentials_provider
# cfg オブジェクトの region 属性を、コマンドラインで指定されたリージョンに設定します。
cfg.region = args.region
# カスタムエンドポイントが指定されている場合は、cfg オブジェクトの endpoint 属性を指定されたエンドポイントで更新します。
if args.endpoint is not None:
cfg.endpoint = args.endpoint
# 前述の設定を使用して、OSSClient インスタンスを初期化します。
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。
),
))
# 操作の HTTP ステータスコードとリクエスト ID を表示して、リクエストステータスを確認します。
print(f'status code: {result.status_code},'
f' request id: {result.request_id},'
)
# スクリプトが直接実行されたときに main 関数を呼び出して、処理ロジックを開始します。
if __name__ == "__main__":
main() # スクリプトのエントリポイント。制御フローはここから開始されます。ossutil を使用する
ossutil を使用してリソースグループを構成できます。インストールについては、「ossutil のインストール」をご参照ください。
次のコマンドを実行して、ID が rg-123 の examplebucket のリソースグループを構成します。
ossutil api put-bucket-resource-group --bucket examplebucket --resource-group-configuration "{\"ResourceGroupId\":\"rg-123\"}"このコマンドの詳細については、「put-bucket-resource-group」をご参照ください。
関連 API 操作
上記で説明した方法は、基本的に RESTful API に基づいて実装されており、ビジネスで高度なカスタマイズが必要な場合は、RESTful API を直接呼び出すことができます。API を直接呼び出すには、コードに署名計算を含める必要があります。詳細については、「PutBucketResourceGroup」をご参照ください。