实例RAM角色

更新时间:
复制为 MD 格式

使用实例RAM角色可以在ECS实例内部无需配置AccessKey即可获取STS临时凭证(STS Token),从而调用其他云产品的API。

功能优势

  • 安全便捷:无需在ECS上的代码或配置文件中保存AccessKey,通过实例元数据服务(Instance Metadata Service, IMDS)即可自动获取STS临时凭证调用API,从而降低AccessKey泄露的风险。

  • 无缝切换:如需更换应用程序的RAM身份,只需在控制台调整授予ECSRAM角色,无需修改代码或重启服务。

  • 权限精细化:可以为不同的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. 配置ECSRAM角色作为访问凭证。

    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": "*"
        }
    ]
}

相关文档