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

Elastic Compute Service:RAM ロールを使用した ECS アクセスの制御

最終更新日:May 16, 2026

RAM ロールを引き受けることで、アカウント間で範囲を限定した一時的な ECS リソースへのアクセスを付与します。

ユースケース

貴社が Elastic Compute Service (ECS) 上で E コマースサイトを運営しているとします。 IT 部門が日々の運用保守を行いますが、特定のメンテナンス作業のために外部パートナーがアクセスする必要がある場合もあります。 Alibaba Cloud アカウントや RAM ユーザーなどの長期的な認証情報を共有する代わりに、RAM ロールを使用して、範囲を限定した一時的なアクセスを許可できます。

次の図は、RAM ロールを使用したクロスアカウントアクセスを示しています。

image

アカウント A:貴社の Alibaba Cloud アカウント。

アカウント B:外部パートナーの Alibaba Cloud アcount。

  1. アカウント A は RAM ロールを作成し、アカウント B がそのロールを引き受けることを許可します。

  2. アカウント B は RAM ユーザーを作成し、そのユーザーにロールを引き受ける権限を付与します。

  3. アカウント B の RAM ユーザーがアカウント A の RAM ロールを引き受け、アカウント A のリソースを管理します。

操作手順

アカウント A での RAM ロールの作成と権限の付与

1. RAM ロールの作成

アカウント A を使用してRAM コンソールにログオンします。信頼できるエンティティを Alibaba Cloud アカウントに設定し、RAM ロールを作成します。[プリンシパル名][その他のアカウント] を選択し、アカウント B の UID を入力します。詳細については、「Alibaba Cloud アカウントの RAM ロールを作成する」をご参照ください。

2. RAM ロールへの権限の付与

インスタンス情報を表示し、Workbench を使用して ECS インスタンスにログインすることを許可するポリシーを作成し、それを RAM ロールにアタッチします。 詳細については、「カスタムポリシーの作成」をご参照ください。

ロール引き受けのための一時的なアクセスポリシー

このポリシーは、ECS インスタンス情報を表示し、Workbench を使用してインスタンスにログインする権限を付与します。

{
    "Version": "1",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ecs:List*",
                "ecs:Describe*",
                "ecs-workbench:LoginInstance"
            ],
            "Resource": "*"
        }
    ]
}

アカウント B での RAM ユーザーの作成と権限の付与

1. RAM ユーザーの作成

アカウント B を使用してRAM コンソールにログインします。 RAM ユーザーを作成し、[コンソールアクセス][永続的な AccessKey を使用したアクセス] を選択します。 詳細については、「RAM ユーザーの作成」をご参照ください。

2. RAM ユーザーへの権限の付与

アカウント B の RAM ユーザーに AliyunSTSAssumeRoleAccess ポリシーをアタッチします。 このポリシーにより、RAM ユーザーはすべての RAM ロールを引き受けることができます。 詳細については、「RAM ユーザーへの権限付与」をご参照ください。

ユーザーが引き受けられるロールを特定のロールに制限するには、「RAM ユーザーが引き受け可能な RAM ロールを指定できますか。」をご参照ください。

RAM ロールの引き受け

コンソール

  1. アカウント B の RAM ユーザーで RAM ユーザーログインページ にログインします。

  2. 右上隅のプロフィール画像にカーソルを合わせ、[ID の切り替え] をクリックします。

  3. [ロールの切り替え] ページで、アカウント A の UID と RAM ロール名を入力し、送信 をクリックします。

  4. アクセス権限を確認します。

    ECS コンソール にログインし、ECS インスタンス情報を表示できることを確認します。

    確認 1:RAM ユーザーは ECS インスタンス情報を表示でき、Workbench を使用してインスタンスにログインできます。

    確認 2:アカウント A が権限を取り消した後、RAM ユーザーはアカウント A の ECS インスタンス情報を表示できなくなります。

API

プログラムでアカウント A のリソースにアクセスすることもできます:

  1. システムの環境変数に、アカウント B の RAM ユーザーを作成したときに取得したアクセスキーを設定します。 この方法はオペレーティングシステムによって異なります。 詳細については、「Linux、macOS、および Windows で環境変数を設定する」をご参照ください。

  2. アカウント B の RAM ユーザーで AssumeRole API を呼び出します。 アカウント A の RAM ロールの ARN を渡して、一時的な STS トークンを取得します。

  3. 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
}

関連ドキュメント