如果您需要將Log Service的查詢分析結果、儀錶盤等頁面,分享給其他人或者嵌入到第三方系統,可以通過本文產生免密且免登入的連結進行分享。本文將介紹詳細操作步驟。
背景資訊
Ticket是指一個短期有效令牌(Token),用於拼接免密且免登入連結,擷取連結的使用者無需登入阿里雲賬戶,就可以訪問指定的查詢分析頁面或儀錶盤頁面。
操作流程如下:
為RAM使用者授權。
準備分享連結。
調用CreateTicket
介面擷取Ticket
。
用Ticket
拼接到分享連結中,產生免密且免登入連結。
警告 產生的連結會繼承CreateTicket
介面調用者在Log Service中已有的許可權,為避免使用主帳號調用介面而造成的資料安全風險,在該情境中強烈建議使用RAM使用者來調用CreateTicket
介面,並為該RAM使用者佈建最小化的許可權範圍,具體參見下面的步驟一:為RAM使用者授權。
產生免密且免登入的連結
步驟一:為RAM使用者授權
如果使用阿里雲主帳號,可跳過這步,直接前往步驟二。
建立RAM使用者。
為RAM使用者授予指定資源(Project、Logstore)的許可權和調用CreateTicket介面的許可權。
授予指定資源許可權的步驟,請參見RAM自訂授權樣本。
授予調用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
步驟四:拼接免密且免登入連結
將步驟二的連結與票據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
連結測試。您可以將產生的免登入連結輸入瀏覽器的地址欄進行測試。若可正常開啟Log Service控制台分享頁面,則說明已成功產生免登入連結。
常見問題
如何延長內嵌訪問時間?
延長內嵌訪問時間請參見控制台內嵌及分享(新版)延長訪問時間。
如何動態產生Ticket?
如果在第三方系統中嵌入控制台頁面,則需要在應用程式中動態調用CreateTicket
介面,以定期擷取Ticket。如果使用RAM使用者的長期存取金鑰調用介面,操作步驟簡單,但安全風險較高,建議使用具有臨時身份憑證(STS Token)的RAM角色調用介面,可以降低安全風險。
建立RAM使用者和建立可信實體為阿里雲帳號的RAM角色。
為RAM使用者授予STS的系統管理權限(AliyunSTSAssumeRoleAccess),為RAM角色授予調用CreateTicket介面的許可權和Log Service的相關許可權,授權操作請參見為RAM角色授權和RAM自訂授權樣本。
使用RAM角色調用CreateTicket介面。
使用RAM使用者調用AssumeRole介面,擷取SecurityToken、AccessKeySecret和AccessKeyId。
RAM使用者使用這三個參數扮演RAM角色,從而調用CreateTicket介面擷取Ticket。
SDK樣本
Java
添加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>
建立產生票據代碼。
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:])
根據返回的Ticket拼接出不同許可權範圍的免密連結。
SDK請求CreateTicket報錯:InvalidMethod
服務地址Endpoint只能是華東2(上海)或新加坡,但擷取的Ticket可以在各個地區使用。
Ticket限制
Ticket預設有效時間長度為24小時,最長為30天。
每個Ticket只能被同一個瀏覽器或主機訪問。例如在瀏覽器A中開啟的免密連結可以持續訪問,但是在瀏覽器B中無法開啟連結。
產生Ticket的總數沒有限制,CreateTicket QPS限制為每使用者10次/s。
第三方cookie限制
使用控制台內嵌及分享(新版)不依賴第三方cookie。
內嵌頁面載入速度
使用控制台內嵌及分享(新版)相比老版,有更高的載入速度。
需要開多個內嵌頁面,每個內嵌頁面許可權相同
可以產生一個Ticket,然後在同一個瀏覽器中重新整理頁面。當Ticket到期時,重建新的Ticket,然後替換所有Tab頁的Ticket。
不同瀏覽器或電腦會被視為不同的使用者,因為一個ticket只能使用一次,所以會報錯:
{"code":"TicketUnavailable","message":"There are no more tickets available.","requestId":"xxxxxx","success":false}
需要開多個內嵌頁面,每個內嵌頁面許可權不同
可以產生多個Ticket,每個Ticket關聯不同的許可權,但只有最後一個Ticket對應的內嵌頁面可以重新整理,原因是只能記錄一個cookie作為當前使用者的憑證,對應最後產生的Ticket,每次重新整理會根據該cookie作為當前的使用者。
在不重新整理頁面的情況下,不需要用到cookie,仍然可以切換標籤頁並操作不同內嵌頁面的內容,對應的許可權也不同。
此時重新整理非最後一個ticket對應的內嵌頁面,會報錯:
{"code":"TicketUnavailable","message":"There are no more tickets available.","requestId":"xxxxxx","success":false}