利用阿里云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天前
|
弹性计算 负载均衡 容灾
应用阿里云弹性计算:打造高可用性云服务器ECS架构
阿里云弹性计算助力构建高可用云服务器ECS架构,通过实例分布、负载均衡、弹性IP、数据备份及多可用区部署,确保业务连续稳定。自动容错和迁移功能进一步增强容灾能力,提供全方位高可用保障。
15 0
|
4天前
|
弹性计算 API Python
阿里云百炼应用之流程编排
阿里云通义百炼平台流程编排使用教程。
|
14天前
|
缓存 边缘计算 网络协议
阿里云CDN介绍
阿里云CDN介绍
27 0
|
14天前
|
存储 监控 前端开发
【专栏】阿里云ARMS前端监控的引入方法,以提升应用质量和稳定性
【4月更文挑战第29天】本文介绍了阿里云ARMS前端监控的引入方法,以提升应用质量和稳定性。该工具通过实时收集和分析用户行为、性能数据,提供错误监测和实时告警。步骤包括注册阿里云账号,创建前端监控项目,获取并嵌入监控代码到页面中,部署并运行,最后查看监控数据。案例和经验分享强调了合理设置监控指标、与其他工具结合以及定期分析数据的重要性。注意保护用户隐私,正确管理监控代码,并解决可能出现的数据不准确和大量错误告警问题。
|
14天前
|
运维 Serverless 应用服务中间件
Serverless 应用引擎产品使用之在阿里云Serverless中函数计算FC nginx 部署上去之后放置静态页面如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
220 0
|
14天前
|
弹性计算 运维 Serverless
Serverless 应用引擎产品使用之在阿里函数计算中,使数据库和阿里云函数计算位于同一个内网中如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
989 0
Serverless 应用引擎产品使用之在阿里函数计算中,使数据库和阿里云函数计算位于同一个内网中如何解决
|
14天前
|
运维 监控 Serverless
Serverless 应用引擎产品使用之在使用阿里云函数计算部署网站时,网站打开不稳定如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
169 0
|
15天前
|
运维 Serverless API
Serverless 应用引擎产品使用之在阿里云函数计算中通过调用函数如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
282 10
|
15天前
|
运维 文字识别 Serverless
Serverless 应用引擎产品使用之在阿里云函数计算中,需要处理的文件大于100MB如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
132 5
|
15天前
|
运维 Serverless API
Serverless 应用引擎产品使用之在阿里云函数计算中,容器运行过程中的最大内存使用量获取如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
35 2