利用阿里云Eventbridge在CDN边缘应用程序中访问日志服务SLS

简介: 在Web前端领域,追求极致性能是个永恒的话题。这些年的一些新兴理念都是为了提升站点访问性能而提出,无论是Jamstack技术理念或者或者 ESR (边缘渲染),都是Client侧进行性能优化的基础上,进一步拓展到了网络Infra层面,就是我们现在经常讨论的边缘计算。而阿里云的CDN EdgeRoutine 就是为广大客户提供可自由编程的边缘计算能力,我们可以用他来构建边缘节点的网关应用,来访问静态资源或者后端服务。当这个边缘网关在业务上承担的角色越来越重要的时候,我们就对他内部的业务逻辑产生了可观测的诉求,希望能够记录日志到日志服务上,然而日志服务提供的SDK,在ER的环境中暂时不被支持,这个

相关概念

EdgeRoutine (以下简称er)阿里云边缘程序,是阿里云CDN推出的边缘Serverless计算环境。针对CDN场景,通过ER可在CDN边缘节点执行您自行编写的JavaScript代码。您无需关心代码部署的机器硬件配置、部署region、调度和弹性扩容。ER代码一经上传,即可完成全球阿里云CDN节点的部署,在全球边缘执行,根据您的代码逻辑个性化处理全球各地的请求。

事件总线 EventBridge (以下简称eb)是阿里云提供的一款无服务器事件总线服务,支持阿里云服务、自定义应用、SaaS应用以标准化、中心化的方式接入,并能够以标准化的 CloudEvents 1.0 协议在这些应用之间路由事件,帮助您轻松构建松耦合、分布式的事件驱动架构。

日志服务SLS(以下简称sls) 是云原生观测分析平台,为Log/Metric/Trace等数据提供大规模、低成本、实时平台化服务。一站式提供数据采集、加工、分析、告警可视化与投递功能,全面提升研发、运维、运营和安全等场景数字化能力。

一图说明

简单来说,我们只需要在eb程序中用原生fetch方法, 向由eb创建的endpoint发起请求即可,其余的都交给eb转发给sls。

操作步骤

  1. 开通EB并且创建一条自定义总线
  2. 在自定义总线中创建 HTTP/HTTPS触发的事件源
  3. 创建一个可以处理这个http事件源的事件规则
  4. 选择“日志服务”的事件目标,(需要提前准备好相同region 下的sls project 和logstore)

需要特别注意的是,刚eb需要你提供一个授权角色来对sls进行操作,这里可以点击“授权创建新角色”进入阿里云RAM界面创建Eventbridge的授信角色,RAM创建授信角色的教程放到附录。之后点击角色配置右边的刷新按钮,就可以看到创建好的角色,选中即可

5.查看事件源中的 HTTP/HTTPS触发信息,复制公网请求URL

6.在ER应用程序中增加访问eb的代码(下方代码59行)

constinit= {
headers: {
"content-type": "text/html;charset=UTF-8",
    },
}
constAPI_ROUTER_REG=/^\/(prod-api|api)/g;
constUPLOAD_ROUTER_REG=/^\/(uploads)\/?/g;
constADMIN_OR_PORTAL_ROUTER_REG=/^\/(admin|portal)\/?/g;
constAPI_PATH='/api';
constGET_TYPE= { type: "text" };
asyncfunctiongatherResponse(response) {
constheaders=response.headersconstcontentType=headers.get("content-type") ||""if (contentType.includes("application/json")) {
returnJSON.stringify(awaitresponse.json())
    } elseif (contentType.includes("application/text")) {
returnresponse.text()
    } elseif (contentType.includes("text/html;charset=UTF-8")) {
returnresponse.text()
    } else {
returnresponse.blob()
    }
}
asyncfunctionhandleRequest(request) {
try {
constrequestHeaders=request.headers||init;
constedgeKv=newEdgeKV({ namespace: "myweb"});
conststaticUrl=awaitedgeKv.get('staticUrl', GET_TYPE);
constapiUrl=awaitedgeKv.get('apiUrl', GET_TYPE);
constportalUrl=awaitedgeKv.get('portalUrl', GET_TYPE);
constebUrl=awaitedgeKv.get('ebUrl', GET_TYPE);
constbody=request.body;
constmethod=request.method;
consturl=newURL(request.url)
const { pathname, search } =url;
letresponse= {};
if (pathname.match(API_ROUTER_REG)) {
constmatchedData=pathname.match(API_ROUTER_REG)[0];
letfinalurl= (apiUrl+pathname+search).replace(matchedData, API_PATH);
response=awaitfetch(finalurl, { headers: requestHeaders, method,body });
        } elseif (pathname.match(UPLOAD_ROUTER_REG)) {
letfinalurl=apiUrl+pathname+search;
response=awaitfetch(finalurl, { headers: requestHeaders, method ,body})
        }  elseif(pathname.match(ADMIN_OR_PORTAL_ROUTER_REG)){
letfinalurl=staticUrl+pathname+search;
response=awaitfetch(finalurl, { headers: requestHeaders, method });
        } else {
letfinalurl=portalUrl+pathname+search;
response=awaitfetch(finalurl, init);
        }
constresults=awaitgatherResponse(response)
constfinalResponse=newResponse(results, response.headers);
try { // 这里开始插入访问eb的代码awaitfetch(ebUrl, {method,body:JSON.stringify({path: pathname}) });
        }catch(e){}
returnfinalResponse;
    } catch (e) {
returnnewResponse(JSON.stringify({ message: e.message }), {
headers: {
"content-type": "application/json;charset=UTF-8"            }
        })
    }
}
addEventListener("fetch", event=> {
returnevent.respondWith(handleRequest(event.request))
})

上面实例代码没有明文显示请求地址,而是将eb的请求地址存放到了边缘存储,这样做好处是,将配置部分跟逻辑代码分离,方便做替换变更。同时避免重要信息在源代码中泄露

数据测试

可以在两个地方查看数据信息

第一个地方在eventbridge的事件追踪部分,导航目录是自定义事件->事件追踪,你可以在这里查看所有发送过来的事件信息,以及投递情况

你可以访问一下使用ER的站点,然后查询最近5分钟访问事件

可以看到事件已经投递过来,查看一下啊事件轨迹,目标投递到sls已经ready,再查看一下事件体的内容,body部分有我们传入的path属性。接下来去sls日志的控制台查看一下

第二个地方查看sls日志控制台

同样的,你得到了相关的日志信息。

更多处理

eventbridge 也可以以sls日志写入作为触发的事件源,这就意味着我们可以处理这样的场景。我们对自己关注的日志数据,比如错误访问信息,或者重要商机功能访问信息做“精确的”事件通知,所谓精确就是将事件目标用函数计算处理,可以做到@钉群的具体人员,他的访问架构如下

更多的能力集成等你发掘


附录  

创建Eventbridge授信服务角色,并给其授权操作日志服务的策略

1.访问阿里云RAM控制台 ,进入角色页面,点击“创建角色”

2.选择 “阿里云服务”

输入角色名称, 选择授信服务选中“事件总线”

4 为角色授权,如果你不清楚具体应该选择哪种权限策略可以先选择“AdminstratorAccess”进行测试,之后确认操作权限后以最小权限为原则替换 AdminstratorAccess确保安全

目录
相关文章
|
3月前
|
存储 监控 算法
防止员工泄密软件中文件访问日志管理的 Go 语言 B + 树算法
B+树凭借高效范围查询与稳定插入删除性能,为防止员工泄密软件提供高响应、可追溯的日志管理方案,显著提升海量文件操作日志的存储与检索效率。
141 2
|
4月前
|
边缘计算 网络安全 CDN
阿里云CDN服务的优劣势分析
阿里云CDN依托全球50+节点,提供高速、稳定、安全的内容分发服务,支持智能调度、灵活配置与DDoS防护,助力企业提升海外访问体验。虽价格略高,功能相对集中,但仍是全球化业务优选的可靠加速方案。
|
8月前
|
监控 容灾 算法
阿里云 SLS 多云日志接入最佳实践:链路、成本与高可用性优化
本文探讨了如何高效、经济且可靠地将海外应用与基础设施日志统一采集至阿里云日志服务(SLS),解决全球化业务扩展中的关键挑战。重点介绍了高性能日志采集Agent(iLogtail/LoongCollector)在海外场景的应用,推荐使用LoongCollector以获得更优的稳定性和网络容错能力。同时分析了多种网络接入方案,包括公网直连、全球加速优化、阿里云内网及专线/CEN/VPN接入等,并提供了成本优化策略和多目标发送配置指导,帮助企业构建稳定、低成本、高可用的全球日志系统。
920 54
|
7月前
|
缓存 安全 网络协议
如何使用Bluetown Cloud服务器及其CDN服务来掩护VPS的真实IP地址。
最终,通过Bluetown Cloud的CDN服务,你的VPS不仅仅是隐藏在一层又一层的保护之下,同时也因为CDN的全球节点而享受到加速访问的优势,无所不在又不被发现,像是一位能在互联网世界中自由穿梭的幽灵特工。
159 14
|
Web App开发 存储 监控
iLogtail 开源两周年:UC 工程师分享日志查询服务建设实践案例
本文为 iLogtail 开源两周年的实践案例分享,讨论了 iLogtail 作为日志采集工具的优势,包括它在性能上超越 Filebeat 的能力,并通过一系列优化解决了在生产环境中替换 Filebeat 和 Logstash 时遇到的挑战。
523 103
|
10月前
|
存储 JSON Go
PHP 日志系统的最佳搭档:一个 Go 写的远程日志收集服务
为了不再 SSH 上去翻日志,我写了个 Go 小脚本,用来接收远程日志。PHP 负责记录日志,Go 负责存储和展示,按天存储、支持 API 访问、可远程管理,终于能第一时间知道项目炸了。
233 10
|
10月前
|
域名解析 应用服务中间件 网络安全
阿里云个人博客外网访问中断应急指南:从安全组到日志的七步排查法
1. 检查安全组配置:确认阿里云安全组已开放HTTP/HTTPS端口,添加规则允许目标端口(如80/443),授权对象设为`0.0.0.0/0`。 2. 本地防火墙设置:确保服务器防火墙未阻止外部流量,Windows启用入站规则,Linux检查iptables或临时关闭防火墙测试。 3. 验证Web服务状态:检查Apache/Nginx/IIS是否运行并监听所有IP,使用命令行工具确认监听状态。 4. 测试网络连通性:使用外部工具和内网工具测试服务器端口是否开放,排除本地可访问但外网不可的问题。 5. 排查DNS解析:确认域名A记录指向正确公网IP,使用`ping/nslookup`验证解析正
393 2
|
11月前
|
Devops 网络安全 CDN
微软警告:Azure CDN将关闭,需尽快迁移以避免服务中断
微软警告:Azure CDN将关闭,需尽快迁移以避免服务中断
|
缓存 负载均衡 安全
什么是CDN服务
CDN(内容分发网络)是全球分布的服务器网络,旨在加速互联网内容的传输。它通过将内容缓存至靠近用户的服务器,减少延迟,提升访问速度与性能,同时实现负载均衡、减轻源服务器压力并提供安全防护。广泛应用于网站加速、视频直播等领域,优化用户体验。
11117 5