全部產品
Search
文件中心

Simple Log Service:通過ECS無需AccessKey訪問Log ServiceSDK

更新時間:Oct 25, 2024

當ECS執行個體或部署在ECS執行個體上的應用需要訪問其他雲資源時,必須配置訪問憑證,阿里雲服務會通過訪問憑證驗證您的身份資訊和存取權限。執行個體RAM角色允許您將一個角色關聯到ECS執行個體,實現在執行個體內部自動擷取並重新整理臨時訪問憑證,無需直接暴露AccessKey,減少密鑰泄露的風險。同時,也可藉助RAM角色精細化控制資源存取權限,避免許可權資源過度分派。本文介紹在ECS中無需AccessKey直接存取Log ServiceSDK的操作步驟。

說明
  • 執行個體RAM角色是一種可信實體為阿里雲服務的RAM角色,即允許雲端服務扮演的角色,用於解決跨服務訪問問題。關於RAM角色的詳細說明,請參見什麼是RAM角色

  • 阿里雲存取金鑰(AccessKey)是調用API訪問雲資源的安全口令,您可以使用AccessKey簽名API請求內容以通過服務端的安全驗證。關於AccessKey的詳細說明,請參見存取金鑰

  • Log Service自訂權限原則資訊請參見RAM自訂授權樣本

使用限制

  • 目前僅Java SDKGo SDK支援ECS無AccessKey訪問Log ServiceSDK。

  • ECS執行個體的網路類型必須是Virtual Private Cloud。

  • 一台ECS執行個體只能授予一個執行個體RAM角色。

步驟一:建立ECS執行個體RAM角色並授予給ECS

通過控制台建立和授予

  1. 登入RAM控制台,建立執行個體RAM角色。

    建立可信實體為阿里雲服務的RAM角色。

    選擇身份管理 > 角色,單擊建立角色,按照介面提示完成角色建立。注意以下參數(其他參數按需填寫,可參見建立普通服務角色):

    • 可信實體類型:選擇阿里雲服務

    • 角色類型:選擇普通服務角色

    • 受信服務:選擇雲端服務器

  2. 為已建立的執行個體RAM角色授權。

    將系統策略或已建立的自訂權限原則授權給RAM使用者,使其擁有相關的資源訪問或操作許可權。例如,給角色賦予Log Service的唯讀許可權(AliyunLogReadOnlyAccess)。

    說明

    支援添加系統策略自訂策略。若系統策略不滿足您的需求,可建立自訂策略。具體操作,請參見建立自訂權限原則

  3. 授予執行個體RAM角色給ECS執行個體。

    1. 登入ECS管理主控台

    2. 在左側導覽列,選擇執行個體與鏡像 > 執行個體

    3. 在頁面左側頂部,選擇目標資源所在的資源群組和地區。地區

    4. 找到要操作的ECS執行個體,選擇表徵圖 > 執行個體設定 > 授予/收回RAM角色

    5. 在對話方塊中,選擇建立好的執行個體RAM角色,單擊確定

通過API建立和授予

  1. 建立並配置執行個體RAM角色

    1. 調用CreateRole介面建立執行個體RAM角色。

      按如下原則設定參數AssumeRolePolicyDocument

      {
           "Statement": [
           {
               "Action": "sts:AssumeRole",
               "Effect": "Allow",
               "Principal": {
               "Service": [
               "ecs.aliyuncs.com"
               ]
               }
           }
           ],
           "Version": "1"
       }
    2. (可選)調用CreatePolicy介面建立權限原則。

      如果您已有可用權限原則,可跳過該步驟。

      PolicyDocument(權限原則)需按如下設定:

      {
           "Statement": [
               {
               "Action": [
                   "oss:Get*",
                   "oss:List*"
               ],
               "Effect": "Allow",
               "Resource": "*"
               }
           ],
           "Version": "1"
       }
  2. 調用AttachPolicyToRole介面為執行個體RAM角色授權。

  3. 調用AttachInstanceRamRole介面將RAM角色授予ECS執行個體。

步驟二:訪問Log ServiceSDK

Java

Java SDK

  1. 在Maven工程中使用Log ServiceJava SDK,只需在pom.xml中加入相應依賴。更多資訊,請參見Java SDK

    重要

    Java SDK最低版本號碼為0.6.110。

    <dependency>
        <groupId>com.aliyun.openservices</groupId>
        <artifactId>aliyun-log</artifactId>
        <version>0.6.110</version>
    </dependency>
  2. Client類入參取消AccessKey,傳入步驟一建立的執行個體RAM角色名稱

    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 {
        // 這裡將RoleName替換成上面建立的 ram 角色名稱
        Client client = new Client("cn-hangzhou.log.aliyuncs.com", "RoleName");
        GetProjectResponse resp = client.GetProject("your-project");
        System.out.println(resp.GetProjectDescription());
      }
    }

Java Producer

  1. 在Maven工程中使用Log ServiceAliyun Log Java Producer,只需在pom.xml中加入相應依賴。更多資訊,請參見Aliyun Log Java Producer

    重要

    Java Producer最低版本號碼為0.3.22。

    <dependency>
        <groupId>com.aliyun.openservices</groupId>
        <artifactId>aliyun-log-producer</artifactId>
        <version>0.3.22</version>
    </dependency>
  2. 配置記錄項目ProjectConfig入參取消AccessKey,傳入步驟一建立的執行個體RAM角色名稱

    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";
            // 配置ProducerConfig
            Config producerConfig = new ProducerConfig();
            // 建立Producer
            Producer producer = new LogProducer(new ProducerConfig());
            // 這裡將 your-ecs-ram-role-name 替換成上面建立的 ram 角色名稱
            CredentialsProvider provider = new ECSRoleCredentialsProvider("your-ecs-ram-role-name");
            // 配置記錄項目
            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

  1. 在Maven工程中使用Log ServiceAliyun LOG Java Consumer,只需在pom.xml中加入相應依賴。更多資訊,請參見通過消費組消費資料

    重要

    Java Consumer最低版本號碼為0.6.47。

    <dependency>
      <groupId>com.aliyun.openservices</groupId>
      <artifactId>loghub-client-lib</artifactId>
      <version>0.6.47</version>
    </dependency>
  2. 建立消費者LogHubConfig入參取消AccessKey,傳入步驟一建立的執行個體RAM角色名稱

    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 {
            // 這裡將 your-ecs-ram-role-name 替換成上面建立的 ram 角色名稱
            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

重要

無AccessKey訪問Log ServiceGo SDK,Go SDK最低版本號碼為 0.1.83。升級Go SDK,請參見安裝或升級SDK

Go SDK

provider入參傳入步驟一建立的執行個體RAM角色名稱

package main

import (
	"fmt"

	sls "github.com/aliyun/aliyun-log-go-sdk"
)

func main() {
        // Log Service的服務入口。此處以杭州為例,其它地區請根據實際情況填寫。
	Endpoint := "cn-chengdu.log.aliyuncs.com"
	// 這裡將 your-ecs-ram-role-name 替換成上面建立的 ram 角色名稱
	provider := sls.NewEcsRamRoleCredentialsProvider("your-ecs-ram-role-name")
	// 建立Log ServiceClient。
	client := sls.CreateNormalInterfaceV2(Endpoint, provider)
	resp, err := client.GetProject("your-project")
	if err != nil {
		panic(err)
	}
	fmt.Println(resp.Description)
}

Go Producer

配置ProducerConfigprovider入參傳入步驟一建立的執行個體RAM角色名稱

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"
    // 這裡將 your-ecs-ram-role-name 替換成上面建立的 ram 角色名稱
	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

CredentialsProvider入參傳入步驟一建立的執行個體RAM角色名稱

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",
		// 這裡將 your-ecs-ram-role-name 替換成上面建立的 ram 角色名稱
		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()
	}
}

// 資料消費處理邏輯
func process(shardId int, logGroupList *sls.LogGroupList, checkpointTracker consumerLibrary.CheckPointTracker) (string, error) {
	fmt.Println(shardId, logGroupList)
	checkpointTracker.SaveCheckPoint(false)
	return "", nil
}

相關文檔