全部產品
Search
文件中心

Simple Log Service:控制台內嵌及分享(新版)

更新時間:Sep 04, 2024

如果您需要將Log Service的查詢分析結果、儀錶盤等頁面,分享給其他人或者嵌入到第三方系統,可以通過本文產生免密且免登入的連結進行分享。本文將介紹詳細操作步驟。

背景資訊

Ticket是指一個短期有效令牌(Token),用於拼接免密且免登入連結,擷取連結的使用者無需登入阿里雲賬戶,就可以訪問指定的查詢分析頁面或儀錶盤頁面。

操作流程如下:

  1. 為RAM使用者授權。

  2. 準備分享連結。

  3. 調用CreateTicket介面擷取Ticket

  4. Ticket拼接到分享連結中,產生免密且免登入連結。

警告

產生的連結會繼承CreateTicket介面調用者在Log Service中已有的許可權,為避免使用主帳號調用介面而造成的資料安全風險,在該情境中強烈建議使用RAM使用者來調用CreateTicket介面,並為該RAM使用者佈建最小化的許可權範圍,具體參見下面的步驟一:為RAM使用者授權

產生免密且免登入的連結

步驟一:為RAM使用者授權

如果使用阿里雲主帳號,可跳過這步,直接前往步驟二。

  1. 建立RAM使用者

  2. 為RAM使用者授予指定資源(Project、Logstore)的許可權和調用CreateTicket介面的許可權。

    1. 授予指定資源許可權的步驟,請參見RAM自訂授權樣本

    2. 授予調用CreateTicket介面,具體操作步驟請參見為RAM使用者授權建立自訂權限原則

      {
          "Version": "1",
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": "log:CreateTicket",
                  "Resource": "acs:log:*:*:ticket/*"
              }
          ]
      }

步驟二:準備連結

  • 查詢分析頁面:

    https://sls.console.aliyun.com/lognext/project/<Project名稱>/logsearch/<日誌庫名稱>?slsRegion=<Project所在地區>&hideTopbar=true&hideSidebar=true&ignoreTabLocalStorage=true

    Project名稱參見管理Project,日誌庫名稱參見管理Logstore,Project所在地區參見服務存取點地區ID。

  • 查詢頁面:

    https://sls.console.aliyun.com/lognext/project/<Project名稱>/logsearch/<日誌庫名稱>?slsRegion=<Project所在地區>&isShare=true&hideTopbar=true&hideSidebar=true&ignoreTabLocalStorage=true
  • 儀錶盤頁面:

    重要

    儀錶盤ID為網頁連結上的ID,並非儀錶盤的展示名稱。儀錶盤免密分享也可以在控制台操作,具體步驟請參見儀錶盤免密分享

    https://sls.console.aliyun.com/lognext/project/<Project名稱>/dashboard/<儀錶盤ID>?slsRegion=<Project所在地區>&isShare=true&hideTopbar=true&hideSidebar=true&ignoreTabLocalStorage=true

步驟三:擷取票據Ticket

重要
  • 調用CreateTicket擷取票據Ticket,服務地址只能是華東2(上海)新加坡,但擷取的Ticket可以在各個地區使用。

  • 產生的票據Ticket只能使用一次,有效期間預設為一天,最長為30天。如果需要動態產生Ticket,請參見下面的如何動態產生Ticket?

image

步驟四:拼接免密且免登入連結

  1. 將步驟二的連結與票據Ticket拼接,產生免密且免登入訪問連結。

    https://sls.console.aliyun.com/lognext/project/<Project名稱>/dashboard/<儀錶盤ID>?slsRegion=<Project所在地區>&sls_ticket=eyJ***************.eyJ******************.KUT****************&isShare=true&hideTopbar=true&hideSidebar=true&ignoreTabLocalStorage=true
  2. 連結測試。您可以將產生的免登入連結輸入瀏覽器的地址欄進行測試。若可正常開啟Log Service控制台分享頁面,則說明已成功產生免登入連結。

    警告
    • 此處測試即為首次在瀏覽器中開啟免登入連結,測試完成後,票據Ticket會失效。您需要重新調用CreateTicket擷取新的票據Ticket。

    • 建議將連結複製到檔案中,然後傳輸檔案。如果直接在第三方軟體中發送連結,可能因為被第三方軟體讀取而失效。

常見問題

如何延長內嵌訪問時間?

延長內嵌訪問時間請參見控制台內嵌及分享(新版)延長訪問時間

如何動態產生Ticket?

如果在第三方系統中嵌入控制台頁面,則需要在應用程式中動態調用CreateTicket介面,以定期擷取Ticket。如果使用RAM使用者的長期存取金鑰調用介面,操作步驟簡單,但安全風險較高,建議使用具有臨時身份憑證(STS Token)的RAM角色調用介面,可以降低安全風險。

  1. 建立RAM使用者建立可信實體為阿里雲帳號的RAM角色

  2. 為RAM使用者授予STS的系統管理權限(AliyunSTSAssumeRoleAccess),為RAM角色授予調用CreateTicket介面的許可權Log Service的相關許可權,授權操作請參見為RAM角色授權RAM自訂授權樣本

  3. 使用RAM角色調用CreateTicket介面。

    1. 使用RAM使用者調用AssumeRole介面,擷取SecurityToken、AccessKeySecret和AccessKeyId。

    2. RAM使用者使用這三個參數扮演RAM角色,從而調用CreateTicket介面擷取Ticket。

      SDK樣本

      Java

      1. 添加Maven依賴。

        在Java專案的根目錄下,開啟pom.xml檔案,添加以下代碼:

            <dependency>
              <groupId>com.aliyun</groupId>
              <artifactId>sls20201230</artifactId>
              <version>5.2.1</version>
            </dependency>
            <dependency>
              <groupId>com.aliyun</groupId>
              <artifactId>tea-openapi</artifactId>
              <version>0.3.2</version>
            </dependency>
            <dependency>
              <groupId>com.aliyun</groupId>
              <artifactId>tea-console</artifactId>
              <version>0.0.1</version>
            </dependency>
            <dependency>
              <groupId>com.aliyun</groupId>
              <artifactId>tea-util</artifactId>
              <version>0.2.21</version>
            </dependency>
      2. 建立產生票據代碼。

        import com.aliyun.tea.*;
        
        public class Sample {
        
            /**
             * 使用AK&SK初始化帳號Client
             * @return Client
             * @throws Exception
             */
            public static com.aliyun.sls20201230.Client createClient() throws Exception {
                // 工程代碼泄露可能會導致 AccessKey 泄露,並威脅帳號下所有資源的安全性。以下程式碼範例僅供參考。
                // 建議使用更安全的 STS 方式。
                com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
                        // 必填,請確保代碼運行環境設定了環境變數 ALIBABA_CLOUD_ACCESS_KEY_ID。
                        .setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
                        // 必填,請確保代碼運行環境設定了環境變數 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
                        .setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
                // Endpoint 請參考 https://api.aliyun.com/product/Sls
                config.endpoint = "cn-shanghai.log.aliyuncs.com";
                return new com.aliyun.sls20201230.Client(config);
            }
        
            public static void main(String[] args_) throws Exception {
                java.util.List<String> args = java.util.Arrays.asList(args_);
                com.aliyun.sls20201230.Client client = Sample.createClient();
                com.aliyun.sls20201230.models.CreateTicketRequest createTicketRequest = new com.aliyun.sls20201230.models.CreateTicketRequest();
                com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
                java.util.Map<String, String> headers = new java.util.HashMap<>();
                try {
                    com.aliyun.sls20201230.models.CreateTicketResponse resp = client.createTicketWithOptions(createTicketRequest, headers, runtime);
                    com.aliyun.teaconsole.Client.log(com.aliyun.teautil.Common.toJSONString(resp));
                } catch (TeaException error) {
                    // 此處僅做列印展示,請謹慎對待異常處理,在工程專案中切勿直接忽略異常。
                    // 錯誤 message
                    System.out.println(error.getMessage());
                    // 診斷地址
                    System.out.println(error.getData().get("Recommend"));
                    com.aliyun.teautil.Common.assertAsString(error.message);
                } catch (Exception _error) {
                    TeaException error = new TeaException(_error.getMessage(), _error);
                    // 此處僅做列印展示,請謹慎對待異常處理,在工程專案中切勿直接忽略異常。
                    // 錯誤 message
                    System.out.println(error.getMessage());
                    // 診斷地址
                    System.out.println(error.getData().get("Recommend"));
                    com.aliyun.teautil.Common.assertAsString(error.message);
                }
            }
        }

      Python

      # -*- coding: utf-8 -*-
      # This file is auto-generated, don't edit it. Thanks.
      import os
      import sys
      
      from typing import List
      
      from alibabacloud_sls20201230.client import Client as Sls20201230Client
      from alibabacloud_tea_openapi import models as open_api_models
      from alibabacloud_sls20201230 import models as sls_20201230_models
      from alibabacloud_tea_util import models as util_models
      from alibabacloud_tea_util.client import Client as UtilClient
      
      
      class Sample:
          def __init__(self):
              pass
      
          @staticmethod
          def create_client() -> Sls20201230Client:
              """
              使用AK&SK初始化帳號Client
              @return: Client
              @throws Exception
              """
              # 工程代碼泄露可能會導致 AccessKey 泄露,並威脅帳號下所有資源的安全性。以下程式碼範例僅供參考。
              # 建議使用更安全的 STS 方式,更多鑒權訪問方式請參見:https://help.aliyun.com/document_detail/378659.html。
              config = open_api_models.Config(
                  # 必填,請確保代碼運行環境設定了環境變數 ALIBABA_CLOUD_ACCESS_KEY_ID。,
                  access_key_id=os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID'],
                  # 必填,請確保代碼運行環境設定了環境變數 ALIBABA_CLOUD_ACCESS_KEY_SECRET。,
                  access_key_secret=os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET'],
                  # 必填,請確保代碼運行環境設定了安全性權杖SecurityToken
                  security_token=os.environ['ALIBABA_CLOUD_Token']
              )
              # Endpoint 請參考 https://api.aliyun.com/product/Sls
              config.endpoint = f'cn-shanghai.log.aliyuncs.com'
              return Sls20201230Client(config)
      
          @staticmethod
          def main(
              args: List[str],
          ) -> None:
              client = Sample.create_client()
              create_ticket_request = sls_20201230_models.CreateTicketRequest(
                  expiration_time=300
              )
              runtime = util_models.RuntimeOptions()
              headers = {}
              try:
                  # 複製代碼運行請自行列印 API 的傳回值
                  client.create_ticket_with_options(create_ticket_request, headers, runtime)
              except Exception as error:
                  # 此處僅做列印展示,請謹慎對待異常處理,在工程專案��切勿直接忽略異常。
                  # 錯誤 message
                  print(error.message)
                  # 診斷地址
                  print(error.data.get("Recommend"))
                  UtilClient.assert_as_string(error.message)
      
          @staticmethod
          async def main_async(
              args: List[str],
          ) -> None:
              client = Sample.create_client()
              create_ticket_request = sls_20201230_models.CreateTicketRequest(
                  expiration_time=300
              )
              runtime = util_models.RuntimeOptions()
              headers = {}
              try:
                  # 複製代碼運行請自行列印 API 的傳回值
                  await client.create_ticket_with_options_async(create_ticket_request, headers, runtime)
              except Exception as error:
                  # 此處僅做列印展示,請謹慎對待異常處理,在工程專案中切勿直接忽略異常。
                  # 錯誤 message
                  print(error.message)
                  # 診斷地址
                  print(error.data.get("Recommend"))
                  UtilClient.assert_as_string(error.message)
      
      
      if __name__ == '__main__':
          Sample.main(sys.argv[1:])
  4. 根據返回的Ticket拼接出不同許可權範圍的免密連結。

SDK請求CreateTicket報錯:InvalidMethod

服務地址Endpoint只能是華東2(上海)或新加坡,但擷取的Ticket可以在各個地區使用。

Ticket限制

  • Ticket預設有效時間長度為24小時,最長為30天。

  • 每個Ticket只能被同一個瀏覽器或主機訪問。例如在瀏覽器A中開啟的免密連結可以持續訪問,但是在瀏覽器B中無法開啟連結。

  • 產生Ticket的總數沒有限制,CreateTicket QPS限制為每使用者10次/s。

第三方cookie限制

使用控制台內嵌及分享(新版)不依賴第三方cookie。

內嵌頁面載入速度

使用控制台內嵌及分享(新版)相比老版,有更高的載入速度。

需要開多個內嵌頁面,每個內嵌頁面許可權相同

  1. 可以產生一個Ticket,然後在同一個瀏覽器中重新整理頁面。當Ticket到期時,重建新的Ticket,然後替換所有Tab頁的Ticket。

  2. 不同瀏覽器或電腦會被視為不同的使用者,因為一個ticket只能使用一次,所以會報錯:

    {"code":"TicketUnavailable","message":"There are no more tickets available.","requestId":"xxxxxx","success":false}

需要開多個內嵌頁面,每個內嵌頁面許可權不同

  1. 可以產生多個Ticket,每個Ticket關聯不同的許可權,但只有最後一個Ticket對應的內嵌頁面可以重新整理,原因是只能記錄一個cookie作為當前使用者的憑證,對應最後產生的Ticket,每次重新整理會根據該cookie作為當前的使用者。

  2. 在不重新整理頁面的情況下,不需要用到cookie,仍然可以切換標籤頁並操作不同內嵌頁面的內容,對應的許可權也不同。

  3. 此時重新整理非最後一個ticket對應的內嵌頁面,會報錯:

    {"code":"TicketUnavailable","message":"There are no more tickets available.","requestId":"xxxxxx","success":false}