全部產品
Search
文件中心

Elastic Compute Service:執行個體RAM角色

更新時間:Oct 29, 2024

執行個體RAM角色是指為ECS執行個體授予的RAM角色,該RAM角色是一個受信服務為雲端服務器的普通服務角色。使用執行個體RAM角色可以實現在ECS執行個體內部無需配置AccessKey即可擷取臨時訪問憑證(STS Token),從而調用其他雲產品的API。由於臨時身份憑證僅可在執行個體內部擷取,並且無需配置AccessKey,這不僅確保了雲帳號AccessKey的安全性,還能夠通過存取控制RAM實現精細化的控制與許可權管理。

功能優勢

  • 安全便捷的執行個體內API調用方案:當您的專案部署在阿里雲ECS上時,無需在代碼中配置AccessKey,即可利用ECS提供的能力擷取臨時身份憑證(STS Token)以調用API,從而降低AccessKey泄漏的風險。

  • 簡化RAM身份切換流程:如果您使用的是傳統的AccessKey方案,當需要更換調用服務的RAM身份時,需對配置或者代碼進行修改並重啟服務。而採用執行個體RAM角色後,僅需調整授予ECS執行個體的RAM角色即可實現身份切換,無需進行其他任何更改。

  • 精細化系統管理權限:可以為不同的ECS執行個體分配具有特定授權策略的RAM角色,從而實現根據業務需求進行精細化的存取控制。

使用限制

為ECS執行個體授予RAM角色時存在以下限制:

  • ECS執行個體的網路類型必須是Virtual Private Cloud。

  • 一台ECS執行個體只能被授予一個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": "*"
        }
    ]
}

建立RAM角色並授予給ECS執行個體

通過控制台建立和授予

  1. 登入RAM控制台,建立RAM角色並授權。

    1. 建立可信實體為阿里雲服務的RAM角色。

      選擇身份管理 > 角色,單擊建立角色,按照介面提示完成角色建立。注意以下參數(其他參數按需填寫,可參見建立普通服務角色):

      • 可信實體類型:選擇阿里雲服務

      • 角色類型:選擇普通服務角色

      • 受信服務:選擇雲端服務器

        image

        image

    2. 為已建立的RAM角色授權。

      將系統策略或已建立的自訂權限原則授權給RAM使用者,使其擁有相關的資源訪問或操作許可權。例如,給RAM角色賦予OSS的唯讀許可權(AliyunOSSReadOnlyAccess)。

      說明

      支援添加系統策略自訂策略。若系統策略不滿足您的需求,可建立自訂策略。具體操作,請參見建立自訂權限原則

  2. 為ECS執行個體授予RAM角色。

    1. 登入ECS管理主控台

    2. 在左側導覽列,選擇執行個體與鏡像 > 執行個體

    3. 在頁面左側頂部,選擇目標資源所在的資源群組和地區。地區

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

    5. 在對話方塊中,選擇建立好的執行個體RAM角色,單擊確定

通過API建立和授予

  1. 建立RAM角色並授權。

    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角色授權。

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

擷取執行個體RAM角色的臨時身份憑證

您可以在ECS執行個體內部通過訪問中繼資料服務(Meta Data Service)擷取到臨時訪問憑證,同時會確保臨時訪問憑證的有效性。更多關於中繼資料的介紹,請參見執行個體中繼資料

方式一:通過Credentials工具擷取

Credentials工具封裝了調用ECS的中繼資料服務(Meta Data Service)擷取臨時訪問憑證STS Token的邏輯,且支援周期性更新。

下文以Python和Java SDK為例。

Python
  1. 安裝Credentials工具。

    pip install alibabacloud_credentials
  2. 配置ECS的RAM角色作為訪問憑證。

    from alibabacloud_credentials.client import Client as CredClient
    from alibabacloud_credentials.models import Config as CredConfig
    
    credentialConfig = CredConfig(
    	type='ecs_ram_role',
    	# 選填,該ECS角色的角色名稱,不填會自動擷取,但是建議加上以減少請求次數
    	role_name='<RoleName>'
    )
    credentialsClient = CredClient(credentialConfig)
    

Java

  1. 添加credentials依賴。

    <!-- https://mvnrepository.com/artifact/com.aliyun/credentials-java -->
    <dependency>
        <groupId>com.aliyun</groupId>
        <artifactId>credentials-java</artifactId>
        <version>0.3.4</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角色的角色名稱,不填會自動擷取,但是建議加上以減少請求次數
            credentialConfig.setRoleName("<RoleName>");
            Client credentialClient = new Client(credentialConfig);
        }
    }

方式二:通過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

普通模式

  • 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/Invoke-RestMethod http://100.100.100.200/latest/meta-data/ram/security-credentials/<執行個體RAM角色名稱>

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

返回樣本如下,其中:

  • AccessKeyIdAccessKeySecretSecurityToken共同構成了臨時存取權杖。

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

    {
       "AccessKeyId" : "STS.*******6YSE",
       "AccessKeySecret" : "aj******jDU",
       "Expiration" : "2017-11-01T05:20:01Z", 
       "SecurityToken" : "CAISng********",
       "LastUpdated" : "2023-07-18T14:17:28Z",
       "Code" : "Success"
    }

使用執行個體RAM角色調用API

下文以部署在Linux ECS執行個體上的Python應用程式調用OSS下載檔案介面為例,為您介紹ECS執行個體RAM角色的使用方法。

pip install oss2  
pip install alibabacloud_credentials
import oss2
from alibabacloud_credentials.client import Client
from alibabacloud_credentials.models import Config
from oss2 import CredentialsProvider
from oss2.credentials import Credentials

class CredentialProviderWarpper(CredentialsProvider):
    def __init__(self, client):
        self.client = client

    def get_credentials(self):
        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 download_image_using_instance_role(bucket_name, endpoint, object_key, local_file, role_name):
    config = Config(
        type='ecs_ram_role',      # 訪問憑證類型。固定為ecs_ram_role。
        role_name=role_name
    )
    cred = Client(config)
    credentials_provider = CredentialProviderWarpper(cred)
    auth = oss2.ProviderAuth(credentials_provider)

    # 初始化 OSS Bucket 對象
    bucket = oss2.Bucket(auth, endpoint, bucket_name)
    # 下載圖片到本地
    bucket.get_object_to_file(object_key, local_file)
    print("Image downloaded successfully")

if __name__ == "__main__":  

    # 定義全域變數
    role_name = 'role_name'  # 需替換為執行個體RAM角色名稱
    bucket_name = 'bucket_name'  # 需替換為Bucket名稱
    endpoint = 'http://oss-cn-beijing-internal.aliyuncs.com'  # 需替換為OSS Bucket的Endpoint,如果使用內網endpoint,需要確保ecs與oss處於同一個地區。
    object_key = 'testfolder/example.png'  # 需替換為你要下載的圖片在OSS中的完整儲存路徑(不包含Bucket名稱)
    local_file = '/localpath/to/image.png'  # 需替換為圖片需要在ECS上儲存的根路徑,並定義圖片名稱
    download_image_using_instance_role(bucket_name, endpoint, object_key, local_file, role_name)

其他動作

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

通過控制台收回/更改

  1. 登入ECS管理主控台

  2. 在左側導覽列,選擇執行個體與鏡像 > 執行個體

  3. 在頁面左側頂部,選擇目標資源所在的資源群組和地區。地區

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

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

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

      image.png

通過API收回/更改

相關文檔