云函数初体验

2022-05-03, 星期二, 11:17

趁五一假期体验了下云函数。本来购买腾讯云是为了部署网站,后来网站走了 Netlify,体验非常好,服务器就吃灰了。

这次是需要为某个开发商生成免登录 Token。目标系统分发 Token 的接口当然不能暴露给他人,又不便做二次开发,就考虑用云函数了。API 网关响应请求,函数内发起对目标接口的调用,把响应回复给调用者,和计费说明里的示意图完全一致。

长期使用云函数的免费额度为事件函数和 Web 函数各 5 万次调用,外网流量 0.5GB,资源使用量 2 万 GBs,还是足够应付一些轻量级的应用的。

腾讯云提供了大量 demo,可以看看代码结构是什么样的。

新建事件函数,这样后期可以按调用次数创建限流规则。开发语言选择了 Node.js,这样 Postman 里验证完接口可以直接生成调用代码。

触发器可以选择 API 网关触发(当然如果有个地方(Redis/Memcached)可以把 Token 持久化,或者改成主动推送模式,也可以考虑定时器触发)。选中「集成响应」,这样云函数就可以向调用者发送反馈了。

如果完全使用的在线编辑器开发,需要主动维护 package.json 并开启「自动安装依赖」或在终端中执行 npm installyarn add

API 网关对函数响应有一定要求,函数的返回值需要满足如下类型:

class Response {
    isBase64Encoded: boolean;
    statusCode: number;
    headers: map-like;
    // 如果响应是 JSON 类型的,body 就使用 JSON.stringify 序列化
    body: string;
}

腾讯云的最佳实践建议「在代码中尽可能多地使用 log/print 语句,给调试工作带来充足的信息」,不过我这里足够简单,使用测试功能就基本可以验证了。

在触发管理里可以看到如何调用这个云函数,由于我使用了无鉴权 GET 请求触发,可以直接通过 curl 验证。

$ curl https://service-*.gz.apigw.tencentcs.com/release/showcase-1651284537

{"success":true,"payload":{"status":200,"msgs":{},"data":{"token":"******","timeout":604800000},"success":true}}%

需注意 114 等 DNS 或许不能及时更新地址记录,依赖 getaddrinfo 解析域名的工具(如 curl)不一定如预期工作。Chromium 系的浏览器或许有自己的一套域名解析机制(比如这里就有一些讨论),因此不受影响。这时候把 DNS 改成 8.8.8.8 之类的就好。

API 网关中新建系统插件,「基础流量控制」支持多种条件设置指定时间区间内允许的调用次数。创建插件后绑定云函数即可。

超出调用次数后将返回 Requests rate limited. stage: trafficcontrol