Uma função RAM de instância permite que uma instância ECS assuma uma função com permissões específicas. Se sua aplicação autogerenciada estiver implantada em uma instância ECS do Alibaba Cloud, use uma função RAM de instância para acessar o KMS sem codificar credenciais de acesso no código. Este tópico descreve como usar uma função RAM de instância para acessar o KMS.
Escopo
Alibaba Cloud SDK: Executa operações do plano de controle.
Credentials SDK: Inclui o Secrets Manager Client, o Secrets Manager JDBC Client e o plug-in de segredo do RAM. Recupera valores de segredos.
Pré-requisitos
A instância ECS deve estar em uma VPC.
É possível associar apenas uma função RAM a uma instância ECS por vez.
Se você for um usuário RAM, solicite as permissões necessárias ao administrador da sua conta Alibaba Cloud para configurar funções RAM. Para mais informações, consulte instance RAM roles.
Etapa 1: Criar uma função RAM e conceder permissões
Console do RAM
-
Crie uma função RAM e defina sua entidade confiável como um service do Alibaba Cloud.
Faça login no console do RAM.
No painel de navegação à esquerda, escolha .
-
Na página Roles, clique em Create Role e siga as instruções na tela. Configure os parâmetros a seguir e ajuste os demais conforme necessário.
Nome da função: este tópico usa EcsRamRoleTest como exemplo.
Tipo de entidade confiável: selecione Alibaba Cloud Service.
Selecionar service confiável: escolha ECS.
-
Conceda permissões à função RAM para acessar o KMS.
Por padrão, uma nova função RAM não tem permissões. Conceda as permissões necessárias à função.
Na página Identities > Roles, clique em Attach Policy na coluna Actions da função RAM de destino.
No painel Attach Policy, selecione System Policy, pesquise e marque AliyunKMSFullAccess e clique em OK.
API do RAM
-
Crie uma função RAM e defina sua entidade confiável como um service do Alibaba Cloud.
Chame a operação de API CreateRole do RAM com os seguintes parâmetros:
RoleName: insira um nome para a função RAM. Este tópico usa EcsRamRoleTest como exemplo.-
AssumeRolePolicyDocument: use o documento de política a seguir para permitir que o ECS assuma esta função.{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": [ "ecs.aliyuncs.com" ] } } ], "Version": "1" }
-
Conceda permissões à função RAM para acessar o KMS.
Chame a operação de API AttachPolicyToRole do RAM para anexar a System Policy AliyunKMSFullAccess à função RAM de instância EcsRamRoleTest. Defina os seguintes parâmetros:
PolicyType: defina como System para indicar uma System Policy.PolicyName: defina como AliyunKMSFullAccess.RoleName: defina como o nome da função RAM, por exemplo, EcsRamRoleTest.
Etapa 2: Associar a função RAM a uma instância ECS
Console do ECS
Se você ainda não adquiriu uma instância ECS, adquira uma primeiro. Para mais informações, consulte Create an instance on the custom launch tab.
Faça login no console do ECS.
No painel de navegação à esquerda, escolha Instances & Images> Instances.
Na barra de navegação superior, selecione a região e o grupo de recursos onde a instância ECS está localizada.
Localize a instância ECS de destino e, na coluna Actions, escolha
>Instance Settings>Attach/Detach RAM Role.Na caixa de diálogo exibida, selecione a função RAM criada e clique em OK.
API do ECS
-
Associar uma função RAM de instância a uma instância ECS existente
Chame a operação de API AttachInstanceRamRole do ECS para associar uma função RAM de instância a uma instância ECS existente em uma VPC. Defina os seguintes parâmetros:
RegionId: o ID da região onde a instância está localizada.RamRoleName: o nome da função RAM, como EcsRamRoleTest.InstanceIds: o ID da instância ECS, por exemplo, ["i-bXXXXXXXX"].
-
Especifique uma função RAM de instância ao criar uma instância ECS
-
Crie uma instância.
Chame a operação de API CreateInstance do ECS. Defina os seguintes parâmetros:
RegionId: o ID da região onde a instância está localizada.ImageId: o ID da imagem da instância. Exemplo: centos_7_03_64_40G_alibase_****.vhd.InstanceType: o tipo da instância. Exemplo: ecs.g6.large.-
VSwitchId: o ID do vSwitch na VPC onde a instância reside.NotaFunções RAM de instância são suportadas apenas para instâncias ECS em uma VPC. Este parâmetro é obrigatório.
RamRoleName: o nome da função RAM de instância, como EcsRamRoleTest.
Você também pode autorizar um usuário RAM a usar uma função RAM de instância. Para mais informações, consulte instance RAM roles.
Chame as operações de API ModifyInstanceVncPasswd e StartInstance do ECS para definir uma senha para a instância e iniciá-la.
-
Etapa 3: Acessar o KMS com a função RAM
Esta seção apresenta um exemplo em Java de como chamar a operação de API ListKeys do KMS para listar todos os IDs de chave na região atual. Para orientações detalhadas sobre o SDK, consulte SDK reference.
Alibaba Cloud 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();
// Set the credential type.
credentialConfig.type = "ecs_ram_role";
// Optional. To reduce API calls, specify the instance RAM role name. If this parameter is omitted, the role name is retrieved automatically.
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()
// Set the KMS endpoint. Example: 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();
}
}
}
Corpo da aba
Secrets Manager Client
Para mais informações, consulte Secrets Manager Client.
-
Configure os seguintes parâmetros no arquivo
secretsmanager.propertiesou como variáveis de ambiente do sistema.Parâmetro
Valor
credentials_type
Defina como
ecs_ram_role.credentials_role_session_name
Um nome personalizado para a sessão da função, usado para auditoria.
cache_client_region_id
O formato é [{"regionId":"<your region id>"}]. Substitua
<your region id>pelo seu ID de região real. -
Compile o cliente para recuperar o valor do segredo.
import com.aliyuncs.kms.secretsmanager.client.v2.SecretCacheClient; import com.aliyuncs.kms.secretsmanager.client.v2.SecretCacheClientBuilder; import com.aliyuncs.kms.secretsmanager.client.v2.exception.CacheSecretException; import com.aliyuncs.kms.secretsmanager.client.v2.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(); } } }
Secrets Manager JDBC Client
Esta seção usa uma conexão de banco de dados MySQL via JDBC como exemplo. Para mais informações, consulte Secrets Manager JDBC Client.
-
No código da aplicação do seu projeto, adicione um arquivo de configuração chamado
secretsmanager.properties.## Type of access credentials credentials_type=ecs_ram_role ## Name of the ECS RAM role credentials_role_name=#credentials_role_name# ## Region of the associated KMS instance cache_client_region_id=[{"regionId":"#regionId#"}] ## Custom refresh interval. Unit: milliseconds. Default: 6 hours. Minimum: 5 minutes. refresh_secret_ttl=21600000 -
Conecte-se ao banco de dados MySQL via JDBC.
import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class SecretManagerJDBCSample { public static void main(String[] args) throws Exception { // Load the Alibaba Cloud Secrets Manager 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(); } } }
Plug-in de segredo do RAM
Para mais informações, consulte RAM secret plug-in.
-
Adicione o arquivo de configuração
managed_credentials_providers.propertiesao código de execução do seu projeto.credentials_type=ecs_ram_role ## Name of the ECS RAM role credentials_role_name=#credentials_role_name# ## Region of the associated KMS instance cache_client_region_id=[{"regionId":"#regionId#"}] -
Obtenha um cliente do Alibaba Cloud SDK for Java e chame os services de nuvem.
O exemplo a seguir mostra como chamar a operação DescribeInstanceStatus do ECS:
NotaAntes de executar o código de exemplo, adicione a dependência
aliyun-java-sdk-ecsao seu arquivo pom.xml.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="******"; /* If the application cannot read the default configuration file (managed_credentials_providers.properties) from the classpath or an executable JAR file, or if you need to use a custom configuration file name, you can call the following code to specify a custom configuration file. The file is read in the following order: 1. If "your-config-name" is an absolute path, the file is read from that path. 2. If "your-config-name" is only a file name, the file is read from the classpath first, and then from the executable JAR file. */ //ConfigLoader.setConfigName("your-config-name"); // 1. Obtain an IAcsClient by using aliyun-java-sdk-managed-credentials-provider. IAcsClient client = null; try { client = new ProxyAcsClient("<the regionId of ECS>", secretName); } catch (ClientException e) { e.printStackTrace(); } // 2. Call an ECS API operation to implement your business logic. DescribeInstanceStatusRequest request = new DescribeInstanceStatusRequest(); DescribeInstanceStatusResponse response; try { response = client.getAcsResponse(request); } catch (ServerException e) { e.printStackTrace(); } catch (ClientException e) { e.printStackTrace(); } // 3. Shut down the client to release resources used by the plug-in. client.shutdown(); } }
Alibaba Cloud SDK V1.0 (Não Recomendado)
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);
// Set the RAM role. This topic uses EcsRamRoleTest as an example.
String roleName = "EcsRamRoleTest";
// Create the credentials provider for the instance RAM role.
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());
}
}
}
Referências
Gerencie access credentials (Alibaba Cloud SDK V1.0)
Gerencie access credentials (Alibaba Cloud SDK V2.0)
-
Saiba mais sobre funções RAM: