控制台内嵌及分享
日志服务支持将查询分析页面和仪表盘页面嵌入自建Web,方便您将查询分析和仪表盘页面共享给其他用户(免密登录)查看日志数据。本文介绍日志服务控制台内嵌及分享的操作步骤。
基本原理
为使您在完成采集配置和索引配置后,能直接使用日志服务的查询分析和仪表盘页面功能,并将日志数据分享给其他用户进行查看,同时避免使用RAM会带来众多RAM账号的管理成本。日志服务提供指定日志库查询页面和仪表盘页面嵌入自建Web功能,不需要登录日志服务控制台即可直接访问日志服务查询分析和仪表盘等页面,访问后可以通过步骤二:为RAM用户授权限制操作权限,例如授予只读权限。
操作流程如下图所示。
注意事项
在使用控制台分享功能的过程中,请注意以下事项:
该功能仅支持通过扮演RAM角色身份进行访问,所以您需要创建RAM角色和RAM用户。
由于令牌服务(STS)生成的AccessKey和Token为临时凭证,所以共享链接仅支持在浏览器中打开一次;重复打开该链接会提示SigninToken错误。
由于后端存在校验逻辑,建议您在SigninToken失效期前5分钟重新生成控制台分享链接以持续使用免登的页面。否则SigninToken失效将导致免登录页面上报SigninToken错误。
当前仅支持完整查询和分析页面、查询页面、仪表盘页面进行控制台分享,不支持告警页面分享。
免密登录链接的Host为
sls4service.console.aliyun.com
,需要您手动替换待分享页面中的Host地址。
操作流程
该部分用于了解操作流程,详细操作步骤请参见操作步骤。
准备好待分享的查询分析页面或者仪表盘链接。
例如,您待分享的仪表盘控制台链接如下:
https://sls.console.aliyun.com/lognext/project/project_name/dashboard/dashboard-1651116703628-54041
替换Host为
sls4service.console.aliyun.com
,则待分享链接页面地址为:https://sls4service.console.aliyun.com/lognext/project/project_name/dashboard/dashboard-1651116703628-54041
创建RAM用户和RAM角色并授权。
具体操作,请参见创建RAM用户及授权和创建可信实体为阿里云账号的RAM角色及授权。
创建完成后,您需要获取以下参数的值,用于代码调试:
RAM用户的AccessKey。
RAM角色的角色标识ARN。
例如
acs:ram::137******44:role/role-name
。
制作免密登录日志服务控制台的链接。
本文主要介绍如何生成链接的操作步骤。
以iframe方式将链接内嵌到其他Web页面。
将该Web页面链接发送给任意用户A。用户A即可查看您共享的查询分析页面或者仪表盘页面。
操作步骤
主要介绍如何生成免密登录链接的操作步骤。
登录自建Web,通过Web服务端访问令牌服务(STS)获取临时AK信息和安全Token。
您可以参考本文代码示例提供的Java、Python、Go和PHP代码,获取临时AccessKey和安全Token。
STS使用说明请参见通过STS实现跨账号访问日志服务资源。
授予指定日志库的访问权限请参见创建RAM用户及授权和创建可信实体为阿里云账号的RAM角色及授权。
调用STS SDK服务接口生成日志服务登录Token。
您可以参考本文代码示例提供的Java、Python、Go和PHP代码,生成日志服务登录Token。
说明STS返回的安全Token中可能包含特殊字符,请将特殊字符进行URL编码后再输入。
请求示例:
http://signin.aliyun.comsignin-intl.aliyun.com/federation?Action=GetSigninToken &AccessKeyId=<STS返回的临时AK> &AccessKeySecret=<STS返回的临时Secret> &SecurityToken=<STS返回的安全Token> &TicketType=mini
调整登录Token有效期。
登录Token默认有效期为15分钟~60分钟,您可以参见本步骤调整登录Token的最大有效期为12小时。
在RAM控制台,修改目标RAM角色的最大会话时间为12小时。
在RAM控制台,修改目标RAM用户的登录Session过期时间为12小时。
修改免登录代码中的setDurationSeconds字段的值为43200L。
此处以Java代码为例。
AssumeRoleRequest assumeRoleReq = new AssumeRoleRequest(); assumeRoleReq.setRoleArn(roleArn); assumeRoleReq.setRoleSessionName(roleSession); assumeRoleReq.setMethod(MethodType.POST); assumeRoleReq.setDurationSeconds(43200L);
生成免登录链接。
获取日志服务页面链接。
说明当前仅支持完整查询和分析页面、查询页面、仪表盘页面进行控制台分享,不支持告警页面分享。
完整查询分析页面:
https://sls4service.console.aliyun.com/lognext/project/<Project名称>/logsearch/<日志库名称>?hideTopbar=true&hideSidebar=true&ignoreTabLocalStorage=true
查询页面:
https://sls4service.console.aliyun.com/lognext/project/<Project名称>/logsearch/<日志库名称>?isShare=true&hideTopbar=true&hideSidebar=true&ignoreTabLocalStorage=true
仪表盘页面:
https://sls4service.console.aliyun.com/lognext/project/<Project名称>/dashboard/<仪表盘ID>?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
将获取到的登录Token与日志服务页面链接一并生成免登录访问链接。
您可以参考本文代码示例提供的Java、Python、Go和PHP代码,生成最终免密访问链接。
最终生成的免密访问链接如下所示:
http://signin.aliyun.comsignin-intl.aliyun.com/federation?Action=Login &LoginUrl=<登录失效跳转的地址,一般配置为自建Web配置302跳转的URL。需要使用encodeURL对LoginUrl进行转码。> &Destination=<实际访问日志服务页面,支持查询页面和仪表盘页面。如果有参数,则需要使用encodeURL对参数进行转码。> &SigninToken=<获取的登录Token,需要使用encodeURL对Token进行转码。>
可选:测试参考。您可以将4生成的免登录链接放到以下HTML页面中进行测试。若可正常打开日志服务控制台分享页面,则说明已经成功生成免登录链接。
重要此处测试即为首次在浏览器中打开免登录链接,测试完成后,临时AccessKey和Token会失效,您需要重新生成免登录链接。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>控制台链接分享</title> </head> <body> <iframe width="1280" height="720" src="免登录访问链接"> </iframe> </body> </html>
代码示例
您可以参考以下PHP、Python、Go代码示例生成控制台分享免登录链接。
代码示例中的URL以http
为例。您可以修改为https
,建议和外部网址的HTTP协议类型保持一致。
<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>
常见问题
问题现象
iframe嵌套免登录链接时,出现如下报错:
Refused to frame 'https://signin.aliyun.com/' because an ancestor violates the following Content Security Policy directive: "frame-ancestors 'self' *.aliyun.com"
问题根因
iframe存在安全限制,导致无法加载域外网站。
解决方案
请修改Content-Security-Policy Header。
您可以通过在CSP指令中添加特定的域名或通配符来允许特定的网站嵌入。例如,可以使用以下CSP指令允许来自
aliyun.com
和*.aliyun.com
的网站嵌入:Content-Security-Policy: frame-ancestors 'self' aliyun.com *.aliyun.com;
如果要允许所有网站嵌入,可以使用通配符*,例如:
Content-Security-Policy: frame-ancestors *;
需要注意的是,允许所有网站嵌入可能存在安全风险,因此建议仅在特定情况下使用。更多信息,请参见https://content-security-policy.com/。