Al vincular un instance RAM role a una instancia de ECS, puede utilizar el SDK de Simple Log Service (SLS) sin necesidad de un AccessKey. La instancia obtiene y renueva automáticamente las credenciales temporales, lo que elimina el riesgo de fugas de AccessKey y permite un control de acceso detallado.
Un instance RAM role utiliza un servicio de Alibaba Cloud como entidad de confianza, lo que permite que dicho servicio asuma el rol para el acceso entre servicios. Para obtener más información, consulte What is a RAM role?.
Un par de AccessKey es una credencial de seguridad que se usa para firmar solicitudes de API con el fin de verificar la identidad y los permisos. Para obtener más información, consulte AccessKey pair.
Para más información sobre las políticas personalizadas de Simple Log Service, consulte RAM custom policy examples.
Limitaciones
Esta función solo es compatible con Simple Log Service SDK for Java y Simple Log Service SDK for Go.
La instancia de ECS debe residir en una VPC.
Solo se puede vincular un rol de RAM a cada instancia de ECS.
Paso 1: Crear y vincular un instance RAM role
Console
-
Inicie sesión en la consola de RAM y cree un rol de RAM que utilice un servicio de Alibaba Cloud como entidad principal.
Seleccione Identities > Roles y haga clic en Create Role. Siga las instrucciones en pantalla para crear el rol y preste atención a los siguientes parámetros. Configure el resto de los parámetros según sus necesidades. Para obtener más información, consulte Create a common service role.
Select Trusted Entity: Seleccione Alibaba Cloud Service.
En Role Type, seleccione Normal Service Role. A continuación, en la lista desplegable Trusted Service, seleccione ECS.
-
Otorgue permisos al instance RAM role.
Vincule una política del sistema o personalizada al rol de RAM para conceder los permisos necesarios. Por ejemplo, vincule la política AliyunLogReadOnlyAccess para otorgar acceso de solo lectura a Simple Log Service.
NotaPuede agregar una System Policy o una Custom Policy. Si las políticas del sistema no cumplen con sus requisitos, puede crear una política personalizada. Para obtener más información, consulte Create a custom policy.
-
Vincule el instance RAM role a una instancia de ECS.
Inicie sesión en la consola de ECS.
En el panel de navegación izquierdo, seleccione .
En la barra de navegación superior, seleccione la región y el resource group al que pertenece la instancia de destino.
Localice la instancia de ECS de destino y, en la columna Actions, seleccione .
En el cuadro de diálogo que aparece, seleccione el instance RAM role que creó y haga clic en OK.
API
-
Cree y configure un instance RAM role.
-
Llame a CreateRole para crear un instance RAM role.
Establezca el parámetro AssumeRolePolicyDocument con la siguiente política:
{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": [ "ecs.aliyuncs.com" ] } } ], "Version": "1" } -
(Opcional) Llame a CreatePolicy para crear una política de permisos.
Puede omitir este paso si ya cuenta con una política de permisos disponible.
Configure el parámetro
PolicyDocumentde la siguiente manera:{ "Statement": [ { "Action": [ "oss:Get*", "oss:List*" ], "Effect": "Allow", "Resource": "*" } ], "Version": "1" }
-
Llame a la operación AttachPolicyToRole para vincular la política de permisos al instance RAM role.
Llame a la operación AttachInstanceRamRole para vincular el instance RAM role a la instancia de ECS.
Paso 2: Acceder al SDK de SLS
Java
Java SDK
-
Para usar el SDK de Simple Log Service para Java en un proyecto Maven, agregue la siguiente dependencia al archivo pom.xml. Para obtener más información, consulte Simple Log Service SDK for Java.
ImportanteLa versión mínima obligatoria del SDK de Simple Log Service para Java es la 0.6.110.
<dependency> <groupId>com.aliyun.openservices</groupId> <artifactId>aliyun-log</artifactId> <version>0.6.110</version> </dependency> -
Para la clase
Client, pase the name of the instance RAM role that you created in Step 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 Aliyun Log Java Producer en un proyecto Maven, agregue la siguiente dependencia al archivo pom.xml. Para obtener más información, consulte Aliyun Log Java Producer.
ImportanteLa versión mínima obligatoria de Aliyun Log Java Producer es la 0.3.22.
<dependency> <groupId>com.aliyun.openservices</groupId> <artifactId>aliyun-log-producer</artifactId> <version>0.3.22</version> </dependency> -
En Configure a Log Project, especifique the name of the instance RAM role that you created in Step 1 para el 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 usar Aliyun Log Java Consumer en un proyecto Maven, agregue la siguiente dependencia al archivo pom.xml. Para obtener más información, consulte Use consumer groups to consume logs.
ImportanteLa versión mínima obligatoria de Aliyun Log Java Consumer es la 0.6.47.
<dependency> <groupId>com.aliyun.openservices</groupId> <artifactId>loghub-client-lib</artifactId> <version>0.6.47</version> </dependency> -
Para create a consumer, establezca el parámetro
LogHubConfigen the name of the instance RAM role that you created in Step 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 utilizar el SDK de Simple Log Service para Go sin AccessKey, debe usar la versión 0.1.83 o posterior. Para actualizar el SDK, consulte Install or upgrade the SDK.
Go SDK
provider especifica the name of the instance RAM role that you created in Step 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
En Configure ProducerConfig, establezca el parámetro provider en name of the instance RAM role that you created in Step 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 el parámetro de entrada CredentialsProvider, pase name of the instance RAM role that you created in Step 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
}
Documentación relacionada
Si su aplicación está desplegada en una instancia de ECS de Alibaba Cloud y necesita acceder a Key Management Service (KMS), puede use an instance RAM role to securely access KMS.
Si una instancia de ECS ya no requiere ciertos permisos de acceso a recursos, puede revoke permissions from a RAM role.
Codificar directamente un par de AccessKey en su código representa un riesgo de seguridad si el repositorio no se gestiona adecuadamente. Para obtener más información, consulte Use credentials to access Alibaba Cloud OpenAPI.
> Instance Settings > Attach/Detach RAM Role