RAM ロールを引き受けることで、アカウント間で範囲を限定した一時的な ECS リソースへのアクセスを付与します。
ユースケース
貴社が Elastic Compute Service (ECS) 上で E コマースサイトを運営しているとします。 IT 部門が日々の運用保守を行いますが、特定のメンテナンス作業のために外部パートナーがアクセスする必要がある場合もあります。 Alibaba Cloud アカウントや RAM ユーザーなどの長期的な認証情報を共有する代わりに、RAM ロールを使用して、範囲を限定した一時的なアクセスを許可できます。
次の図は、RAM ロールを使用したクロスアカウントアクセスを示しています。
アカウント A:貴社の Alibaba Cloud アカウント。
アカウント B:外部パートナーの Alibaba Cloud アcount。
-
アカウント A は RAM ロールを作成し、アカウント B がそのロールを引き受けることを許可します。
-
アカウント B は RAM ユーザーを作成し、そのユーザーにロールを引き受ける権限を付与します。
-
アカウント B の RAM ユーザーがアカウント A の RAM ロールを引き受け、アカウント A のリソースを管理します。
操作手順
アカウント A での RAM ロールの作成と権限の付与
1. RAM ロールの作成
アカウント A を使用してRAM コンソールにログオンします。信頼できるエンティティを Alibaba Cloud アカウントに設定し、RAM ロールを作成します。[プリンシパル名] で [その他のアカウント] を選択し、アカウント B の UID を入力します。詳細については、「Alibaba Cloud アカウントの RAM ロールを作成する」をご参照ください。
2. RAM ロールへの権限の付与
インスタンス情報を表示し、Workbench を使用して ECS インスタンスにログインすることを許可するポリシーを作成し、それを RAM ロールにアタッチします。 詳細については、「カスタムポリシーの作成」をご参照ください。
アカウント B での RAM ユーザーの作成と権限の付与
1. RAM ユーザーの作成
アカウント B を使用してRAM コンソールにログインします。 RAM ユーザーを作成し、[コンソールアクセス] と [永続的な AccessKey を使用したアクセス] を選択します。 詳細については、「RAM ユーザーの作成」をご参照ください。
2. RAM ユーザーへの権限の付与
アカウント B の RAM ユーザーに AliyunSTSAssumeRoleAccess ポリシーをアタッチします。 このポリシーにより、RAM ユーザーはすべての RAM ロールを引き受けることができます。 詳細については、「RAM ユーザーへの権限付与」をご参照ください。
ユーザーが引き受けられるロールを特定のロールに制限するには、「RAM ユーザーが引き受け可能な RAM ロールを指定できますか。」をご参照ください。
RAM ロールの引き受け
コンソール
-
アカウント B の RAM ユーザーで RAM ユーザーログインページ にログインします。
-
右上隅のプロフィール画像にカーソルを合わせ、[ID の切り替え] をクリックします。
-
[ロールの切り替え] ページで、アカウント A の UID と RAM ロール名を入力し、送信 をクリックします。
-
アクセス権限を確認します。
ECS コンソール にログインし、ECS インスタンス情報を表示できることを確認します。
確認 1:RAM ユーザーは ECS インスタンス情報を表示でき、Workbench を使用してインスタンスにログインできます。
確認 2:アカウント A が権限を取り消した後、RAM ユーザーはアカウント A の ECS インスタンス情報を表示できなくなります。
API
プログラムでアカウント A のリソースにアクセスすることもできます:
-
システムの環境変数に、アカウント B の RAM ユーザーを作成したときに取得したアクセスキーを設定します。 この方法はオペレーティングシステムによって異なります。 詳細については、「Linux、macOS、および Windows で環境変数を設定する」をご参照ください。
-
アカウント B の RAM ユーザーで
AssumeRoleAPI を呼び出します。 アカウント A の RAM ロールの ARN を渡して、一時的な STS トークンを取得します。 -
STS トークンを使用して、ターゲットの Alibaba Cloud サービスの API を呼び出し、アカウント A のリソースにアクセスします。
Java サンプルコード
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>ecs20140526</artifactId>
<version>5.4.4</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>sts20150401</artifactId>
<version>1.1.4</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>credentials-java</artifactId>
<version>0.3.10</version>
</dependency>
import com.aliyun.ecs20140526.models.DescribeInstancesRequest;
import com.aliyun.ecs20140526.models.DescribeInstancesResponse;
import com.aliyun.sts20150401.Client;
import com.aliyun.sts20150401.models.AssumeRoleRequest;
import com.aliyun.sts20150401.models.AssumeRoleResponse;
import com.aliyun.sts20150401.models.AssumeRoleResponseBody;
import com.aliyun.teaopenapi.models.Config;
import com.aliyun.teautil.models.RuntimeOptions;
import com.google.gson.Gson;
/**
* RAM ロールを引き受けて一時的な認証情報を取得し、その認証情報を使用して ECS リソースにアクセスします。
*/
public class Sample {
public static void main(String[] args) {
// これはデモンストレーションのみを目的としています。 実際のビジネスニーズに基づいて、リージョン固有のエンドポイントを選択してください。
String stsEndpoint = "sts.cn-shanghai.aliyuncs.com";
String ecsEndpoint = "ecs.cn-shanghai.aliyuncs.com";
// cn-shanghai の ECS インスタンスの情報を照会します。
String regionId = "cn-shanghai";
// 引き受ける RAM ロールの ARN。
String ramRoleArn = "acs:ram::14************16:role/cooperativepartnerrole";
// アカウント B の RAM ユーザーを使用してアカウント A の RAM ロールを引き受け、一時的な認証情報を取得します。
AssumeRoleResponse assumeRoleResponse = playRamRole(stsEndpoint, ramRoleArn);
// Alibaba Cloud サービスが提供する API を呼び出して、アカウント A のクラウドリソースを参照します。
accessResources(assumeRoleResponse, ecsEndpoint, regionId);
}
/**
* 一時的な認証情報を使用してクラウドリソースにアクセスします。
*
* @param assumeRoleResponse 一時的な認証情報を含むレスポンスオブジェクト。
*/
private static void accessResources(AssumeRoleResponse assumeRoleResponse, String ecsEndpoint, String regionId) {
try {
// 一時的な認証情報を抽出します。
AssumeRoleResponseBody.AssumeRoleResponseBodyCredentials assumeRoleResponseBodyCredentials = assumeRoleResponse.body.credentials;
com.aliyun.credentials.models.Config credentialsConfig = new com.aliyun.credentials.models.Config()
.setType("sts") // 認証情報のタイプ。
.setAccessKeyId(assumeRoleResponseBodyCredentials.accessKeyId)
.setAccessKeySecret(assumeRoleResponseBodyCredentials.accessKeySecret)
.setSecurityToken(assumeRoleResponseBodyCredentials.securityToken);
com.aliyun.credentials.Client credentialClient = new com.aliyun.credentials.Client(credentialsConfig);
// ECS クライアントを作成します。
Config ecsConfig = new Config()
.setEndpoint(ecsEndpoint)
.setCredential(credentialClient);
com.aliyun.ecs20140526.Client ecsClient = new com.aliyun.ecs20140526.Client(ecsConfig);
DescribeInstancesRequest describeInstancesRequest = new DescribeInstancesRequest()
.setRegionId(regionId);
RuntimeOptions runtimeOptions = new RuntimeOptions();
// DescribeInstances API を呼び出してレスポンスを取得します。
DescribeInstancesResponse response = ecsClient.describeInstancesWithOptions(describeInstancesRequest, runtimeOptions);
// レスポンスを出力します。
System.out.println(new Gson().toJson(response.body));
} catch (Exception e) {
throw new RuntimeException("AccessResources に失敗しました: " + e.getMessage());
}
}
/**
* RAM ロールを引き受けて一時的な認証情報を取得します。
*
* @return 一時的な認証情報を含むレスポンスオブジェクト。
*/
private static AssumeRoleResponse playRamRole(String stsEndpoint, String ramRoleArn) {
try {
// Client オブジェクトを作成し、assumeRole 操作を呼び出して STS トークンを取得します。
Config config = new Config()
// System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID") は環境変数からアクセスキー ID の値を取得します。
.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
// System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET") は環境変数からアクセスキーシークレットの値を取得します。
.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
config.endpoint = stsEndpoint;
Client client = new Client(config);
// AssumeRoleRequest オブジェクトを作成し、引き受ける RAM ロールの ARN とロールセッション名を指定します。
AssumeRoleRequest assumeRoleRequest = new AssumeRoleRequest()
.setRoleArn(ramRoleArn)
.setRoleSessionName("CooperativePartner");
RuntimeOptions runtime = new RuntimeOptions();
return client.assumeRoleWithOptions(assumeRoleRequest, runtime);
} catch (Exception e) {
throw new RuntimeException("RAM ロールの引き受けに失敗しました: " + e.getMessage());
}
}
}
結果:このプログラムは、アカウント A の中国 (上海) リージョンにある ECS リソースのリストを返します。
{
"instances":{
"instance":[
{
"creationTime":"2024-10-23T09:12Z",
"expiredTime":"2099-12-31T15:59Z",
"hostName":"iZ********************pZ",
"imageId":"m-uf****************jf",
"instanceChargeType":"PostPaid",
"instanceId":"i-uf****************ap",
"instanceName":"launch-advisor-20241023-c6",
"instanceNetworkType":"vpc",
"instanceType":"ecs.c6.xlarge",
...
// 一部のパラメーターは省略されています。
...
"vpcAttributes":{
"natIpAddress":"",
"privateIpAddress":{
"ipAddress":[
"17*.**.**.*15"
]
},
"vSwitchId":"vsw-uf*****************tk",
"vpcId":"vpc-uf*****************kr"
},
"zoneId":"cn-shanghai-b"
}
]
},
"nextToken":"",
"pageNumber":1,
"pageSize":10,
"requestId":"C1468F7E********************7A3A712",
"totalCount":1
}
関連ドキュメント
-
RAM は、ユーザー ID とリソースのアクセス権限を管理します。 詳細については、「RAM とは」をご参照ください。
-
「RAM ロールの引き受け」をご参照ください。
-
「ロールベースの SSO」をご参照ください。