すべてのプロダクト
Search
ドキュメントセンター

Object Storage Service:リソースグループを使用して複数のバケットに同じ権限を付与する

最終更新日:May 24, 2025

リソースグループは、リソースベースのアクセス制御方式です。同じ権限を付与するバケットを同じリソースグループに追加し、そのリソースグループに権限を付与できます。これにより、権限付与の効率が向上します。

背景情報

企業ユーザーは、異なるプロジェクト、子会社、部門のリソースを分離するために、複数の Alibaba Cloud アカウントを作成することがあります。ただし、これにより、企業ユーザーは、これらの Alibaba Cloud アカウントにあるリソースを一元的に管理、監視、監査することが困難になります。

account

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

rg

注意事項

  • 1 つのリソースグループには、異なるリージョンのバケットを含めることができます。1 つのバケットは、1 つのリソースグループにのみ所属できます。

  • バケットは、同じ所有者によって作成されたリソースグループ間でのみ転送できます。

方法

OSS コンソールを使用する

次の例では、会社のさまざまな部門のテストデータが 20 個のバケットに保存されています。従業員全員に 10 個のバケットに保存されているデータの書き込みと読み取りを許可し、他の 10 個のバケットに保存されているデータの読み取りのみを許可します。リソースグループを使用しない場合は、各バケットに必要な権限を個別に構成する必要があります。リソースグループを使用する場合は、同じ権限を必要とするバケットをリソースグループに追加し、リソースグループに必要な権限を構成できます。

また、複数の RAM ユーザー (従業員) に同じ権限を付与するには、ユーザーグループを作成する必要があります。ユーザーグループの機能は、リソースグループと同様です。

  1. ユーザーグループを作成し、RAM ユーザーをユーザーグループに追加します。

    RAM コンソール で、UserGroup1 という名前のユーザーグループを作成します。詳細については、「RAM ユーザーグループを作成する」をご参照ください。ユーザーグループを作成したら、バケット内のデータにアクセスする必要があるすべての RAM ユーザーをユーザーグループに追加します。詳細については、「RAM ユーザーを RAM ユーザーグループに追加する」をご参照ください。

  2. リソースグループを作成します。

    1. リソース管理コンソール にログインします。

    2. 左側のナビゲーションウィンドウで、[リソースグループ] > [リソースグループ] を選択します。

    3. [リソースグループ] ページで、[リソースグループの作成] をクリックします。

    4. [リソースグループの作成] パネルで、[リソースグループ名] パラメーターと [リソースグループ ID] パラメーターを構成します。この例では、[リソースグループ名]ResourcegroupA に設定し、[リソースグループ ID]Group1 に設定します。

    5. [OK] をクリックします。

      リソースグループのステータスが [作成中] になります。約 3 秒待って、资源组_刷新列表 アイコンをクリックします。リソースグループのステータスが [利用可能] になったら、ResourcegroupA が作成されます。

    6. 上記の手順を繰り返して、ResourcegroupB という名前のリソースグループを作成します。

  3. バケットのリソースグループを選択します。

    1. OSS コンソール にログインします。

    2. バケットリスト をクリックし、examplebucket1 バケットをクリックします。

    3. バケットの設定 > リソースグループ を選択します。

    4. [リソースグループ] ページで、設定 をクリックします。

    5. リソースグループ に ResourcegroupA を選択し、設定 をクリックします。

    6. 上記の手順を繰り返して、すべての従業員に読み取りのみを許可するバケットに ResourcegroupA を選択し、すべての従業員に読み取りと書き込みを許可するバケットに ResourcegroupB を選択します。

  4. リソースグループにアクセスするために必要な権限を構成します。

    1. リソース管理コンソールにログオンします。左側のナビゲーションウィンドウで、[リソースグループ] > [リソースグループ] を選択します。

    2. リストからリソースグループを見つけ、[操作] 列の [権限の管理] をクリックします。

    3. [権限] タブで、[権限の付与] をクリックします。

    4. [権限の付与] パネルで、パラメーターを構成します。次の表にパラメーターを示します。

      パラメーター

      説明

      承認範囲

      [特定のリソースグループ] を選択します。次に、ドロップダウンリストから ResourcegroupA を選択します。

      プリンシパル

      UserGroup1 と入力します。

      ポリシーの選択

      [システムポリシー] を選択します。[権限ポリシー名] 列で、AliyunOSSReadOnlyAccess をクリックして、UserGroup1 内の RAM ユーザーに ResourcegroupA 内のバケットのオブジェクトを読み取るだけの権限を付与します。

    5. [OK] をクリックします。

    6. [完了] をクリックします。

    7. 上記の手順を繰り返して、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(&region, "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-123examplebucket のリソースグループを構成します。

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」をご参照ください。