六维教程

EdgeOne Makers Cloud Functions 基础

Edge Functions 处理轻量逻辑很在行,但遇到要装第三方库、访问数据库、做复杂计算的场景就不够用了。Cloud Functions 就是为这类”重活”准备的,它跑在中心机房,提供完整的运行时环境。这一篇讲 Cloud Functions 的基础概念、运行时环境和函数触发方式。

Cloud Functions 是什么

Cloud Functions 是跑在中心机房里的 Serverless 函数。和 Edge Functions 最大的区别在于,它提供完整的运行时环境。Node.js、Python、Go 这些语言的原生特性都能用,npm installpip install 装的依赖包也没限制。

和 Edge Functions 的对比可以回看Functions 概览,这里用一张更细的表来说明。

对比维度 Edge Functions Cloud Functions
运行时 类 Web API 的轻量环境 完整的 Node.js/Python/Go
包管理 不支持,代码要尽量小 支持 npm/pip/go mod
执行时间上限 通常几十秒 可到几分钟甚至更长
内存 较小 更大,可配置
文件系统 基本不可用 有临时文件系统
网络连接 受限,只能出站 HTTP 几乎无限制

一句话: Edge Functions 是”快进快出”,Cloud Functions 是”正经干活”。

运行时环境

EdgeOne Makers 目前支持三种运行时: Node.js、Python 和 Go。不同运行时的版本和支持情况如下。

运行时 默认版本 可选版本 包管理
Node.js 18.x 16.x, 20.x npm (package.json)
Python 3.11 3.9, 3.10 pip (requirements.txt)
Go 1.21 go mod

创建函数时选择运行时,后续代码、依赖、构建方式都跟着运行时走。具体每种运行时的开发细节在Node.jsPythonGo这三篇里分别讲,这里先搞懂通用的概念。

函数结构

不管用哪种语言,Cloud Functions 的基本结构是一样的: 你定义一个入口函数,平台在触发条件满足时调用它。

以 Node.js 为例,最简单的结构如下。

// index.js
exports.main = async function(event, context) {
  // event 包含触发函数的信息,比如 HTTP 请求的内容
  // context 包含运行环境信息,比如函数名、请求 ID
  return {
    statusCode: 200,
    body: JSON.stringify({ message: 'Hello from Cloud Function' })
  };
};

Python 版本。

# index.py
def main_handler(event, context):
    """
    event: 触发事件的信息
    context: 运行上下文
    """
    return {
        "statusCode": 200,
        "body": { "message": "Hello from Cloud Function" }
    }

Go 版本。

// index.go
package main

import (
    "context"
    "encoding/json"
)

type Response struct {
    StatusCode int    `json:"statusCode"`
    Body       string `json:"body"`
}

func MainHandler(ctx context.Context, event json.RawMessage) (*Response, error) {
    body, _ := json.Marshal(map[string]string{
        "message": "Hello from Cloud Function",
    })
    return &Response{
        StatusCode: 200,
        Body:       string(body),
    }, nil
}

三种语言的结构对比。

要素 Node.js Python Go
入口函数名 main main_handler MainHandler
第一个参数 event event event
第二个参数 context context ctx
返回值 对象或 Promise 字典 (*Response, error)

函数触发方式

Cloud Functions 不是自己监听端口的,而是由平台在特定条件满足时触发执行。触发方式主要有以下几种。

HTTP 触发

最常见的方式。函数绑定一个 URL 路径,有请求打到这个路径时函数就执行。

用户请求 → EdgeOne 边缘节点 → 转发到 Cloud Functions → 函数执行返回响应

在控制台配置时,选择”API 网关触发”或者”HTTP 路径触发”,指定路径规则就行。

定时器触发

类似 cron 定时任务,按设定的时间间隔自动执行函数。比如每天凌晨 3 点清理过期数据、每 5 分钟检查一次服务状态。

定时器 → 触发 Cloud Functions → 函数执行

时间表达式用标准的 cron 语法。

表达式 含义
0 0 3 * * * * 每天凌晨 3 点
0 */5 * * * * * 每 5 分钟
0 0 9 ? * MON-FRI 工作日每天早上 9 点

事件触发

其他云服务产生的事件也可以触发 Cloud Functions。比如对象存储里有新文件上传了,消息队列里有新消息了,这些事件都能配置成触发条件。

手动触发

在控制台里点一下”测试”按钮,或者通过命令行工具调用,也能手动触发函数执行。调试阶段用得最多。

函数配置

创建函数时和创建完之后,都可以调整以下配置。

配置项 说明 常见值
运行时 选 Node.js/Python/Go Node.js 18
内存 函数可用的内存大小 128MB, 256MB, 512MB
超时时间 函数最长执行多久 3s, 10s, 60s
环境变量 函数代码里可以读取的配置值 API_KEY, DB_HOST
并发数 同时执行多少个实例 根据计费套餐不同

内存和超时时间要根据实际场景调。内存太小会 OOM(内存溢出),超时太短任务还没跑完就被杀了。

日志和调试

函数执行时的 console.log(Node.js)、print(Python)、fmt.Println(Go)输出都会被平台收集,在控制台的”日志查询”模块里可以看到。

调试流程一般是这样的。

本地编写代码
  ↓
本地测试(用模拟的 eventcontext)
  ↓
部署到线上
  ↓
控制台查看日志
  ↓
根据日志修复问题
  ↓
重新部署

小问题可以直接在控制台的在线编辑器里改,改完立刻部署。大改动还是建议本地开发好再推上去。

速查卡片

要点 说明
Cloud Functions 定位 中心机房运行,完整运行时,处理重计算任务
支持的运行时 Node.js、Python、Go
入口函数 Node.js 用 main,Python 用 main_handler,Go 用 MainHandler
HTTP 触发 绑定 URL 路径,有请求就执行
定时器触发 cron 表达式,定时自动执行
事件触发 由其他云服务的事件触发
环境变量 控制台配置,代码里读取,不要硬编码敏感信息
日志查看 控制台”日志查询”模块,标准输出会被收集
上一篇
EdgeOne Makers Edge Functions
下一篇
EdgeOne Makers Cloud Functions Node.js