控制台内嵌及分享

更新时间:2025-04-27 05:51:08

如果您需要将日志服务的查询分析结果、仪表盘等页面,分享给其他人或者嵌入到第三方系统,可以通过本文生成免密且免登录的链接进行分享。

注意事项

概念介绍

生成的免密免登录链接主要由固定url,配置参数项,访问凭证三部分组成,其中访问凭证是指一个拥有时效性的令牌,每个令牌仅支持在浏览器中打开一次。获取链接的用户无需登录阿里云账户,就可以访问指定的查询分析页面或仪表盘页面。

链接URL格式示例如下:

https://sls.console.aliyun.com/lognext/project/${ProjectName}/logsearch/${LogstoreName}?参数1&参数2
说明
  • ${ProjectName}${LogstoreName}${savedsearchID}${dashboardID}之外的参数必须位于URL末尾的问号(?)之后。

  • 支持同时设置多个参数,参数之间通过and(&)连接。

  • 注意URL中下列参数的大小写。

  • 更多参数项请参考配置控制台内嵌参数

权限设置必读

  1. 若您使用RAM用户操作,根据需要进行的操作不同,请参考如下表格设置权限:

    重要

    生成的链接会继承CreateTicket接口调用者在日志服务中已有的权限,为避免使用主账号调用接口而造成的数据安全风险,在该场景中建议使用RAM用户。

    场景

    授权操作

    生成单个链接

    1. 授予指定资源权限的步骤,请参见RAM自定义授权示例

    2. 授予调用CreateTicket接口,具体操作步骤请参见RAM用户授权创建自定义权限策略

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

    需要动态生成链接

    1. 创建RAM用户创建可信实体为阿里云账号的RAM角色

    2. RAM用户授予STS的管理权限(AliyunSTSAssumeRoleAccess),为RAM角色授予调用CreateTicket接口的权限日志服务的相关权限,授权操作请参见RAM角色授权RAM自定义授权示例

    延长链接访问有效时间

    1. 使用生成链接的RAM用户登录RAM控制台

    2. RAM用户授予调用RefreshToken接口权限。具体操作步骤请参见RAM用户授权创建自定义权限策略

    {
        "Version": "1",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": "log:RefreshToken",
                "Resource": "acs:log:*:*:ticket/*"
            }
        ]
    }
  2. 若您使用主账号操作,默认拥有全部权限,无需配置。

生成单个免密免登录链接

当您临时需要分享页面给他人时,使用以下方式将快速获取一个免密免登录链接。

生成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天。

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. 链接测试。您可以将生成的链接输入浏览器的地址栏进行测试。若可正常打开日志服务控制台分享页面,则说明已成功生成免登录链接。

    重要
    • 此处测试即为首次在浏览器中打开免登录链接,测试完成后,Ticket会失效。需要重新获取Ticket。

    • 建议将链接复制到文件中,然后传输文件。如果直接在第三方软件中发送链接,可能因为被第三方软件读取而失效。

嵌入第三方系统,如何动态生成链接

如果在第三方系统中嵌入控制台页面,由于Ticket会过期导致链接失效,因此需要在应用程序中动态调用CreateTicket接口,以定期获取Ticket。此时如果使用某RAM用户的密钥调用接口,虽然简单,但安全风险较高,建议使用具有临时身份凭证(STS Token)的某RAM角色调用接口,凭证到期后该RAM角色无法访问,可以降低安全风险。

如何动态生成Ticket?
说明
  • Ticket默认有效时长为24小时,最长为30天。

  • 生成Ticket的总数没有限制,CreateTicket QPS限制为每用户10次/s。

  1. 使用RAM角色调用CreateTicket接口。

    1. 使用RAM用户调用AssumeRole接口,获取SecurityToken、AccessKeySecretAccessKeyId。

    2. RAM用户使用这三个参数扮演RAM角色,从而调用CreateTicket接口获取Ticket。

      SDK示例

      Java
      Python
      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. 使用某RAM用户密钥创建生成票据代码,不推荐,若密钥暴露风险较高。更多方式请参考管理访问凭据

        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);
                }
            }
        }

      使用STS Token创建生成票据代码,即使密钥暴露,当Token到期无法继续访问,风险更小。更多方式请参考管理访问凭据

      # -*- 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:])
  2. 根据返回的Ticket拼接出不同权限范围的免密链接。

Ticket过期如何延长链接访问时间

已经生成免密且免登录链接,但通过CreatTicket接口生成的ticket只有短暂的有效期。如果需要刷新可免密且免登录链接的有效时间,可以使用RefreshToken接口。

Ticket过期延长访问时间

步骤一:链接增加参数

生成的链接拼接supportRefreshToken=true,表示允许链接延长访问时间。

https://sls.console.aliyun.com/lognext/project/<Project名称>/dashboard/<仪表盘ID>?sls_ticket=eyJ***************.eyJ******************.KUT****************&supportRefreshToken=true&isShare=true&hideTopbar=true&hideSidebar=true&ignoreTabLocalStorage=true

步骤二:客户端增加监听事件

客户端监听message事件,将最新的accessToken传给iframe

window.addEventListener('message', async (e) => {
  if (e?.data?.type === 'refreshToken') {
    const accessToken = await callApi()
    document.querySelector('#myIframe').contentWindow.postMessage(
      {
        // 固定为applyAccessToken
        type: 'applyAccessToken',
        // 调用callApi返回的accessToken
        accessToken,
        // createTicket接口返回的ticket
        ticket: e.data.ticket,
      },
      '*'
    )
  }
})

客户端中callApi()为自定义方法,用于调用服务端API,服务端API作用是调用RefreshToken获取accesstoken,示例参考如下:

说明

RefreshToken的两个入参:ticketCreateTicket生成的票据。accessTokenExpirationTime表示调用接口生成的访问令牌过期时间(秒),默认86400秒(一天),最大86400秒(一天)。该ticket最多延长至30天,30天后该ticket过期。

Java
Python
  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. 生成accessToken

    // This file is auto-generated, don't edit it. Thanks.
    package com.aliyun.sample;
    
    import com.aliyun.sls20201230.Client;
    import com.aliyun.tea.*;
    
    public class Sample {
    
        /**
         * 使用AK&SK初始化账号Client
         * @return Client
         * @throws Exception
         */
        public static 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,服务地址只能是华东2(上海)或新加坡
            config.endpoint = "cn-shanghai.log.aliyuncs.com";
            return new 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.RefreshTokenRequest refreshTokenRequest = new com.aliyun.sls20201230.models.RefreshTokenRequest()
                    .setTicket("eyJ***************.eyJ******************.KUT****************")
                    .setAccessTokenExpirationTime(60L);
            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.RefreshTokenResponse resp = client.refreshTokenWithOptions(refreshTokenRequest, 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);
            }        
        }
    }
    
# -*- 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 方式。
        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']
        )
        # Endpoint 请参考 https://api.aliyun.com/product/Sls,服务地址只能是华东2(上海)或新加坡
        config.endpoint = 'cn-shanghai.log.aliyuncs.com'
        return Sls20201230Client(config)

    @staticmethod
    def main(
        args: List[str],
    ) -> None:
        client = Sample.create_client()
        refresh_token_request = sls_20201230_models.RefreshTokenRequest(
            ticket='eyJ***************.eyJ******************.KUT****************',
            access_token_expiration_time=60
        )
        runtime = util_models.RuntimeOptions()
        headers = {}
        try:
            # 复制代码运行请自行打印 API 的返回值
            client.refresh_token_with_options(refresh_token_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()
        refresh_token_request = sls_20201230_models.RefreshTokenRequest(
            ticket='eyJ***************.eyJ******************.KUT****************',
            access_token_expiration_time=60
        )
        runtime = util_models.RuntimeOptions()
        headers = {}
        try:
            # 复制代码运行请自行打印 API 的返回值
            await client.refresh_token_with_options_async(refresh_token_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:])

调整页面显示效果

通过设置日志服务控制台内嵌参数,可调整内嵌页面的显示效果。日志服务提供了一系列UI参数与第三方自建Web页面进行融合展示。详细参数请参考配置控制台内嵌参数

设置仪表盘大屏展示

若想把仪表盘制作成大屏长期展示,可以使用免密分享与集成仪表盘功能。

  1. 日志服务控制台快速创建仪表盘

  2. 创建免密分享,时间选择“长期有效”。

    2024-09-05_15-22-20 (3)

  3. 打开分享链接,选择显示器全屏。也可以设置刷新时间,实时刷新数据。

仪表盘分享协作

仪表盘分享支持在PC端、钉钉、企业微信或阿里钉查看。也支持分享给其他阿里云账号和RAM用户、钉钉账号、企业微信账号或阿里钉用户。

场景一:账号间分享仪表盘
场景二:应用间分享仪表盘

团队有多个阿里云账号,账号A下的RAM-User-A想要分享仪表盘给账号B下的RAM-User-B查看。

  1. RAM-User-A日志服务控制台快速创建仪表盘,并创建免密分享访问限制选择“阿里云账号”,阿里云账号ID填入RAM-User-B账号IDimage

  2. RAM-User-B登录后打开分享链接查看仪表盘。

公司使用钉钉或企业微信办公,运维团队在控制台创建仪表盘后分享给开发人员在钉钉账号或企业微信账号查看。

  1. 使用钉钉组织管理员企业微信管理员扫码开通应用

    image

  2. 使用阿里云主账号登录控制台,在控制台首页右侧单击image

    image

  3. RAM用户对仪表盘创建免密分享访问限制选择钉钉账号,然后选择需要分享的用户账号,也支持选择全部image

  4. 被分享的钉钉用户,无需登录阿里云,直接在钉钉PC端或者手机端查看。

    1. 在钉钉的工作台页面,单击顶部的全员页签,然后单击SLS分享与免登

      image

      image

    2. 单击查看详情

      image

      image

  5. 也可以在登录钉钉后,直接通过分享的链接在浏览器查看。

    1. RAM用户分享者复制仪表盘链接给钉钉用户。image

    2. 复制链接到浏览器的地址栏打开查看。

内嵌页面权限分离

将查询分析结果、仪表盘嵌入第三方系统,可支持用户权限分离。下面通过两个场景为您介绍控制台内嵌操作步骤。

场景一:用户权限相同
场景二:用户权限不同

使用场景:内嵌同一个Project中的两个Logstore,所有用户具有指定Logstore的只读权限及Project中快速查询和仪表盘的只读权限。

操作步骤

  1. 创建一个RAM用户sls-user作为分享者,具体操作,请参见创建RAM用户

  2. RAM用户sls-user授权。

    1. 创建访问指定资源(Project、Logstore)的权限Allow-AccessLogstore。权限策略如下所示,具体操作,请参见创建自定义权限策略

      说明

      实际操作中,请使用具体ProjectLogstore替换代码中<指定的Project名称>和<指定的Logstore名称A>、<指定的Logstore名称B>。

      {
        "Version": "1",
        "Statement": [
          {
            "Action": [
              "log:ListProject"
            ],
            "Resource": "acs:log:*:*:project/*",
            "Effect": "Allow"
          },
          {
            "Action": [
              "log:List*"
            ],
            "Resource": "acs:log:*:*:project/<指定的Project名称>/logstore/*",
            "Effect": "Allow"
          },
          {
            "Action": [
              "log:Get*",
              "log:List*"
            ],
            "Resource": [
              "acs:log:*:*:project/<指定的Project名称>/logstore/<指定的Logstore名称A>",
              "acs:log:*:*:project/<指定的Project名称>/logstore/<指定的Logstore名称B>"
            ],
            "Effect": "Allow"
          },
          {
            "Action": [
              "log:Get*",
              "log:List*"
            ],
            "Resource": [
              "acs:log:*:*:project/<指定的Project名称>/dashboard",
              "acs:log:*:*:project/<指定的Project名称>/dashboard/*"
            ],
            "Effect": "Allow"
          },
          {
            "Action": [
              "log:Get*",
              "log:List*"
            ],
            "Resource": [
              "acs:log:*:*:project/<指定的Project名称>/savedsearch",
              "acs:log:*:*:project/<指定的Project名称>/savedsearch/*"
            ],
            "Effect": "Allow"
          }
        ]
      }
    2. RAM用户sls-user授予Allow-AccessLogstore权限,用户访问内嵌页面继承该权限。具体操作,请参见RAM自定义授权示例

    3. 创建调用CreateTicket接口的权限Allow-CreateTicket。权限策略如下所示,具体操作,请参见创建自定义权限策略

      {
          "Version": "1",
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": "log:CreateTicket",
                  "Resource": "acs:log:*:*:ticket/*"
              }
          ]
      }
    4. RAM用户授予调用CreateTicket接口的权限Allow-CreateTicket。具体操作,请参见RAM用户授权

  3. 您可在自己的前端页面自行制作Logstore Select框/Tab,用于切换Logstore。

  4. 进入内嵌页面,使用RAM用户sls-user-a调用CreateTicket接口获取票据Ticket,此处以Java SDK为例。

    说明

    您可在CreateTicket页面调试接口,获取票据Ticket。将获取的Ticket拼接在查询页URL中访问。

    1. 添加Maven依赖。

      Java项目的根目录下,打开pom.xml文件,添加以下代码:

      <dependency>
        <groupId>com.aliyun</groupId>
        <artifactId>sls20201230</artifactId>
        <version>5.5.0</version>
      </dependency>
    2. 您可在CreateTicket页面下载最新版工程示例。本示例创建生成票据代码,如下所示。

      package com.aliyun.sample;
      
      import com.aliyun.tea.*;
      
      public class Sample {
          public static com.aliyun.sls20201230.Client createClient() throws Exception {
              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 {
                  // 复制代码运行请自行打印 API 的返回值
                  com.aliyun.sls20201230.models.CreateTicketResponse createTicketResponse = client.createTicketWithOptions(createTicketRequest, headers, runtime);
                  
      System.out.println(createTicketResponse.getBody().getTicket());
              } 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);
              }        
          }
      }
      
  5. 将获取的Ticket拼接在查询页URL中。同时您可隐藏左侧导航栏、顶部导航栏、关闭Tab访问历史记录等(hideTopbar=true&hideSidebar=true&ignoreTabLocalStorage=true)。关于控制台内嵌参数的具体用法,请参见配置控制台内嵌参数

    https://sls.console.aliyun.com/lognext/project/<Project名称>/logsearch/<日志库名称>?slsRegion=<Project所在地域>&hideTopbar=true&hideSidebar=true&ignoreTabLocalStorage=true&sls_ticket=eyJ***************.eyJ******************.KUT****************
  6. 切换Logstore,在同一个浏览器中可以重复使用上述生成的Ticket,拼接在URL中。

    说明

    同一个浏览器中无需重复调用,不同用户(不同浏览器)还是需要重新调用CreateTicket的,Ticket仅限一个浏览器或主机访问。

使用场景:内嵌两个project,用户A仅能只读访问Project-A,用户B仅能只读访问Project-B

操作步骤

  1. 创建一个RAM用户sls-user作为分享者,具体操作,请参见创建RAM用户

  2. RAM用户sls-user授予调用STS服务AssumeRole接口的权限(AliyunSTSAssumeRoleAccess)。具体操作,请参见RAM用户授权

  3. 创建RAM角色sls-role,具体操作,请参见创建可信实体为阿里云账号的RAM角色

  4. RAM角色sls-role授予指定资源(Project)的权限,以及调用CreateTicket接口的权限。

    1. 创建访问指定资源(Project)的权限Allow-AccessProject,权限为所有用户权限的并集。具体操作,请参见创建自定义权限策略。这里需要只读访问Project-AProject-B的权限,权限策略如下所示:

      说明

      实际操作中,请使用具体Project替换代码中<指定的Project名称A>和<指定的Project名称B>。

      {
         "Version": "1",
         "Statement": [
           {
             "Action": [
               "log:Get*",
               "log:List*"
             ],
             "Resource": [
               "acs:log:*:*:project/<指定的Project名称A>/*",
               "acs:log:*:*:project/<指定的Project名称A>",
               "acs:log:*:*:project/<指定的Project名称B>/*",
               "acs:log:*:*:project/<指定的Project名称B>"
             ],
             "Effect": "Allow"
           }
         ]
      }
    2. RAM角色sls-role授予访问指定资源(Project)的权限Allow-AccessProject,具体操作,请参见RAM角色授权

    3. 创建调用CreateTicket接口的权限Allow-CreateTicket。权限策略如下所示,具体操作,请参见创建自定义权限策略

      {
          "Version": "1",
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": "log:CreateTicket",
                  "Resource": "acs:log:*:*:ticket/*"
              }
          ]
      }
    4. RAM角色sls-role授予调用CreateTicket接口的权限Allow-CreateTicket,具体操作,请参见RAM角色授权

  5. 设置RAM角色最大会话时间,默认为1小时,内嵌有效时间会小于这个时间。

    image.png

  6. 当用户进入内嵌页面时,使用RAM用户sls-user扮演的RAM角色sls-role调用AssumeRole接口。主要设置四个参数。

    字段名称

    字段说明

    RoleArn

    要扮演的RAM角色ARN。从RAM角色中复制。

    RoleSessionName

    角色会话名称。任意字符串,设置为用户ID或名称等,用于审计时区分不同用户。

    DurationSeconds

    Token有效期。可设置为最小900秒,最大为RAM角色最大会话时间,默认3600秒。

    Policy

    为 STS Token 额外添加的一个权限策略。

    • 如果指定该权限策略,则 STS Token 最终的权限策略取 RAM 角色权限策略与该权限策略的交集。

    • 如果不指定该权限策略,则 STS Token 最终的权限策略取 RAM 角色的权限策略。

    调用时按照不同用户设置不同的policy,为STS Token额外添加的一个权限策略(STS Token 最终的权限策略取RAM角色权限策略与该权限策略的交集)。比如用户A进入内嵌页面时设置RoleSessionNameUserA,policy为:

    {
       "Version": "1",
       "Statement": [
         {
           "Action": [
             "log:Get*",
             "log:List*"
           ],
           "Resource": [
             "acs:log:*:*:project/<指定的Project名称A>/*",
             "acs:log:*:*:project/<指定的Project名称A>"
           ],
           "Effect": "Allow"
         },
         {
            "Effect": "Allow",
            "Action": "log:CreateTicket",
            "Resource": "acs:log:*:*:ticket/*"
        }
       ]
    }

    用户B进入内嵌页面时设置RoleSessionNameUserB,policy为:

    {
       "Version": "1",
       "Statement": [
         {
           "Action": [
             "log:Get*",
             "log:List*"
           ],
           "Resource": [
             "acs:log:*:*:project/<指定的Project名称B>/*",
             "acs:log:*:*:project/<指定的Project名称B>"
           ],
           "Effect": "Allow"
         },
         {
            "Effect": "Allow",
            "Action": "log:CreateTicket",
            "Resource": "acs:log:*:*:ticket/*"
        }
       ]
    }

    获取STS临时身份凭证SecurityToken、AccessKeySecretAccessKeyId后,再使用这个STS调用CreateTicket获取票据Ticket,以Java为例:

    package com.aliyun.sls20201230;
    
    import com.aliyun.sls20201230.models.CreateTicketRequest;
    import com.aliyun.sls20201230.models.CreateTicketResponse;
    import com.aliyun.sls20201230.models.CreateTicketResponseBody;
    import com.aliyun.sts20150401.models.AssumeRoleResponse;
    import com.aliyun.sts20150401.models.AssumeRoleResponseBody;
    import com.aliyun.tea.TeaException;
    import com.aliyun.teaopenapi.models.Config;
    
    import java.util.List;
    
    public class StsSample {
        public static void main(String[] args_) throws Exception {
            List<String> args = java.util.Arrays.asList(args_);
            String roleArn = "xxxx";
            String roleSession = "UserA";
            String policy = "{\n" +
                    "   \"Version\": \"1\",\n" +
                    "   \"Statement\": [\n" +
                    "     {\n" +
                    "       \"Action\": [\n" +
                    "         \"log:Get*\",\n" +
                    "         \"log:List*\"\n" +
                    "       ],\n" +
                    "       \"Resource\": [\n" +
                    "         \"acs:log:*:*:project/<指定的Project名称A>/*\",\n" +
                    "         \"acs:log:*:*:project/<指定的Project名称A>\"\n" +
                    "       ],\n" +
                    "       \"Effect\": \"Allow\"\n" +
                    "     },\n" +
                    "     {\n" +
                    "        \"Effect\": \"Allow\",\n" +
                    "        \"Action\": \"log:CreateTicket\",\n" +
                    "        \"Resource\": \"acs:log:*:*:ticket/*\"\n" +
                    "    }\n" +
                    "   ]\n" +
                    "}";
            Client client = StsSample.createClient(roleArn, roleSession, policy);
            try {
                CreateTicketRequest createTicketRequest = new CreateTicketRequest();
                CreateTicketResponse response = client.createTicket(createTicketRequest);
                CreateTicketResponseBody embedded = response.getBody();
                System.out.println(embedded.getTicket());
    
            } catch (TeaException e) {
                e.printStackTrace();
            }
        }
    
        public static Client createClient(String roleArn, String roleSession, String policy) throws Exception {
            com.aliyun.sts20150401.Client client = createStsClient();
            com.aliyun.sts20150401.models.AssumeRoleRequest assumeRoleRequest = new com.aliyun.sts20150401.models.AssumeRoleRequest();
            assumeRoleRequest.setRoleArn(roleArn);
            assumeRoleRequest.setRoleSessionName(roleSession);
            assumeRoleRequest.setDurationSeconds(3600L);
            assumeRoleRequest.setPolicy(policy);
            com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
            AssumeRoleResponse assumeRoleResponse = client.assumeRoleWithOptions(assumeRoleRequest, runtime);
            AssumeRoleResponseBody.AssumeRoleResponseBodyCredentials credentials = assumeRoleResponse.getBody().getCredentials();
    
            Config config = new Config()
                    .setAccessKeyId(credentials.getAccessKeyId())
                    .setAccessKeySecret(credentials.getAccessKeySecret())
                    .setSecurityToken(credentials.getSecurityToken())
                    // Endpoint 请参考 https://api.aliyun.com/product/Sls
                    .setEndpoint("cn-shanghai.log.aliyuncs.com");
            return new Client(config);
        }
    
        public static com.aliyun.sts20150401.Client createStsClient() throws Exception {
            String accessKeyId = "xxx";
            String accessKeySecret = "xxx";
            com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
                    .setAccessKeyId(accessKeyId)
                    .setAccessKeySecret(accessKeySecret);
            // Endpoint 请参考 https://api.aliyun.com/product/Sts
            config.endpoint = "sts.cn-shanghai.aliyuncs.com";
            return new com.aliyun.sts20150401.Client(config);
        }
    }
    
  7. 将获取的Ticket拼接在查询页URL中。同时您可隐藏左侧导航栏、顶部导航栏、关闭Tab访问历史记录等(hideTopbar=true&hideSidebar=true&ignoreTabLocalStorage=true)。关于控制台内嵌参数的具体用法,请参见配置控制台内嵌参数

    https://sls.console.aliyun.com/lognext/project/<Project名称>/logsearch/<日志库名称>?slsRegion=<Project所在地域>&hideTopbar=true&hideSidebar=true&ignoreTabLocalStorage=true&sls_ticket=eyJ***************.eyJ******************.KUT****************

多个内嵌页面权限设置

多个内嵌页且每个页面权限相同
多个内嵌页且每个页面权限不同
  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}

生成免密免登录链接(旧版)

生成链接还可以使用如下方式,但新版操作更简单,且不需要依赖第三方cookie,相比旧版,有更高的加载速度,因此推荐使用新版,详情请参考生成单个免密免登录链接,且本文中其他使用场景均是以新版为例。

说明
  • 该功能仅支持通过扮演RAM角色进行访问。

  • 由于后端存在校验逻辑,建议您在SigninToken失效期前5分钟重新生成控制台分享链接以持续使用免登的页面。否则SigninToken失效将导致免登录页面上报SigninToken错误。

步骤一:创建RAM角色&RAM用户

创建并授予RAM角色访问分享页面的查看权限。然后创建并授予RAM用户扮演RAM角色的权限。

  1. 创建一个允许当前云账号的RAM用户或RAM角色扮演的RAM角色,详细操作步骤请参见使用RAM角色实现跨云账号的资源访问

  2. RAM角色授权,允许其访问分享链接。如授予SLS的只读权限。

    {
        "Version": "1",
        "Statement": [
            {
                "Action": [
                    "log:Get*",
                    "log:List*",
                    "log:Query*"
                ],
                "Resource": "*",
                "Effect": "Allow"
            }
        ]
    }
  3. 记录下RAM角色的角色ARN,格式如acs:ram::137******44:role/role-name

  4. 创建RAM用户的操作步骤请参见创建RAM用户及授权,创建时勾选通过OpenAPI 调用访问选项,创建完成后记录下AccessKey。

  5. RAM用户授予扮演角色的权限。

    说明

    Resource指定创建的RAM角色的ARN。

    {
        "Version": "1",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": "sts:AssumeRole",
                "Resource": "acs:ram::137******44:role/role-name"
            }
        ]
    }

步骤二:准备分享链接

  • 查询分析页面:

    https://sls4service.console.aliyun.com/lognext/project/<Project名称>/logsearch/<日志库名称>?slsRegion=<Project所在地域>&hideTopbar=true&hideSidebar=true&ignoreTabLocalStorage=true
  • 查询页面:

    https://sls4service.console.aliyun.com/lognext/project/<Project名称>/logsearch/<日志库名称>?slsRegion=<Project所在地域>&isShare=true&hideTopbar=true&hideSidebar=true&ignoreTabLocalStorage=true
  • 仪表盘页面:

    https://sls4service.console.aliyun.com/lognext/project/<Project名称>/dashboard/<仪表盘ID>?slsRegion=<Project所在地域>&isShare=true&hideTopbar=true&hideSidebar=true&ignoreTabLocalStorage=true
    说明

    仪表盘ID为网页链接上的ID,并非仪表盘的展示名称。日志服务控制台也提供了方便的交互式仪表盘免密分享功能,请参见仪表盘免密分享

  • 全栈可观测应用页面

    此处以Trace分析页面为例。更多信息,请参见全栈可观测内嵌

    https://sls4service.console.aliyun.com/lognext/app/observability/trace/<Project名称>/<全栈可观测实例id>?resource=/trace/<全栈可观测实例id>/explorer&hideTopbar=true&isShare=true

步骤三:生成免登录链接

制作免登录链接。Java、Python等多种语言的代码示例请参考代码示例

  1. 使用RAM用户的AccessKey访问STS服务换取安全令牌(STS Token),一个Token只能使用一次,token有效期可进行指定。获取STS Token的示例代码如下。

    DefaultProfile.addEndpoint("", "", "Sts", stsHost);
    IClientProfile profile = DefaultProfile.getProfile("", <AccessKeyId>, <AccessKeySecret>);
    DefaultAcsClient client = new DefaultAcsClient(profile);
    AssumeRoleRequest assumeRoleReq = new AssumeRoleRequest();
    assumeRoleReq.setRoleArn(roleArn); // RAM角色的ARN
    assumeRoleReq.setRoleSessionName(roleSession);
    assumeRoleReq.setMethod(MethodType.POST);
    assumeRoleReq.setDurationSeconds(3600L);
    AssumeRoleResponse assumeRoleRes = client.getAcsResponse(assumeRoleReq);
  2. 调用RAM单点登录SSO,获取登录Token。拼接链接的形式如下。注意:TicketType必须指定为mini

    http://signin.aliyun.com/federation?Action=GetSigninToken
                        &AccessKeyId=<STS返回的临时AK>
                        &AccessKeySecret=<STS返回的临时Secret>
                        &SecurityToken=<STS返回的安全Token>
                        &TicketType=mini

    返回的结构如下:

    {
        "RequestId": "02b47c77c5fd48789d23773af853e9f7_936be_1706585994094_1.229",
        "SigninToken": "svX6LGcBbWLExKD5hcwdLu6RsLQbv36fWZN36WhxkTXpTcDpmzs2K6X8uFvCqGsBTU4KWJMffYz2rAVbdJXHMECgUfyzS869wh2DBdFEQo3e2fJgZ5YtcMSVnoX7pterS2f7926jFvdBXVFEF54JkUCMrDAutNRv1u7ZReC7v8oQoG5UmjJBbHUyvLTn5UDDvDfNowMVyRskrZRFUKT2qAMZ4Gnc****"
    }
  3. 将返回的登录Token拼接到准备好的链接中,生成免密访问链接。

    http://signin.aliyun.com/federation?Action=Login
                                &LoginUrl=<登录失效跳转的地址,一般配置为自建Web配置302跳转的URL。需要使用encodeURL对LoginUrl进行转码。>
                                &Destination=<实际访问日志服务页面,支持查询页面和仪表盘页面。如果有参数,则需要使用encodeURL对参数进行转码。>
                                &SigninToken=<获取的登录Token,需要使用encodeURL对Token进行转码。>

代码示例

  • Java 示例代码

    其中Java代码的Maven依赖如下。

    <dependency>
        <groupId>com.aliyun</groupId>
        <artifactId>aliyun-java-sdk-sts</artifactId>
        <version>3.0.0</version>
    </dependency>
    <dependency>
        <groupId>com.aliyun</groupId>
        <artifactId>aliyun-java-sdk-core</artifactId>
        <version>3.5.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.5.5</version>
    </dependency>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.68.noneautotype</version>
    </dependency>
  • PHP 示例代码

  • Python 示例代码

  • GO 示例代码

步骤四:以Iframe方式嵌入

iframe方式将链接嵌入到其他Web页面。

重要
  • 此处测试即为首次在浏览器中打开免登录链接,测试完成后,登录Token会失效,您需要重新生成免登录链接。

  • iframe嵌套链接出现报错,可能是存在安全限制,无法加载域外网站,请修改Content-Security-Policy Header。例如,可以使用以下CSP指令允许来自aliyun.com*.aliyun.com的网站嵌入:Content-Security-Policy: frame-ancestors 'self' aliyun.com *.aliyun.com;

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>控制台链接分享</title>
</head>
<body>
<iframe width="1280" height="720" src="免登录访问链接"> </iframe>
</body>
</html>

  • 本页导读 (1)
  • 注意事项
  • 生成单个免密免登录链接
  • 嵌入第三方系统,如何动态生成链接
  • Ticket过期如何延长链接访问时间
  • 调整页面显示效果
  • 设置仪表盘大屏展示
  • 仪表盘分享协作
  • 内嵌页面权限分离
  • 多个内嵌页面权限设置
  • 生成免密免登录链接(旧版)
AI助理

点击开启售前

在线咨询服务

你好,我是AI助理

可以解答问题、推荐解决方案等