RAM ロールを引き受けることにより、アカウント間でスコープが限定された一時的なアクセス権を Elastic Compute Service (ECS) リソースに付与できます。
ユースケース
貴社が ECS 上で e コマースサイトを運営しているとします。IT 部門が日々の運用保守を担当しますが、特定のメンテナンス作業のために外部パートナーがアクセスする必要がある場合もあります。Alibaba Cloud アカウントや RAM ユーザーなどの長期的な認証情報を共有する代わりに、RAM ロールを使用して、スコープが限定された一時的なアクセス権を付与できます。
次の図は、RAM ロールを使用したクロスアカウントアクセスを示しています。
アカウント A:貴社の Alibaba Cloud アカウント。
アカウント B:外部パートナーの Alibaba Cloud アカウント。
アカウント 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 ロールへの権限の付与
インスタンス情報を表示し、ワークベンチで ECS インスタンスにログインすることを許可するポリシーを作成し、それを RAM ロールにアタッチします。詳細については、「カスタムポリシーの作成」をご参照ください。
アカウント B での RAM ユーザーの作成と権限の付与
1. RAM ユーザーの作成
アカウント B で RAM コンソールにログインして RAM ユーザーを作成し、[コンソールアクセス] と [永続的な AccessKey によるアクセス] を選択します。「RAM ユーザーの作成」をご参照ください。
2. RAM ユーザーへの権限の付与
アカウント B の RAM ユーザーに AliyunSTSAssumeRoleAccess ポリシーをアタッチします。 このポリシーにより、RAM ユーザーはすべての RAM ロールを引き受けることができます。 「RAM ユーザーに権限を付与する」をご参照ください。
ユーザーが引き受けられる RAM ロールを特定のロールに制限する方法については、「RAM ユーザーが引き受けられる RAM ロールを指定できますか。」をご参照ください。
RAM ロールの引き受け
コンソール
アカウント B の RAM ユーザーでRAM ユーザーのログインページにログインします。
右上隅のプロフィール画像にカーソルを合わせ、[ID を切り替える] をクリックします。
[ロールの切り替え] ページで、アカウント A の UID と RAM ロール名を入力し、送信 をクリックします。
アクセス権限を確認します。
ECS コンソールにログインし、ECS インスタンス情報を表示できることを確認します。
検証 1:RAM ユーザーが ECS インスタンス情報を表示し、ワークベンチでインスタンスにログインできることを確認します。
検証 2:アカウント A が権限を取り消した後、RAM ユーザーはアカウント A の ECS インスタンス情報を表示できなくなることを確認します。
API
プログラムでアカウント A のリソースにアクセスすることもできます。
アカウント B の RAM ユーザーの作成時に取得した AccessKey をシステムの環境変数に設定します。設定方法はオペレーティングシステムによって異なります。詳細については、「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 failed: " + e.getMessage());
}
}
/**
* RAM ロールを引き受けて一時的なアクセス認証情報を取得します。
*
* @return 一時的なアクセス認証情報を含むレスポンスオブジェクト。
*/
private static AssumeRoleResponse playRamRole(String stsEndpoint, String ramRoleArn) {
try {
// StsClient オブジェクトを作成し、assumeRole 操作を呼び出して STS トークンを取得します。
Config config = new Config()
// System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID") は、環境変数から AccessKey ID の値を取得します。
.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
// System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET") は、環境変数から AccessKey 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("play RAM role failed: " + 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」をご参照ください。