控制台内嵌与分享(新版)

更新时间:2024-12-24 05:23:52
重要

本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。

如果您需要将日志服务的查询分析结果、仪表盘等页面,分享给其他人或者嵌入到第三方系统。本文为您介绍配置免密免登录的链接及分享的具体操作步骤。

前提条件

您已完成以下操作:

背景信息

Ticket是指一个短期有效的令牌(Token),用于拼接免密且免登录链接,获取链接的用户无需登录阿里云账户,就可以访问指定的查询分析页面或仪表盘页面。

操作流程如下:

  • RAM用户授权。

  • 准备分享链接。

  • 调用CreateTicket接口获取Ticket

  • Ticket拼接到分享链接中,生成免密且免登录链接。

重要
  • 调用CreateTicket获取票据Ticket,服务地址只能是华东2(上海)新加坡,但获取的Ticket可以在各个地域使用。

  • 生成的票据Ticket只能使用一次,有效期默认为一天,最长为30天。如果需要动态生成Ticket,请参见下面的如何动态生成Ticket?

内嵌页面

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

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

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

操作步骤

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

    警告

    生成的链接会继承CreateTicket接口调用者在日志服务中已有的权限,为避免使用主账号调用接口而造成的数据安全风险,强烈建议使用RAM用户来调用CreateTicket接口,并为该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用户

    警告

    生成的链接会继承CreateTicket接口调用者在日志服务中已有的权限,为避免使用主账号调用接口而造成的数据安全风险,强烈建议使用RAM用户来调用CreateTicket接口,并为该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. 日志服务控制台创建仪表盘

  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登录后打开分享链接查看仪表盘。

场景二:公司使用钉钉或企业微信办公,运维团队在日志服务控制台后创建仪表盘后分享给开发人员查看。

如果需要分享到钉钉账号或企业微信账号,必须使用阿里云主账号和RAM用户绑定钉钉组织或企业微信组织,步骤如下:

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

  2. 使用RAM用户登录控制台,重复第一步。

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

    image

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

    image

  5. RAM用户创建免密分享访问限制选择钉钉账号,然后选择需要分享的用户账号,也支持选择全部。更多信息,请参见创建免密分享image

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

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

      image

      image

    2. 单击查看详情

      image

      image

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

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

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

相关文档

  • 本页导读 (1)
  • 前提条件
  • 背景信息
  • 内嵌页面
  • 大屏展示
  • 分享协作
  • 相关文档