企業 A の Alibaba Cloud アカウントで Resource Access Management (RAM) ロールを作成し、そのロールに権限を付与し、企業 B の Alibaba Cloud アカウントまたは RAM ユーザーがそのロールを引き受けられるように設定します。これにより、企業 B のユーザーは企業 A の Alibaba Cloud リソースにアクセスできるようになります。
背景情報
企業 A は Message Queue for Apache RocketMQ を使用しており、特定の運用タスクを企業 B に委任したいと考えています。
要件:
企業 A はリソースの所有者であり続けながら、リソースのクエリやモニタリングなどコンソールでのタスクを企業 B に委任したいと考えています。
企業 A は、企業 B の従業員の入退社に伴う権限管理を避けたいと考えています。企業 B は、自社のどの RAM ユーザー (従業員またはアプリケーション) が企業 A のリソースにアクセスできるかを制御し、その具体的な権限を定義できる必要があります。
企業 A は、契約終了時など、いつでも企業 B のアクセスを取り消すことができる必要があります。
ソリューション
これらの要件を満たすために、企業 A は企業 B の従業員に Message Queue for Apache RocketMQ リソースへのアクセス権限を付与します。企業 A と企業 B がそれぞれ Alibaba Cloud アカウントを所有していると仮定します。このガイドでは、クロスアカウントアクセスを設定する手順を概説します。
企業 A のアカウントで RAM ロールを作成し、必要なポリシーをアタッチし、企業 B のアカウントの RAM ユーザーがそのロールを引き受けることを許可する信頼ポリシーを設定します。
RAM ロールを設定した後、企業 B のアカウントの RAM ユーザーは、そのロールを引き受けて一時的な権限を取得できます。その後、次のいずれかの方法で企業 A のアカウントのリソースにアクセスできます。
SDK の使用
コンソールの使用
API 呼び出しの使用
手順 1:RAM ロールの作成と認可
企業 A の Alibaba Cloud アカウントを使用して、RAM コンソールにログインし、企業 B の Alibaba Cloud アカウント用の RAM ロールを作成します。
詳細については、「信頼できる Alibaba Cloud アカウントの RAM ロールの作成」をご参照ください。
オプション: 企業 A のアカウントで、RAM ロール用のカスタムポリシーを作成します。
詳細については、「カスタムポリシーの作成」をご参照ください。
現在、Message Queue for Apache RocketMQ は、インスタンスレベル、トピックレベル、およびグループレベルの権限をサポートしています。詳細については、「Message Queue for Apache RocketMQ のカスタムポリシー」をご参照ください。
デフォルトでは、新しい RAM ロールには権限がありません。企業 A は、システムポリシーまたはカスタムポリシーをアタッチして、ロールに権限を付与する必要があります。
詳細については、「RAM ロールへの権限付与」をご参照ください。
企業 B の Alibaba Cloud アカウントを使用して、RAM コンソールにログインし、RAM ユーザーを作成します。
詳細については、「RAM ユーザーの作成」をご参照ください。
企業 B のアカウントで、RAM ユーザーに AliyunSTSAssumeRoleAccess 権限を付与します。
詳細については、「RAM ユーザーへの権限付与」をご参照ください。
企業 B のアカウントの RAM ユーザーに
AliyunSTSAssumeRoleAccess権限を付与する必要があります。これにより、そのユーザーは企業 A のアカウントで作成された RAM ロールを引き受けることができます。
手順 2:アカウント間のリソースアクセス
SDK を使用したリソースアクセス
企業 B のアカウントの RAM ユーザーは、SDK を使用して企業 A のアカウントの Message Queue for Apache RocketMQ リソースにアクセスできます。次の 2 つの設定方法のいずれかを選択してください。
STS トークンの設定:この方法では、RAM ユーザーの AccessKey ID、AccessKey シークレット、および Security Token Service (STS) からの一時的なセキュリティトークンを提供する必要があります。一時的なセキュリティトークンは有効期限が切れるため、更新する必要があります。一時的なセキュリティトークンの取得方法の詳細については、「AssumeRole」をご参照ください。
重要STS トークン方式は、Message Queue for Apache RocketMQ 1.7.8.Final 以降の Java SDK でのみサポートされています。
AccessKey ID と AccessKey シークレットを取得するには、「AccessKey ペアの作成」をご参照ください。
例:STS トークン設定
Message Queue for Apache RocketMQ のクライアントを初期化する際に、取得した AccessKey ID、AccessKey シークレット、および一時的なセキュリティトークンを次のプロパティで指定してください。
Properties properties = new Properties(); // ALIBABA_CLOUD_ACCESS_KEY_ID、ALIBABA_CLOUD_ACCESS_KEY_SECRET、および ALIBABA_CLOUD_SECURITY_TOKEN の環境変数が設定されていることを確認してください。 // STS から取得した AccessKey ID。 properties.put(PropertyKeyConst.AccessKey, System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")); // STS から取得した AccessKey シークレット。 properties.put(PropertyKeyConst.SecretKey, System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")); // 一時的なセキュリティトークン。 properties.put(PropertyKeyConst.SecurityToken, System.getenv("ALIBABA_CLOUD_SECURITY_TOKEN")); // その他のプロパティ。 properties.put(PropertyKeyConst.NAMESRV_ADDR, "XXX"); ...... Producer client = ONSFactory.createProducer(properties); client.start();一時的なセキュリティトークンの有効期限が切れたら、
updateCredentialメソッドを呼び出して更新してください。Properties properties = new Properties(); // ALIBABA_CLOUD_ACCESS_KEY_ID、ALIBABA_CLOUD_ACCESS_KEY_SECRET、および ALIBABA_CLOUD_SECURITY_TOKEN の環境変数が設定されていることを確認してください。 // STS から取得した AccessKey ID。 properties.put(PropertyKeyConst.AccessKey, System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")); // STS から取得した AccessKey シークレット。 properties.put(PropertyKeyConst.SecretKey, System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")); // 一時的なセキュリティトークン。 properties.put(PropertyKeyConst.SecurityToken, System.getenv("ALIBABA_CLOUD_SECURITY_TOKEN")); client.updateCredential(properties);
ECS インスタンス RAM ロールの設定:アプリケーションが Elastic Compute Service (ECS) インスタンスで実行されている場合は、この方法を使用できます。この方法では、SDK に認証情報をハードコーディングする必要がありません。代わりに、RAM ロール名のみを指定します。ただし、まずこの RAM ロールをアプリケーションの ECS インスタンスにアタッチする必要があります。詳細については、「インスタンス RAM ロールのアタッチ」をご参照ください。
重要ECS インスタンス RAM ロール方式は、Message Queue for Apache RocketMQ 1.8.7.3.Final 以降の Java SDK でのみサポートされています。
例:ECS インスタンス RAM ロール設定
Properties properties = new Properties(); // 作成して ECS インスタンスにアタッチした RAM ロールの名前。 properties.put(PropertyKeyConst.RAM_ROLE_NAME,"XXX");
コンソールからのリソースアクセス
企業 B のアカウントの RAM ユーザーは、次の手順に従って、コンソールから企業 A の Message Queue for Apache RocketMQ リソースにアクセスできます。
ブラウザーで RAM ユーザーログインページを開きます。
[RAM ユーザーログイン] ページで、RAM ユーザーのログイン名を入力し、[次へ] をクリックしてパスワードを入力し、[ログイン] をクリックします。
説明ログイン名は
<$username>@<$AccountAlias>または<$username>@<$AccountAlias>.onaliyun.comの形式です。<$AccountAlias>は Alibaba Cloud アカウントのエイリアスです。エイリアスが設定されていない場合は、デフォルトで Alibaba Cloud アカウントの ID が使用されます。Alibaba Cloud コンソールにログインした後、右上のプロフィール画像にカーソルを合わせ、[ID の切り替え] をクリックします。
[ロールの切り替え] ページで、企業 A のアカウントの [エンタープライズエイリアス]、Default Domain、または [アカウント UID] を入力します。次に、[ロール名] を入力し、[送信] をクリックします。
これで、企業 A のアカウントで Message Queue for Apache RocketMQ リソースを管理できるようになります。
API 呼び出しを使用したリソースアクセス
企業 B のアカウントの RAM ユーザーは、Message Queue for Apache RocketMQ への API 呼び出しを行うことで、企業 A のアカウントのリソースにアクセスできます。API 呼び出しの方法の詳細については、「API リクエストの作成」をご参照ください。