ECS實例RAM角色是RAM角色的一種,它讓ECS實例扮演具有某些權限的角色。當您的自建應用部署在阿里云ECS服務器上時,可以使用ECS實例RAM角色訪問KMS。本文介紹了如何使用ECS實例RAM角色訪問KMS。
支持ECS實例RAM角色的SDK
注意事項
ECS實例的網絡類型為專有網絡VPC。
一個ECS實例只能授予一個RAM角色。
若您的賬戶為RAM用戶(子賬號),請先聯系阿里云賬號(主賬號)獲取配置RAM角色的權限。具體操作,請參見授權RAM用戶使用實例RAM角色。
步驟一:創建RAM角色并授權
通過RAM控制臺
創建可信實體為阿里云服務的RAM角色。
登錄RAM控制臺。
在左側導航欄,選擇
。在角色頁面,單擊創建角色,按照界面提示完成角色創建。注意以下參數,其他參數按需填寫。
角色名稱:本文示例為EcsRamRoleTest。
可信實體類型:選擇阿里云服務。
角色類型:選擇普通服務角色。
受信服務:選擇云服務器。
授予RAM角色訪問KMS的權限。
成功創建RAM角色后,該RAM角色沒有任何權限,您需要為該RAM角色授權。
在角色頁面,單擊目標RAM角色操作列的新增授權。
在新增授權頁面,在系統策略上填寫KMS系統策略名稱(AliyunKMSFullAccess),然后單擊確定。
通過RAM OpenAPI
創建可信實體為阿里云服務的RAM角色。
調用RAM的CreateRole - 創建角色接口,請求參數設置如下:
RoleName
:填寫RAM角色名稱(本文示例為EcsRamRoleTest)。AssumeRolePolicyDocument
:填寫如下策略內容,表示允許ECS扮演該角色。{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": [ "ecs.aliyuncs.com" ] } } ], "Version": "1" }
授予RAM角色訪問KMS的權限。
調用RAM的AttachPolicyToRole - 為指定角色添加權限接口,為實例RAM角色(EcsRamRoleTest)添加AliyunKMSFullAccess系統權限。請求參數設置如下:
PolicyType
:填寫System,表示系統策略。PolicyName
:填寫KMS系統策略名稱(AliyunKMSFullAccess)。RoleName
:填寫RAM角色名稱(EcsRamRoleTest)。
步驟二:將RAM角色授予ECS實例
通過ECS控制臺
如果您還未購買ECS實例,請先購買ECS實例。具體操作,請參見自定義購買實例。
登錄ECS管理控制臺。
在左側導航欄,選擇
。在頁面左側頂部,選擇ECS實例所在的資源組和地域。
定位到目標ECS實例,選擇
。在對話框中,選擇創建好的RAM角色,單擊確定完成授予。
通過ECS OpenAPI
為已有的ECS實例授予實例RAM角色
調用ECS的AttachInstanceRamRole - 為實例授予RAM角色接口,為已有的VPC類型ECS實例授予實例RAM角色。請求參數設置如下:
RegionId
:選擇實例所在的地域ID。RamRoleName
:填寫RAM角色名稱(EcsRamRoleTest)。InstanceIds
:填寫VPC類型ECS實例ID(["i-bXXXXXXXX"])。
創建ECS實例時指定實例RAM角色
創建實例。
調用ECS的CreateInstance - 創建一臺包年包月或者按量付費ECS實例接口,請求參數設置如下:
RegionId
:選擇實例所在地域。ImageId
:填寫實例的鏡像(例如centos_7_03_64_40G_alibase_****.vhd)。InstanceType
:填寫實例的規格(例如ecs.g6.large)。VSwitchId
:填寫實例所在的VPC交換機的ID。說明實例RAM角色目前只支持VPC類型ECS實例,該參數必填。
RamRoleName
:填寫實例RAM角色名稱(EcsRamRoleTest)。
您也可以授權RAM用戶使用實例RAM角色。具體操作,請參見授權RAM用戶使用實例RAM角色。
調用ECS的ModifyInstanceVncPasswd - 修改實例Web管理終端密碼、StartInstance - 啟動一臺實例接口,設置密碼并啟動實例。
步驟三:使用ECS實例RAM角色訪問KMS
以使用Java語言,調用KMS ListKeys接口查詢當前地域的所有密鑰ID為例。更詳細的SDK使用指導請參見SDK參考。
阿里云SDK(V1.0)
package com.aliyuncs.kms.examples;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.auth.AlibabaCloudCredentialsProvider;
import com.aliyuncs.auth.InstanceProfileCredentialsProvider;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.kms.model.v20160120.*;
import com.aliyuncs.profile.DefaultProfile;
public class RamRoleTest {
public static void main(final String[] args) throws Exception {
String regionId = "<region-id>";
DefaultProfile profile = DefaultProfile.getProfile(regionId);
// 設置RAM角色。本文示例使用"EcsRamRoleTest"。
String roleName = "EcsRamRoleTest";
// 設置ECS實例RAM角色的憑證Provider。
AlibabaCloudCredentialsProvider provider = new InstanceProfileCredentialsProvider(roleName);
IAcsClient client = new DefaultAcsClient(profile, provider);
ListKeysRequest request = new ListKeysRequest();
try {
ListKeysResponse response = client.getAcsResponse(request);
System.out.println(new Gson().toJson(response));
} catch (ServerException e) {
e.printStackTrace();
} catch (ClientException e) {
System.out.println("ErrCode:" + e.getErrCode());
System.out.println("ErrMsg:" + e.getErrMsg());
System.out.println("RequestId:" + e.getRequestId());
}
}
}
阿里云SDK(V2.0)
package com.aliyun.sample;
import com.aliyun.tea.*;
public class Sample {
public static com.aliyun.kms20160120.Client createClient() throws Exception {
com.aliyun.credentials.models.Config credentialConfig = new com.aliyun.credentials.models.Config();
// 憑證類型
credentialConfig.type = "ecs_ram_role";
// 選填,該ECS實例角色名稱,不填會自動獲取,但是建議加上以減少請求次數
credentialConfig.roleName = "<your-ecsRamRoleName>";
com.aliyun.credentials.Client credentialClient = new com.aliyun.credentials.Client(credentialConfig);
com.aliyun.teaopenapi.models.Config kmsClientConfig = new com.aliyun.teaopenapi.models.Config()
//設置KMS endpoint,例如:kms.cn-hangzhou.aliyuncs.com
.setEndpoint( "kms.cn-hangzhou.aliyuncs.com").
setCredential(credentialClient);
return new com.aliyun.kms20160120.Client(kmsClientConfig);
}
public static void main(String[] args_) throws Exception {
java.util.List<String> args = java.util.Arrays.asList(args_);
com.aliyun.kms20160120.Client client = Sample.createClient();
com.aliyun.kms20160120.models.ListKeysRequest listKeysRequest = new com.aliyun.kms20160120.models.ListKeysRequest();
com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
try {
client.listKeysWithOptions(listKeysRequest, runtime);
} catch (TeaException error) {
System.out.println(error.getMessage());
com.aliyun.teautil.Common.assertAsString(error.message);
} catch (Exception _error) {
_error.printStackTrace();
}
}
}
憑據客戶端
更多詳細信息,請參見憑據客戶端。
通過系統環境變量或配置文件secretsmanager.properties配置以下參數。
參數
參數值
credentials_type
固定取值ecs_ram_role。
credentials_role_session_name
RAM角色名稱。
cache_client_region_id
格式為[{"regionId":"<your region id>"}],請將
<your region id>
替換為您真實的地域ID。構建客戶端獲取憑據值。
import com.aliyuncs.kms.secretsmanager.client.SecretCacheClient; import com.aliyuncs.kms.secretsmanager.client.SecretCacheClientBuilder; import com.aliyuncs.kms.secretsmanager.client.exception.CacheSecretException; import com.aliyuncs.kms.secretsmanager.client.model.SecretInfo; public class CacheClientEnvironmentSample { public static void main(String[] args) { try { //構建憑據客戶端 SecretCacheClient client = SecretCacheClientBuilder.newClient(); //使用構建好的客戶端獲取憑據信息 SecretInfo secretInfo = client.getSecretInfo("#secretName#"); System.out.println(secretInfo); } catch (CacheSecretException e) { e.printStackTrace(); } } }
憑據JDBC客戶端
以通過JDBC方式連接MySQL數據庫為例介紹。詳細信息,請參見憑據JDBC客戶端。
在項目的運行代碼中新增配置文件secretsmanager.properties。
## 訪問憑據類型 credentials_type=ecs_ram_role ## ECS RAM Role名稱 credentials_role_name=#credentials_role_name# ## 關聯的KMS服務地域 cache_client_region_id=[{"regionId":"#regionId#"}] ## 用戶自定義的刷新頻率, 默認為6小時,最小值為5分鐘,單位為毫秒 refresh_secret_ttl=21600000
通過JDBC方式連接MySQL數據庫。
import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class SecretManagerJDBCSample { public static void main(String[] args) throws Exception { // 加載阿里云憑據管家JDBC Load the JDBC Driver com.aliyun.kms.secretsmanager.MysqlSecretsManagerSimpleDriver Class.forName("com.aliyun.kms.secretsmanager.MysqlSecretsManagerSimpleDriver"); Connection connect = null; try { connect = DriverManager.getConnection("secrets-manager:mysql://<YOUR-MYSQL-IP>:<YOUR-MYSQL-PORT>/<YOUR-DATABASE-NAME>", "#your-mysql-secret-name#",""); } catch(SQLException e) { e.printStackTrace(); } } }
RAM憑據插件
更多詳細信息,請參見RAM憑據插件。
在項目的運行代碼中新增配置文件managed_credentials_providers.properties。
credentials_type=ecs_ram_role ## ECS RAM Role名稱 credentials_role_name=#credentials_role_name# ## 關聯的KMS服務地域 cache_client_region_id=[{"regionId":"#regionId#"}]
獲得阿里云Java SDK客戶端并調用云服務。
以調用ECS DescribeInstanceStatus為例:
運行以下示例代碼時,請自行在pom.xml中添加云服務器aliyun-java-sdk-ecs依賴。
import com.aliyuncs.IAcsClient; import com.aliyuncs.ecs.model.v20140526.DescribeInstanceStatusRequest; import com.aliyuncs.ecs.model.v20140526.DescribeInstanceStatusResponse; import com.aliyun.kms.secretsmanager.plugin.sdkcore.ProxyAcsClient; import com.aliyuncs.exceptions.ClientException; import com.aliyuncs.exceptions.ServerException; public class AliyunSdkProviderSample { public static void main(String[]args) { String secretName="******"; /* 如果應用無法設置從classpath和可執行jar包中讀取默認配置文件(managed_credentials_providers.properties), 或需自定義配置文件名稱時,可調用以下代碼設置自定義配置文件,并按以下順序讀?。? 1."your-config-name"配置絕對路徑+文件名稱,即讀取絕對路徑下的文件 2."your-config-name"僅配置文件名稱,默認先讀取classpath下的配置文件,再讀取可執行jar包中的配置文件 */ //ConfigLoader.setConfigName("your-config-name"); // 1. 獲取ACSClient by aliyun-java-sdk-managed-credentials-provider IAcsClient client = null; try { client = new ProxyAcsClient("<the regionId of ECS>", secretName); } catch (ClientException e) { e.printStackTrace(); } // 2. 調用ECS的OpenAPI實現業務功能 DescribeInstanceStatusRequest request = new DescribeInstanceStatusRequest(); DescribeInstanceStatusResponse response; try { response = client.getAcsResponse(request); } catch (ServerException e) { e.printStackTrace(); } catch (ClientException e) { e.printStackTrace(); } // 3. 通過下面方法關閉客戶端來釋放插件關聯的資源 client.shutdown(); } }
相關文檔
配置RamRole調用(阿里云SDK V1.0)
使用ECS實例RAM角色(阿里云SDK V2.0)
了解關于RAM角色的更多內容: