实例RAM角色是一种可授予实例的虚拟身份,为实例授予RAM角色后,其内部应用无需配置AccessKey,即可获取临时安全凭证,从而安全地访问其他云产品的API。这种方式极大地提升了账号密钥的安全性。同时借助访问控制RAM,实现精细化的权限管理。本文介绍如何为实例授予/回收RAM角色。
限制与前提
- 该云主机的网络类型为虚拟私有云VPC。
- 一台云主机只能被授予一个RAM角色。
- 仅【运行中】状态的云主机可以被授予/收回RAM角色。
- 当前仅支持华东-苏州 可用区四。
操作步骤
1.创建移动云服务角色
-
- 登录【访问控制RAM】控制台>【角色】>【创建角色】。
- 选择【移动云服务】,单击【下一步】。
- 输入【角色名称】。
- 选择云服务下拉框选择【云主机(ecs.ecloud.com)】,单击【完成】。
2.授予/收回云主机RAM角色
单实例操作:
- 登录云服务器控制台,点击【云主机ECS】进入云主机列表页。
- 选择您需要操作的云主机。
- 操作列单击【更多】>【实例配置】>【授予/收回RAM角色】。
- 在【授予/收回RAM角色】弹窗中,选择操作类型【授予】或【收回】
- 如为【授予】,则在【RAM角色】中选择要授予的角色,单击【确定】。
- 如为【收回】,则确认即将收回的【RAM角色】,单击【确定】。
说明
因单实例仅允许关联一个RAM角色,所以当为已关联RAM角色的实例再次授予时,即为替换为新的RAM角色。
批量操作:
- 登录云服务器控制台,点击【云主机ECS】进入云主机列表页。
- 勾选您需要操作的云主机。
- 在列表上方选择【更多操作】>【授予/收回RAM角色】。
3.获取临时密钥
移动云提供元数据服务,您可以在云主机内部通过访问元数据服务,获取到临时安全凭证,同时会确保临时访问凭证的有效性。更多关于元数据的介绍,请参见查看实例元数据
- 通过VNC远程登录云主机,具体请参见VNC远程登录。
- 执行以下命令,获取临时安全凭证。
- Linux实例
curl http://169.254.169.254/latest/meta-data/ram_sts - Windows实例(以Windows Server 2022 DataCenter 64位 英文版为例)
curl.exe --http0.9 --output - http://169.254.169.254/latest/meta-data/ram_sts
- Linux实例
说明
Windows操作系统需要下载curl工具,下载地址。
c. 临时安全凭证信息,包括:
- accessKeyId:临时密钥ID
- accessKeySecret:临时密钥
- roleName:角色名称
4.使用临时密钥操作
(1)配置环境变量
将获取到的临时密钥配置为环境变量,以便 SDK 或 CLI 工具使用:
export ECLOUD_SECRET_ID="临时accessKeyId"
export ECLOUD_SECRET_KEY="临时accessKeySecret"
(2)访问资源
使用 SDK 或 CLI 工具访问目标资源。以使用 JAVA SDK 为例:
a. 工程已引入JAVA ECS SDK 包:
<dependency>
<groupId>com.ecloud.sdk</groupId>
<artifactId>ecloud-sdk-ecs</artifactId>
<version>2.0.2</version>
</dependency>
b. 角色拥有操作 ECS的相应策略,初始化ECS Client 即可调用SDK内置云主机功能接口。
package com.ecloud.sdk.ecs.v2;
import com.ecloud.sdk.JSON;
import com.ecloud.sdk.config.Config;
import com.ecloud.sdk.ecs.v2.Client;
import com.ecloud.sdk.ecs.v2.model.*;
import com.ecloud.sdk.exception.SdkException;
import java.util.*;
public class DescribeRegionsSample {
/**
* 使用AK&SK初始化账号Client
*
* @param accessKey
* @param secretKey
* @param regionId
* @return Client
*/
private static Client createClient(String accessKey, String secretKey, String regionId) {
Config config = new Config();
config.setAccessKey(accessKey);
config.setSecretKey(secretKey);
config.setRegionId(regionId);
return new Client(config);
}
public static void main(String[] args) throws SdkException {
Client client = DescribeRegionsSample.createClient("临时accessKeyId", "临时accessKeySecret", "regionId");
DescribeRegionsResponse result = client.describeRegions();
System.out.println(new JSON().getGson().toJson(result));
}
}