全部產品
Search
文件中心

Elastic Compute Service:執行個體RAM角色

更新時間:Apr 29, 2026

使用執行個體RAM角色可以在ECS執行個體內部無需配置AccessKey即可擷取STS臨時憑證(STS Token),從而調用其他雲產品的API。

功能優勢

  • 安全便捷:無需在ECS上的代碼或設定檔中儲存AccessKey,通過執行個體中繼資料服務(Instance Metadata Service, IMDS)即可自動擷取STS臨時憑證調用API,從而降低AccessKey泄露的風險。

  • 無縫切換:如需更換應用程式的RAM身份,只需在控制台調整授予ECS的RAM角色,無需修改代碼或重啟服務。

  • 許可權精細化:可以為不同的ECS執行個體分配不同的RAM角色,實現最小許可權原則。

操作步驟

若使用RAM使用者執行操作步驟,請確保該使用者擁有 ram:CreateRole(建立角色)、ecs:AttachInstanceRamRole(授予角色)以及 ram:PassRole(傳遞角色)等許可權。更多資訊,請參見如何使用RAM使用者給執行個體授予RAM角色?

步驟一:建立RAM角色

為ECS執行個體建立一個RAM角色,並為其分配許可權。

控制台

  1. 登入RAM控制台,選擇身份管理 > 角色,單擊建立角色,填寫以下參數,單擊確定

    • 信任主體類型:選擇雲端服務

    • 信任主體名稱:選擇雲伺服器ECS / ECS

  2. 建立角色對話方塊,輸入角色名稱,然後單擊確定

    建立成功的RAM角色預設沒有任何許可權,需要為該RAM角色授權。可將系統策略或已建立的自訂權限原則授權給RAM角色,使其擁有相關的資源訪問或操作許可權。具體操作,請參見管理RAM角色的許可權

API

  1. 調用CreateRole介面建立RAM角色。

    信任策略參數(AssumeRolePolicyDocument):

    {
         "Statement": [
           {
               "Action": "sts:AssumeRole",
               "Effect": "Allow",
               "Principal": {
                 "Service": [
                   "ecs.aliyuncs.com"
                 ]
               }
           }
         ],
         "Version": "1"
     }
  2. (可選)調用CreatePolicy介面建立權限原則。如果已有可用權限原則,可跳過該步驟。PolicyDocument(權限原則)需按如下設定:

    {
         "Statement": [
             {
             "Action": [
                 "oss:Get*",
                 "oss:List*"
             ],
             "Effect": "Allow",
             "Resource": "*"
             }
         ],
         "Version": "1"
     }
  3. 調用AttachPolicyToRole介面為執行個體RAM角色授權。

步驟二:為ECS執行個體授予RAM角色

將建立好的角色身份賦予指定的ECS執行個體。

控制台

  1. 訪問ECS控制台-執行個體。在頁面左側頂部,選擇目標資源所在的資源群組和地區。

  2. 單擊目標ECS執行個體ID,在執行個體詳情頁單擊全部操作,選擇實例設定 > 授予/收回RAM角色

  3. 在對話方塊中,操作類型選擇綁定,然後選擇授予ECS執行個體的RAM角色,單擊確定

API

調用AttachInstanceRamRole介面將RAM角色授予ECS執行個體。

步驟三:驗證角色授予是否成功

在整合應用前,確認ECS執行個體已成功擷取角色身份。

控制台

  1. 登入ECS執行個體。

    1. 訪問ECS控制台-執行個體。在頁面左側頂部,選擇目標資源所在的資源群組和地區。

    2. 進入目標執行個體詳情頁,單擊遠端連線,選擇通過Workbench遠端連線。根據頁面提示登入,進入終端頁面。

  2. 查詢執行個體當前被授予的角色名稱。

    該命令返回已授予的角色名稱列表,用於驗證角色是否成功綁定。

    curl http://100.100.100.200/latest/meta-data/ram/security-credentials/
    • 成功:若返回授予的角色名稱,表示角色授予成功。

    • 失敗

      • 返回 404 Not Found:表示執行個體未被授予任何RAM角色。請返回步驟二,檢查授予操作是否成功。

      • 若命令無響應或連線逾時:表示執行個體無法訪問中繼資料服務。請檢查安全性群組和防火牆是否攔截了IP地址100.100.100.200

API

調用DescribeInstanceRamRole介面查詢ECS執行個體被授予RAM角色。

步驟四:在應用程式中整合

在應用程式中,可通過阿里雲Credentials工具配合各語言的雲產品SDK自動擷取STS臨時憑證。STS臨時憑證每15分鐘自動重新整理,Credentials SDK內建重新整理邏輯,應用無需處理到期邏輯。

如果使用加固模式,請確保您使用的SDK版本滿足以下最低要求。

語言

包名/工具

加固模式最低版本

Python

alibabacloud_credentials

0.3.6

Java

credentials-java

0.3.10

Go

github.com/aliyun/credentials-go

1.3.10

Node.js

@alicloud/credentials

2.3.1

.NET

Aliyun.Credentials

1.4.2

PHP

alibabacloud/credentials

1.2.0

阿里雲CLI

aliyun

3.0.248

Python
  1. 安裝Credentials工具。

    若使用加固模式擷取臨時身份憑證,alibabacloud_credentials的版本應不低於0.3.6。
    pip install alibabacloud_credentials
  2. 配置ECS的RAM角色作為訪問憑證。

    from alibabacloud_credentials.client import Client as CredClient
    from alibabacloud_credentials.models import Config as CredConfig
    
    credentialsConfig = CredConfig(
    	type='ecs_ram_role',
    	# 選填,該ECS角色的角色名稱,不填會自動擷取,但是建議加上以減少請求次數,可以通過環境變數ALIBABA_CLOUD_ECS_METADATA設定role_name
    	role_name='ROLE_NAME',
    	# 選填,預設值:False。True:表示強制使用加固模式。False:系統將首先嘗試在加固模式下擷取憑據。如果失敗,則會切換到普通模式進行嘗試(IMDSv1)。
    	disable_imds_v1=True
    )
    credentialsClient = CredClient(credentialsConfig)
    
  3. 以查詢指定 OSS Bucket 中的檔案清單為例,代碼實現如下。

    RAM角色需要授權AliyunOSSReadOnlyAccess權限原則。
    import oss2
    from alibabacloud_credentials.client import Client
    from alibabacloud_credentials.models import Config
    from oss2 import CredentialsProvider
    from oss2.credentials import Credentials
    
    # 1. 定義憑證適配器:將 Credentials 工具擷取的 Token 轉換為 OSS SDK 可用的格式
    class CredentialProviderWrapper(CredentialsProvider):
        def __init__(self, client):
            self.client = client
    
        def get_credentials(self):
            # SDK 自動請求 http://100.100.100.200 擷取臨時憑證
            access_key_id = self.client.get_access_key_id()
            access_key_secret = self.client.get_access_key_secret()
            security_token = self.client.get_security_token()
            return Credentials(access_key_id, access_key_secret, security_token)
    
    def list_objects_using_instance_role(bucket_name, endpoint, role_name):
        # 2. 配置 ECS 執行個體角色模式
        config = Config(
            type='ecs_ram_role',
            role_name=role_name
        )
        cred_client = Client(config)
        
        # 3. 初始化 OSS Bucket
        auth = oss2.ProviderAuth(CredentialProviderWrapper(cred_client))
        bucket = oss2.Bucket(auth, endpoint, bucket_name)
        
        print(f"--- 開始查詢 Bucket: {bucket_name} ---")
        try:
            # 4. 調用 ListObjects 介面
            for i, obj in enumerate(oss2.ObjectIterator(bucket)):
                print(f"檔案 found: {obj.key}")
                if i >= 9: # 僅展示前10個
                    print("... (更多檔案略)")
                    break
            print("--- 查詢成功,執行個體角色許可權正常 ---")
        except Exception as e:
            print(f"查詢失敗: {e}")
    
    if __name__ == "__main__":
        # 配置
        role_name = 'YOUR_ROLE_NAME'           # 替換為你的角色名稱
        bucket_name = 'YOUR_BUCKET_NAME'       # 替換為你的Bucket名
        endpoint = 'YOUR_ENDPOINT' # 替換為對應Endpoint
        
        list_objects_using_instance_role(bucket_name, endpoint, role_name)

Java

  1. 添加credentials依賴。

    若使用加固模式擷取臨時身份憑證,credentials-java的版本不低於0.3.10。
    <!-- https://mvnrepository.com/artifact/com.aliyun/credentials-java -->
    <dependency>
       <groupId>com.aliyun</groupId>
       <artifactId>credentials-java</artifactId>
       <version>0.3.10</version>
    </dependency>
  2. 配置ECS執行個體RAM角色作為訪問憑證。

    import com.aliyun.credentials.Client;
    import com.aliyun.credentials.models.Config;
    
    public class DemoTest {
        public static void main(String[] args) throws Exception {
            Config credentialConfig = new Config();
            credentialConfig.setType("ecs_ram_role");
            // 選填,該ECS角色的角色名稱,不填會自動擷取,但是建議加上以減少請求次數,可以通過環境變數ALIBABA_CLOUD_ECS_METADATA設定RoleName
            credentialConfig.setRoleName("ROLENAME");
            // 選填,預設值:false。true:表示強制使用加固模式。false:系統將首先嘗試在加固模式下擷取憑據。如果失敗,則會切換到普通模式進行嘗試(IMDSv1)。
            credentialConfig.setDisableIMDSv1(true);
            Client credentialClient = new Client(credentialConfig);
        }
    }
  3. 以查詢指定 OSS Bucket 中的檔案清單為例,代碼實現如下。

    RAM角色需要授權AliyunOSSReadOnlyAccess權限原則。
    import com.aliyun.credentials.Client;
    import com.aliyun.credentials.models.Config;
    import com.aliyun.oss.OSS;
    import com.aliyun.oss.OSSClientBuilder;
    import com.aliyun.oss.common.auth.Credentials;
    import com.aliyun.oss.common.auth.CredentialsProvider;
    import com.aliyun.oss.common.auth.DefaultCredentials;
    import com.aliyun.oss.model.OSSObjectSummary;
    import com.aliyun.oss.model.ObjectListing;
    
    // 1. 實現 OSS 的 CredentialsProvider 介面
    class InstanceRoleCredentialProvider implements CredentialsProvider {
        private final Client credClient;
    
        public InstanceRoleCredentialProvider(String roleName) throws Exception {
            Config config = new Config();
            config.setType("ecs_ram_role");
            config.setRoleName(roleName);
            this.credClient = new Client(config);
        }
    
        @Override
        public void setCredentials(Credentials credentials) {}
    
        @Override
        public Credentials getCredentials() {
            // 自動從 ECS 中繼資料服務擷取憑證
            return new DefaultCredentials(
                credClient.getAccessKeyId(),
                credClient.getAccessKeySecret(),
                credClient.getSecurityToken()
            );
        }
    }
    
    public class Demo {
        public static void main(String[] args) throws Exception {
            String roleName = "YOUR_ROLE_NAME";
            String endpoint = "YOUR_ENDPOINT";
            String bucketName = "YOUR_BUCKET_NAME";
    
            // 2. 使用自訂 Provider 初始化 OSS 用戶端
            CredentialsProvider provider = new InstanceRoleCredentialProvider(roleName);
            OSS ossClient = new OSSClientBuilder().build(endpoint, provider);
    
            System.out.println("--- 開始查詢 ---");
            try {
                // 3. 列舉檔案
                ObjectListing objectListing = ossClient.listObjects(bucketName);
                for (OSSObjectSummary objectSummary : objectListing.getObjectSummaries()) {
                    System.out.println("檔案 found: " + objectSummary.getKey());
                }
                System.out.println("--- 成功 ---");
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                ossClient.shutdown();
            }
        }
    }

Go

  1. 安裝Credentials工具。

    若使用加固模式擷取臨時身份憑證,credentials-go的版本不低於1.3.10。
    • 使用go get下載安裝。

      go get -u github.com/aliyun/credentials-go
    • 使用dep來管理依賴包。

      dep ensure -add github.com/aliyun/credentials-go
  2. 配置ECS執行個體RAM角色作為訪問憑證。

    package main
    
    import (
    	"fmt"
    	"github.com/aliyun/credentials-go/credentials"
    )
    
    func _main(args []*string) {
    	credentialsConfig := new(credentials.Config).
    		SetType("ecs_ram_role").
    		// 選填,該ECS角色的角色名稱,不填會自動擷取,但是建議加上以減少請求次數,可以通過環境變數ALIBABA_CLOUD_ECS_METADATA設定RoleName
    		SetRoleName("ROLENAME").
    		// 選填,預設值:false。true:表示強制使用加固模式。false:系統將首先嘗試在加固模式下擷取憑據。如果失敗,則會切換到普通模式進行嘗試(IMDSv1)。
    		SetDisableIMDSv1(true)
    	credentialClient, err := credentials.NewCredential(credentialsConfig)
    	if err != nil {
    		panic(err)
    	}
    }
  3. 以查詢指定 OSS Bucket 中的檔案清單為例,代碼實現如下。

    RAM角色需要授權AliyunOSSReadOnlyAccess權限原則。
    package main
    
    import (
    	"fmt"
    	"github.com/aliyun/aliyun-oss-go-sdk/oss"
    	"github.com/aliyun/credentials-go/credentials"
    )
    
    // 1. 定義結構體實現 OSS 的 CredentialsProvider 介面
    type CredentialsProviderAdapter struct {
    	credClient credentials.Credential
    }
    
    func (c *CredentialsProviderAdapter) GetCredentials() oss.Credentials {
    	// 擷取最新 Token
    	id, _ := c.credClient.GetAccessKeyId()
    	secret, _ := c.credClient.GetAccessKeySecret()
    	token, _ := c.credClient.GetSecurityToken()
    	
    	return oss.Credentials{
    		AccessKeyID:     *id,
    		AccessKeySecret: *secret,
    		SecurityToken:   *token,
    	}
    }
    
    func main() {
    	roleName := "YOUR_ROLE_NAME"
    	endpoint := "YOUR_ENDPOINT"
    	bucketName := "YOUR_BUCKET_NAME"
    
    	// 2. 配置 Credentials 用戶端 (ECS 模式)
    	config := new(credentials.Config).
    		SetType("ecs_ram_role").
    		SetRoleName(roleName)
    	
    	credClient, err := credentials.NewCredential(config)
    	if err != nil {
    		panic(err)
    	}
    
    	// 3. 初始化 OSS Client
    	provider := &CredentialsProviderAdapter{credClient: credClient}
    	client, err := oss.New(endpoint, "", "", oss.SetCredentialsProvider(provider))
    	if err != nil {
    		panic(err)
    	}
    
    	bucket, err := client.Bucket(bucketName)
    	if err != nil {
    		panic(err)
    	}
    
    	// 4. 查詢檔案
    	fmt.Println("--- 開始查詢 ---")
    	lsRes, err := bucket.ListObjects(oss.MaxKeys(10))
    	if err != nil {
    		fmt.Println("查詢失敗:", err)
    		return
    	}
    
    	for _, object := range lsRes.Objects {
    		fmt.Println("檔案 found:", object.Key)
    	}
    	fmt.Println("--- 成功 ---")
    }
    

Node.js

  1. 安裝Credentials工具。

    若使用加固模式擷取臨時身份憑證,credentials的版本不低於2.3.1。
    npm install @alicloud/credentials
  2. 配置ECS執行個體RAM角色作為訪問憑證。

    const Credential = require('@alicloud/credentials');
    
    const credentialsConfig = new Credential.Config({
      type: 'ecs_ram_role',
      // 選填,該ECS角色的角色名稱,不填會自動擷取,但是建議加上以減少請求次數,可以通過環境變數ALIBABA_CLOUD_ECS_METADATA設定roleName
      roleName: 'ROLENAME',
      // 選填,預設值:false。true:表示強制使用加固模式。false:系統將首先嘗試在加固模式下擷取憑據。如果失敗,則會切換到普通模式進行嘗試(IMDSv1)。
      disableIMDSv1: true,
    });
    const cred = new Credential.default(credentialsConfig);
    
  3. 以查詢指定 OSS Bucket 中的檔案清單為例,代碼實現如下。

    RAM角色需要授權AliyunOSSReadOnlyAccess權限原則。
    const OSS = require('ali-oss');
    const Credential = require('@alicloud/credentials');
    
    async function listObjects() {
      const roleName = 'YOUR_ROLE_NAME';
      const bucketName = 'YOUR_BUCKET_NAME';
      const region = 'YOUR_REGION'; // 注意:OSS SDK 通常只需要 region
    
      // 1. 初始化 Credentials (ECS 模式)
      const credentialsConfig = new Credential.Config({
        type: 'ecs_ram_role',
        roleName: roleName
      });
      const credClient = new Credential.default(credentialsConfig);
    
      try {
        // 2. 擷取憑證
        const accessKeyId = await credClient.getAccessKeyId();
        const accessKeySecret = await credClient.getAccessKeySecret();
        const securityToken = await credClient.getSecurityToken();
    
        // 3. 初始化 OSS Client
        const client = new OSS({
          region: region,
          accessKeyId: accessKeyId,
          accessKeySecret: accessKeySecret,
          stsToken: securityToken,
          bucket: bucketName,
          // 如果需要自動重新整理,建議使用 refreshSTSToken 機制,此處為簡化示範單次擷取
          refreshSTSToken: async () => {
             return {
                accessKeyId: await credClient.getAccessKeyId(),
                accessKeySecret: await credClient.getAccessKeySecret(),
                stsToken: await credClient.getSecurityToken()
             }
          }
        });
    
        // 4. 查詢檔案
        console.log("--- 開始查詢 ---");
        const result = await client.list({ 'max-keys': 10 });
        if (result.objects) {
            result.objects.forEach(obj => {
                console.log(`檔案 found: ${obj.name}`);
            });
        } else {
            console.log("Bucket 為空白");
        }
        console.log("--- 成功 ---");
    
      } catch (e) {
        console.error("出錯:", e);
      }
    }
    
    listObjects();

.NET

  1. 安裝Credentials工具。

    若使用加固模式擷取臨時身份憑證,credentials的版本不低於1.4.2。
    dotnet add package Aliyun.Credentials
  2. 配置ECS執行個體RAM角色作為訪問憑證。

    using Aliyun.Credentials.Models;
    
    namespace credentials_demo
    {
        class Program
        {
            static void Main(string[] args)
            {
                var config = new Config();
                {
                    Type = "ecs_ram_role",
                  	// 選填,該ECS角色的角色名稱,不填會自動擷取,但是建議加上以減少請求次數,可以通過環境變數ALIBABA_CLOUD_ECS_METADATA設定RoleName
                    RoleName = "ROLE_NAME",
                    // 選填,預設值:false。true:表示強制使用加固模式。false:系統將首先嘗試在加固模式下擷取憑據。如果失敗,則會切換到普通模式進行嘗試(IMDSv1)。
                    DisableIMDSv1 = true
                }
            }
        }
    }
  3. 以查詢指定 OSS Bucket 中的檔案清單為例,代碼實現如下。

    RAM角色需要授權AliyunOSSReadOnlyAccess權限原則。
    using System;
    using Aliyun.OSS;
    using Aliyun.Credentials.Models;
    using Aliyun.Credentials;
    
    namespace EcsRoleDemo
    {
        class Program
        {
            static void Main(string[] args)
            {
                string roleName = "YOUR_ROLE_NAME";
                string endpoint = "YOUR_ENDPOINT";
                string bucketName = "YOUR_BUCKET_NAME";
    
                // 1. 配置 Credentials (ECS 模式)
                Config credConfig = new Config
                {
                    Type = "ecs_ram_role",
                    RoleName = roleName
                };
                Client credClient = new Client(credConfig);
    
                try
                {
                    // 2. 擷取憑證 (C# SDK 內部自動處理非同步請求)
                    string ak = credClient.GetAccessKeyId();
                    string sk = credClient.GetAccessKeySecret();
                    string token = credClient.GetSecurityToken();
    
                    // 3. 初始化 OSS Client
                    // 注意:在實際長駐服務中,建議封裝邏輯以定期重新擷取 Token
                    OssClient ossClient = new OssClient(endpoint, ak, sk, token);
    
                    Console.WriteLine("--- 開始查詢 ---");
                    // 4. 查詢檔案
                    var listResult = ossClient.ListObjects(bucketName);
                    foreach (var summary in listResult.ObjectSummaries)
                    {
                        Console.WriteLine("檔案 found: " + summary.Key);
                    }
                    Console.WriteLine("--- 成功 ---");
                }
                catch (Exception ex)
                {
                    Console.WriteLine("失敗: " + ex.Message);
                }
            }
        }
    }

PHP

  1. 安裝Credentials工具。

    若使用加固模式擷取臨時身份憑證,credentials的版本不低於1.2.0。
    composer require alibabacloud/credentials
  2. 配置ECS執行個體RAM角色作為訪問憑證。

    <?php
    
    use AlibabaCloud\Credentials\Credential;
    use AlibabaCloud\Credentials\Credential\Config;
    
    $credConfig = new Config([
        'type' => 'ecs_ram_role',
        // 選填,該ECS角色的角色名稱,不填會自動擷取,但是建議加上以減少請求次數,可以通過環境變數ALIBABA_CLOUD_ECS_METADATA設定role_name
        'roleName' => '<RoleName>',
        // 選填,預設值:false。true:表示強制使用加固模式。false:系統將首先嘗試在加固模式下擷取憑據。如果失敗,則會切換到普通模式進行嘗試(IMDSv1)。
        'disableIMDSv1' => true,
    ]);
  3. 以查詢指定 OSS Bucket 中的檔案清單為例,代碼實現如下。

    RAM角色需要授權AliyunOSSReadOnlyAccess權限原則。
    
    require 'vendor/autoload.php';
    
    use AlibabaCloud\Credentials\Credential;
    use OSS\OssClient;
    use OSS\Core\OssException;
    
    $roleName = 'YOUR_ROLE_NAME';
    $bucketName = 'YOUR_BUCKET_NAME';
    $endpoint = 'YOUR_ENDPOINT';
    
    try {
        // 1. 配置 Credentials (ECS 模式)
        $credConfig = new AlibabaCloud\Credentials\Credential\Config([
            'type' => 'ecs_ram_role',
            'roleName' => $roleName
        ]);
        $credClient = new Credential($credConfig);
    
        // 2. 擷取憑證
        $ak = $credClient->getAccessKeyId();
        $sk = $credClient->getAccessKeySecret();
        $token = $credClient->getSecurityToken();
    
        // 3. 初始化 OSS Client
        $ossClient = new OssClient($ak, $sk, $endpoint, false, $token);
    
        echo "--- 開始查詢 ---\n";
        // 4. 查詢檔案
        $options = array(
            OssClient::OSS_MAX_KEYS => 10
        );
        $listResult = $ossClient->listObjects($bucketName, $options);
        $objectList = $listResult->getObjectList();
        
        foreach ($objectList as $objectInfo) {
            echo "檔案 found: " . $objectInfo->getKey() . "\n";
        }
        echo "--- 成功 ---\n";
    
    } catch (Exception $e) {
        echo "失敗: " . $e->getMessage() . "\n";
    }

更多詳細資料及調用樣本,請參見方式五:使用ECS執行個體RAM角色

管理與維護

收回/更改ECS的執行個體RAM角色

通過控制台收回/更改

  1. 訪問ECS控制台-執行個體。在頁面左側頂部,選擇目標資源所在的資源群組和地區。

  2. 找到要操作的ECS執行個體,選擇表徵圖 > 實例設定 > 授予/收回RAM角色

    • 收回執行個體RAM角色:操作類型選擇解綁,單擊確定

    • 更改執行個體RAM角色:操作類型選擇綁定,選擇所需的執行個體RAM角色,單擊確定完成更改。

通過API收回/更改

手動擷取STS臨時憑證(用於指令碼或調試)

在Shell指令碼等非SDK環境中,可手動調用中繼資料服務介面擷取憑證。

方式一:通過Shell命令擷取

中繼資料服務提供HTTP訪問地址擷取臨時訪問憑據。

加固模式

  • Linux執行個體

    # 擷取中繼資料服務器的訪問憑證用於鑒權
    TOKEN=`curl -X PUT "http://100.100.100.200/latest/api/token" -H "X-aliyun-ecs-metadata-token-ttl-seconds:中繼資料服務器訪問憑證有效期間"` 
    # 擷取執行個體RAM角色的臨時憑證
    curl -H "X-aliyun-ecs-metadata-token: $TOKEN" http://100.100.100.200/latest/meta-data/ram/security-credentials/執行個體RAM角色名稱
  • Windows執行個體(Powershell)

    # 擷取中繼資料服務器的訪問憑證用於鑒權
    $token = Invoke-RestMethod -Headers @{"X-aliyun-ecs-metadata-token-ttl-seconds" = "中繼資料服務器的訪問憑證有效期間"} -Method PUT -Uri http://100.100.100.200/latest/api/token
    # 擷取執行個體RAM角色的臨時憑證
    Invoke-RestMethod -Headers @{"X-aliyun-ecs-metadata-token" = $token} -Method GET -Uri http://100.100.100.200/latest/meta-data/ram/security-credentials/執行個體RAM角色名稱

<中繼資料服務器的訪問憑證有效期間>:在擷取執行個體RAM角色的臨時授權訪問憑證之前,先擷取中繼資料服務器的訪問憑證並設定其有效期間,以加強資料安全。超過有效期間後,需要重新擷取憑證,否則無法擷取執行個體RAM角色的臨時授權訪問憑證。取值範圍為1~21600,單位為秒。詳細說明,請參見執行個體中繼資料

<執行個體RAM角色名稱>需替換為具體的執行個體RAM角色名稱。例如EcsRamRole

若使用雲助手執行上述命令時,雲助手Agent的最低版本要求如下:

平台

雲助手Agent版本號碼

windows

2.1.3.857

linux

2.2.3.857

linux arm

2.4.3.857

freebsd

2.3.3.857

普通模式

  • Linux執行個體

    curl http://100.100.100.200/latest/meta-data/ram/security-credentials/執行個體RAM角色名稱
  • Windows執行個體(Powershell)

    Invoke-RestMethod http://100.100.100.200/latest/meta-data/ram/security-credentials/執行個體RAM角色名稱

    <執行個體RAM角色名稱>需替換為實際的執行個體RAM角色名稱。例如EcsRamRoleDocumentTesting。

返回樣本如下:

{
   "AccessKeyId" : "STS.*******6YSE",
   "AccessKeySecret" : "aj******jDU",
   "Expiration" : "2017-11-01T05:20:01Z", 
   "SecurityToken" : "CAISng********",
   "LastUpdated" : "2023-07-18T14:17:28Z",
   "Code" : "Success"
}
  • AccessKeyIdAccessKeySecretSecurityToken共同構成了臨時存取權杖。

  • Expiration:臨時授權訪問憑證的有效期間。

方式二:通過阿里雲CLI擷取

CLI支援通過執行個體中繼資料服務擷取臨時訪問憑證STS Token的邏輯,且支援周期性自動重新整理。

若使用加固模式擷取臨時身份憑證,CLI的版本不低於3.0.248。
  1. 安裝CLI。

  2. 配置身份憑據。

    aliyun configure --profile EcsProfile --mode EcsRamRole

    該命令為互動式命令,需要根據提示輸入相應資訊。更多資訊請參見配置憑證。互動過程樣本:

    Configuring profile 'EcsProfile' in 'EcsRamRole' authenticate mode...
    Ecs Ram Role []: YOUR_ROLE_NAME
    Default Region Id []: YOUR_REGION
    Default Output Format [json]: json (Only support json)
    Default Language [zh|en] en: en
    Saving profile[EcsProfile] ...Done.
  3. 調用API。例如,使用CLI查詢ECS執行個體列表。

     aliyun ecs DescribeInstances

    更多關於CLI命令的說明,請參見命令結構

常見問題

一台ECS執行個體可以被授予幾個RAM角色?

一台ECS執行個體在同一時刻最多隻能被授予一個RAM角色。可通過收回後再授予的方式切換角色。

如何使用RAM使用者給執行個體授予RAM角色?

為RAM使用者授予以下許可權,其他動作同操作步驟

  • 管理RAM角色:需要建立RAM角色並授權。

  • 授予/回收RAM角色:需要進入執行個體詳情頁對執行個體做授予/回收RAM角色的操作。

  • 允許傳遞角色給雲產品:給雲端服務授予角色需要配合ram:PassRole許可權。

{
    "Version": "1",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ecs:Describe*",
                "ecs:List*",
                "ecs:AttachInstanceRamRole",
                "ecs:DetachInstanceRAMRole"
            ],
            "Resource": "*"
        },
        {
          "Effect": "Allow",
          "Action": [
            "ram:Describe*",              
            "ram:List*",
            "ram:Get*",
            "ram:CreateRole", 
            "ram:CreatePolicy", 
            "ram:AttachPolicyToRole"
          ],
          "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": "ram:PassRole",
            "Resource": "*"
        }
    ]
}

相關文檔