執行個體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角色並授予給ECS執行個體
通過控制台建立和授予
通過API建立和授予
建立RAM角色並授權。
調用CreateRole介面建立RAM角色。
信任策略參數(AssumeRolePolicyDocument):
{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": [ "ecs.aliyuncs.com" ] } } ], "Version": "1" }
(可選)調用CreatePolicy介面建立權限原則。
如果您已有可用權限原則,可跳過該步驟。
PolicyDocument
(權限原則)需按如下設定:{ "Statement": [ { "Action": [ "oss:Get*", "oss:List*" ], "Effect": "Allow", "Resource": "*" } ], "Version": "1" }
調用AttachPolicyToRole介面為執行個體RAM角色授權。
調用AttachInstanceRamRole介面將RAM角色授予ECS執行個體。
擷取執行個體RAM角色的臨時身份憑證
您可以在ECS執行個體內部通過訪問中繼資料服務(Meta Data Service)擷取到臨時訪問憑證,同時會確保臨時訪問憑證的有效性。更多關於中繼資料的介紹,請參見執行個體中繼資料。
方式一:通過Credentials工具擷取
Credentials工具封裝了調用ECS的中繼資料服務(Meta Data Service)擷取臨時訪問憑證STS Token的邏輯,且支援周期性更新。
Python
安裝Credentials工具。
說明alibabacloud_credentials版本不低於0.3.6。
pip install alibabacloud_credentials
配置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
添加credentials依賴。
說明credentials-java版本不低於0.3.10。
<!-- https://mvnrepository.com/artifact/com.aliyun/credentials-java --> <dependency> <groupId>com.aliyun</groupId> <artifactId>credentials-java</artifactId> <version>LATEST</version> </dependency>
配置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); } }
Go
安裝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
配置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>") credentialClient, err := credentials.NewCredential(credentialsConfig) if err != nil { panic(_err) } }
Node.js
安裝Credentials工具。
說明credentials版本不低於2.3.1。
npm install @alicloud/credentials
配置ECS執行個體RAM角色作為訪問憑證。
const Credential = require('@alicloud/credentials'); const credentialsConfig = new Credential.Config({ type: 'ecs_ram_role', // 選填,該ECS角色的角色名稱,不填會自動擷取,但是建議加上以減少請求次數,可以通過環境變數ALIBABA_CLOUD_ECS_METADATA設定roleName roleName: '<RoleName>', }); const cred = new Credential.default(credentialsConfig);
.NET
安裝Credentials工具。
說明credentials版本不低於1.4.2。
dotnet add package Aliyun.Credentials
配置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 = "<RoleName>" } } } }
PHP
安裝Credentials工具。
說明credentials版本不低於1.2.0。
composer require alibabacloud/credentials
配置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>', ]);
方式二:通過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。
返回樣本如下,其中:
AccessKeyId
、AccessKeySecret
、SecurityToken
共同構成了臨時存取權杖。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 = 'oss-cn-beijing.aliyuncs.com' # 需替換為OSS Bucket的外網Endpoint
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角色
通過控制台收回/更改
登入ECS管理主控台。
在左側導覽列,選擇 。
在頁面左側頂部,選擇目標資源所在的資源群組和地區。
找到要操作的ECS執行個體,選擇
。收回執行個體RAM角色:操作類型選擇解綁,單擊確定。
更改執行個體RAM角色:操作類型選擇綁定,選擇所需的執行個體RAM角色,單擊確定完成更改。
通過API收回/更改
收回執行個體RAM角色:調用DetachInstanceRamRole介面收回執行個體RAM角色。
更改執行個體RAM角色:
調用DetachInstanceRamRole介面收回執行個體RAM角色。
調用AttachInstanceRamRole介面重新為執行個體授予新的RAM角色。
相關文檔
當您的自建應用部署在阿里雲ECS伺服器上,且需要訪問KMS應用時,可以使用ECS執行個體RAM角色訪問KMS。具體操作,請參見使用ECS執行個體RAM角色安全訪問KMS。
當ECS不需要某些資源存取權限時,可以通過移除執行個體RAM角色的許可權來實現。具體操作,請參見為RAM角色移除許可權。
訪問阿里雲OpenAPI時,如果在代碼中寫入程式碼明文AK,容易因代碼倉庫許可權管理不當造成AK泄露,建議您通過非AccessKey硬式編碼方式編程,使用訪問憑證訪問阿里雲OpenAPI,可參見使用訪問憑據訪問阿里雲OpenAPI最佳實務。