Ao anexar uma função RAM de instância a uma instância ECS, você usa o Simple Log Service (SLS) SDK sem precisar de um AccessKey. A instância obtém e renova automaticamente as credenciais temporárias, eliminando o risco de vazamento do AccessKey e permitindo controle de acesso refinado.
Uma função RAM de instância usa um serviço da Alibaba Cloud como entidade confiável, permitindo que um serviço de nuvem assuma a função para acesso entre serviços. Para mais informações, consulte O que é uma função RAM?.
Um par de AccessKey é uma credencial de segurança usada para assinar solicitações de API e verificar identidade e permissões. Para mais informações, consulte Par de AccessKey.
Para obter mais detalhes sobre políticas personalizadas do Simple Log Service, consulte Exemplos de política personalizada do RAM.
Limitações
Este recurso tem suporte apenas no Simple Log Service SDK for Java e no Simple Log Service SDK for Go.
A instância ECS deve residir em uma VPC.
É possível anexar apenas uma função RAM por instância ECS.
Etapa 1: Crie e anexe uma função RAM de instância
Console
-
Faça login no console do RAM e crie uma função RAM que use um serviço da Alibaba Cloud como entidade principal.
Selecione Identities > Roles e clique em Create Role. Siga as instruções na tela para criar a função, observando os parâmetros abaixo. Configure os demais parâmetros conforme necessário. Para mais informações, consulte Criar uma função de serviço comum.
Select Trusted Entity: Selecione Alibaba Cloud Service.
Em Role Type, selecione Normal Service Role. Em seguida, na lista suspensa Trusted Service, escolha ECS.
-
Conceda permissões à função RAM de instância.
Anexe uma política do sistema ou personalizada à função RAM para conceder as permissões necessárias. Por exemplo, anexe a política AliyunLogReadOnlyAccess para garantir acesso somente leitura ao Simple Log Service.
NotaAdicione uma System Policy ou uma Custom Policy. Caso as políticas do sistema não atendam aos seus requisitos, crie uma política personalizada. Para mais informações, consulte Criar uma política personalizada.
-
Anexe a função RAM de instância a uma instância ECS.
Faça login no console do ECS.
No painel de navegação à esquerda, selecione .
Na barra de navegação superior, selecione a região e o grupo de recursos aos quais a instância de destino pertence.
Localize a instância ECS de destino e selecione na coluna Actions.
Na caixa de diálogo exibida, selecione a função RAM de instância criada e clique em OK.
API
-
Crie e configure uma função RAM de instância.
-
Chame a operação CreateRole para criar uma função RAM de instância.
Defina o parâmetro AssumeRolePolicyDocument com a seguinte política:
{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": [ "ecs.aliyuncs.com" ] } } ], "Version": "1" } -
(Opcional) Chame a operação CreatePolicy para criar uma política de permissão.
Ignore esta etapa se já possuir uma política de permissão disponível.
Configure o parâmetro
PolicyDocumentda seguinte forma:{ "Statement": [ { "Action": [ "oss:Get*", "oss:List*" ], "Effect": "Allow", "Resource": "*" } ], "Version": "1" }
-
Execute a operação AttachPolicyToRole para anexar a política de permissão à função RAM de instância.
Execute a operação AttachInstanceRamRole para vincular a função RAM de instância à instância ECS.
Etapa 2: Acessar o SLS SDK
Java
Java SDK
-
Para usar o Simple Log Service SDK for Java em um projeto Maven, adicione a dependência abaixo ao arquivo pom.xml. Para mais informações, consulte Simple Log Service SDK for Java.
ImportanteA versão mínima exigida do Simple Log Service SDK for Java é a 0.6.110.
<dependency> <groupId>com.aliyun.openservices</groupId> <artifactId>aliyun-log</artifactId> <version>0.6.110</version> </dependency> -
Na classe
Client, passe o nome da função RAM de instância criada na Etapa 1 como parâmetro de entrada.import com.aliyun.openservices.log.exception.LogException; import com.aliyun.openservices.log.response.GetProjectResponse; public class Main { public static void main(String[] args) throws LogException { // Replace RoleName with the name of the RAM role that you created. Client client = new Client("cn-hangzhou.log.aliyuncs.com", "RoleName"); GetProjectResponse resp = client.GetProject("your-project"); System.out.println(resp.GetProjectDescription()); } }
Java Producer
-
Para usar o Aliyun Log Java Producer em um projeto Maven, inclua a seguinte dependência no arquivo pom.xml. Consulte Aliyun Log Java Producer para mais detalhes.
ImportanteA versão mínima necessária do Aliyun Log Java Producer é a 0.3.22.
<dependency> <groupId>com.aliyun.openservices</groupId> <artifactId>aliyun-log-producer</artifactId> <version>0.3.22</version> </dependency> -
Em Configurar um projeto de log, especifique o nome da função RAM de instância criada na Etapa 1 para o parâmetro
ProjectConfig.import com.aliyun.openservices.aliyun.log.producer.*; import com.aliyun.openservices.aliyun.log.producer.errors.ProducerException; import com.aliyun.openservices.log.common.LogItem; import com.aliyun.openservices.log.common.auth.CredentialsProvider; import com.aliyun.openservices.log.common.auth.ECSRoleCredentialsProvider; public class ExampleUsage { public static void main(String[] args) throws ProducerException, InterruptedException { String endpoint = "cn-hangzhou.log.aliyuncs.com"; String project = "your-project"; String logStore = "your-logstore"; // Configure ProducerConfig. Config producerConfig = new ProducerConfig(); // Create a producer. Producer producer = new LogProducer(new ProducerConfig()); // Replace your-ecs-ram-role-name with the name of the RAM role that you created. CredentialsProvider provider = new ECSRoleCredentialsProvider("your-ecs-ram-role-name"); // Configure the project. ProjectConfig projectConfig = new ProjectConfig(project, endpoint, provider, null); producer.putProjectConfig(projectConfig); // Send logs. producer.send(project, logStore, buildLogItem()); producer.send(project, logStore, null, null, buildLogItem()); producer.send(project, logStore, "", "", buildLogItem()); producer.close(); } public static LogItem buildLogItem() { LogItem logItem = new LogItem(); logItem.PushBack("k1", "v1"); logItem.PushBack("k2", "v2"); return logItem; } }
Java Consumer
-
Para integrar o Aliyun Log Java Consumer em um projeto Maven, adicione a dependência abaixo ao arquivo pom.xml. Veja também Usar grupos de consumidores para consumir logs.
ImportanteA versão mínima requerida do Aliyun Log Java Consumer é a 0.6.47.
<dependency> <groupId>com.aliyun.openservices</groupId> <artifactId>loghub-client-lib</artifactId> <version>0.6.47</version> </dependency> -
Para criar um consumidor, defina o parâmetro
LogHubConfigcomo o nome da função RAM de instância criada na Etapa 1.import com.aliyun.openservices.log.common.auth.ECSRoleCredentialsProvider; import com.aliyun.openservices.log.common.auth.CredentialsProvider; import com.aliyun.openservices.loghub.client.ClientWorker; import com.aliyun.openservices.loghub.client.config.LogHubConfig; import com.aliyun.openservices.loghub.client.exceptions.LogHubClientWorkerException; public class Main { private static String Endpoint = "cn-hangzhou.log.aliyuncs.com"; private static String Project = "your-project"; private static String Logstore = "your-logstore"; private static String ConsumerGroup = "consumerGroupX"; public static void main(String[] args) throws LogHubClientWorkerException, InterruptedException { // Replace your-ecs-ram-role-name with the name of the RAM role that you created. CredentialsProvider provider = new ECSRoleCredentialsProvider("your-ecs-ram-role-name"); LogHubConfig config = new LogHubConfig(ConsumerGroup, "consumer_1", Endpoint, Project, Logstore, provider, LogHubConfig.ConsumePosition.BEGIN_CURSOR); config.setMaxFetchLogGroupSize(1000); ClientWorker worker = new ClientWorker(new SampleLogHubProcessorFactory(), config); Thread thread = new Thread(worker); thread.start(); Thread.sleep(60 * 60 * 1000); worker.shutdown(); Thread.sleep(30 * 1000); } }
Go
Para usar o Simple Log Service SDK for Go sem um AccessKey, utilize a versão 0.1.83 ou posterior. Para atualizar o SDK, consulte Instale ou atualize o SDK.
Go SDK
O parâmetro provider especifica o nome da função RAM de instância criada na Etapa 1.
package main
import (
"fmt"
sls "github.com/aliyun/aliyun-log-go-sdk"
)
func main() {
// The endpoint of Simple Log Service. This example uses the China (Chengdu) region. Replace the value with the actual endpoint.
Endpoint := "cn-chengdu.log.aliyuncs.com"
// Replace your-ecs-ram-role-name with the name of the RAM role that you created.
provider := sls.NewEcsRamRoleCredentialsProvider("your-ecs-ram-role-name")
// Create a Simple Log Service client.
client := sls.CreateNormalInterfaceV2(Endpoint, provider)
resp, err := client.GetProject("your-project")
if err != nil {
panic(err)
}
fmt.Println(resp.Description)
}
Go Producer
Em Configurar ProducerConfig, defina o parâmetro provider como o nome da função RAM de instância criada na Etapa 1.
package main
import (
"fmt"
"os"
"os/signal"
"sync"
"time"
sls "github.com/aliyun/aliyun-log-go-sdk"
"github.com/aliyun/aliyun-log-go-sdk/producer"
"github.com/gogo/protobuf/proto"
)
func main() {
producerConfig := producer.GetDefaultProducerConfig()
producerConfig.Endpoint = "cn-hangzhou.log-aliyuncs.com"
// Replace your-ecs-ram-role-name with the name of the RAM role that you created.
provider := sls.NewEcsRamRoleCredentialsProvider("your-ecs-ram-role-name")
producerConfig.CredentialsProvider = provider
producerInstance := producer.InitProducer(producerConfig)
ch := make(chan os.Signal)
signal.Notify(ch, os.Kill, os.Interrupt)
producerInstance.Start()
var m sync.WaitGroup
for i := 0; i < 10; i++ {
m.Add(1)
go func() {
defer m.Done()
for i := 0; i < 1000; i++ {
log := producer.GenerateLog(uint32(time.Now().Unix()), map[string]string{"content": "test", "content2": fmt.Sprintf("%v", i)})
err := producerInstance.SendLog("log-project", "log-store", "topic", "127.0.0.1", log)
if err != nil {
fmt.Println(err)
}
}
}()
}
m.Wait()
fmt.Println("Send completion")
if _, ok := <-ch; ok {
fmt.Println("Get the shutdown signal and start to shut down")
producerInstance.Close(60000)
}
}
Go Consumer
Para o parâmetro de entrada CredentialsProvider, informe o nome da função RAM de instância criada na Etapa 1.
package main
import (
"fmt"
"os"
"os/signal"
"syscall"
sls "github.com/aliyun/aliyun-log-go-sdk"
consumerLibrary "github.com/aliyun/aliyun-log-go-sdk/consumer"
"github.com/go-kit/kit/log/level"
)
func main() {
option := consumerLibrary.LogHubConfig{
Endpoint: "cn-hangzhou.log-aliyuncs.com",
// Replace your-ecs-ram-role-name with the name of the RAM role that you created.
CredentialsProvider: sls.NewEcsRamRoleCredentialsProvider("your-ecs-ram-role-name"),
Project: "your-project",
Logstore: "your-logstore",
ConsumerGroupName: "your-consumer-group",
ConsumerName: "your-consumer-group-consumer-1",
CursorPosition: consumerLibrary.END_CURSOR,
}
consumerWorker := consumerLibrary.InitConsumerWorkerWithCheckpointTracker(option, process)
ch := make(chan os.Signal, 1)
signal.Notify(ch, syscall.SIGINT, syscall.SIGTERM)
consumerWorker.Start()
if _, ok := <-ch; ok {
level.Info(consumerWorker.Logger).Log("msg", "get stop signal, start to stop consumer worker", "consumer worker name", option.ConsumerName)
consumerWorker.StopAndWait()
}
}
// Implement the data consumption logic.
func process(shardId int, logGroupList *sls.LogGroupList, checkpointTracker consumerLibrary.CheckPointTracker) (string, error) {
fmt.Println(shardId, logGroupList)
checkpointTracker.SaveCheckPoint(false)
return "", nil
}
Documentação relacionada
Caso sua aplicação esteja implantada em uma instância ECS da Alibaba Cloud e precise acessar o Key Management Service (KMS), use uma função RAM de instância para acessar o KMS com segurança.
Se uma instância ECS não necessitar mais de determinadas permissões de acesso a recursos, revogue-as da função RAM correspondente.
Codificar um par de AccessKey diretamente no código gera riscos de segurança caso o repositório não seja gerenciado adequadamente. Para saber mais, consulte Usar credenciais para acessar a OpenAPI da Alibaba Cloud.
> Instance Settings > Attach/Detach RAM Role