一、支持的事件类型
Makers 支持以下事件类型的通知:
| 类别 | 事件 | 字段 | 说明 |
| 域名 | 域名配置 | domain.added | 添加自定义域名时触发(暂不包括 CNAME 配置,证书配置以及删除事件)。 |
| 部署 | 部署失败 | deployment.failed | 部署过程中发生错误时触发。 |
| | 部署成功 | deployment.succeeded | 部署完成且成功时触发。 |
| | 部署创建 | deployment.created | 新的部署开始时触发。 |
| 项目 | 项目删除 | project.deleted | 项目被删除时触发。 |
| | 项目更新 | project.settings.updated | 项目设置被修改时触发。 |
| | 项目创建 | project.created | 新项目被创建时触发。 |
二、使用通知接收消息
通知功能允许你通过站内信、邮箱或短信接收 Makers 事件。操作步骤参考如下:
1. 登录 边缘安全加速平台 EO 控制台,在左侧菜单栏中,进入服务总览,单击 Makers 卡片。
2. 进入 Makers 的设置,单击通知,打开通知设置开关并选择需要接收的通知事件。
开启后,通知功能包含以下通知渠道:
·站内信 – 在腾讯云控制台内接收通知。
·邮箱 – 接收邮件通知。
·短信 – 接收短信通知。
对于每个事件类型,可单独选择是否接收通知。
注意:消息中心接收人管理跟订阅管理的配置方式可参考文档 消息接收管理。
三、使用 Webhook 自定义推送渠道
Webhook 允许你将 EdgeOne Makers 的事件实时推送到你自己的服务器或第三方服务。当 Makers 发生特定事件时,会向你配置的 Webhook 端点发送 HTTP POST 请求,包含完整的事件数据。操作步骤参考如下:
1. 登录 边缘安全加速平台 EO 控制台,在左侧菜单栏中,进入服务总览,单击 Makers 卡片。
2. 进入 Makers 的设置,单击 Webhooks ,填写 Webhook 相关配置,配置参考如下:
| 配置项 | 说明 |
| 项目 | 全部项目:Webhook 对账户下的所有项目生效。指定项目:Webhook 仅对选中的项目生效。 |
| 事件 | 选择要监听的 事件类型,支持多选。 |
| 端点 | Webhook URL(必填):你的服务器接收事件通知的地址。密钥令牌(可选):用于验证请求来源,留空时由平台自动生成。 |
四、什么是端点
端点是你服务器上的一个 URL,用于接收来自 Makers 的 Webhook 请求。
五、请求格式
当事件发生时,Makers 会向你的端点发送 HTTP POST 请求。
HTTP 请求头:
POST /webhooks/edgeone-pages HTTP/1.1Host: example.comContent-Type: application/jsonAccept: application/json, text/plain, */*Accept-Encoding: gzip, compress, deflate, brAuthorization: Bearer xxxConnection: keep-alive
请求体示例(JSON 格式):
部署事件示例(deployment.created):
{ "eventType": "deployment.created", "appId": "app-123", "projectId": "project-456", "deploymentId": "deploy-789", "projectName": "my-project", "repoBranch": "main", "timestamp": "2024-01-13T12:34:56.789Z"}
项目事件示例(project.created):
{ "eventType": "project.created", "appId": "app-123", "projectId": "project-456", "projectName": "my-project", "repoUrl": "https://github.com/user/repo", "timestamp": "2024-01-13T12:34:56.789Z"}
域名事件示例(domain.added):
{ "eventType": "domain.added", "appId": "app-123", "projectId": "project-456", "projectName": "my-project", "domainName": "example.com", "domainId": "domain-789", "timestamp": "2024-01-13T12:34:56.789Z"}
字段说明:
| 字段 | 类型 | 说明 | 出现场景 |
| eventType | string | 事件类型 | 所有事件 |
| appId | string | 账户 ID | 所有事件 |
| projectId | string | 项目 ID | 所有事件 |
| timestamp | string | 事件发生的时间戳(ISO 8601 格式) | 所有事件 |
| projectName | string | 项目名称 | 所有事件 |
| deploymentId | string | 部署 ID | 部署事件 |
| repoBranch | string | Git 分支 | 部署事件 |
| repoUrl | string | 仓库 URL | 项目事件 |
| domainName | string | 域名 | 域名事件 |
| domainId | string | 域名 ID | 域名事件 |
注意:如果你的端点返回非 2xx 状态码或无法访问,Makers 会采取指数退避策略自动重试最多 3 次。
六、如何实现端点
你需要在自己的服务器上实现一个端点来接收 Webhook 请求。以下是一个 Cloud Functions 的示例:
/** * API 路径: /webhooks/demo *//** * 验证 Bearer Token(可选) */function verifyToken(authHeader, expectedToken) { if (!expectedToken) return true; // 未配置则跳过验证 const parts = authHeader?.split(' '); if (parts?.length !== 2 || parts[0] !== 'Bearer') return false; return parts[1] === expectedToken;}/** * 处理 webhook 事件 */function handleEvent(eventType, data) { switch (eventType) { case 'deployment.created': console.log(` 部署创建: ${data.projectName} (${data.repoBranch})`); // 在此添加你的业务逻辑 // 例如: 发送通知、更新数据库等 return { message: '部署事件已处理', projectName: data.projectName }; case 'project.created': console.log(` 项目创建: ${data.projectName}`); return { message: '项目事件已处理', projectName: data.projectName }; // 更多事件可参考支持的事件类型 default: console.log(`⚠️ 未知事件: ${eventType}`); return { message: '未知事件类型', eventType }; }}/** * Cloud Function 入口 */export async function onRequest(context) { const { request, env } = context; // 1. 健康检查 if (request.method === 'GET') { return new Response(JSON.stringify({ status: 'ok', message: 'Webhook endpoint is ready' }), { headers: { 'Content-Type': 'application/json' } }); } // 2. 只接受 POST if (request.method !== 'POST') { return new Response(JSON.stringify({ error: 'Method not allowed' }), { status: 405, headers: { 'Content-Type': 'application/json' } }); } try { // 3. 验证 Bearer Token(可选) const authHeader = request.headers.get('authorization'); const webhookToken = env.WEBHOOK_TOKEN; if (webhookToken && !verifyToken(authHeader, webhookToken)) { return new Response(JSON.stringify({ error: 'Unauthorized' }), { status: 401, headers: { 'Content-Type': 'application/json' } }); } // 4. 解析请求体 const payload = await request.json(); const eventType = payload.eventType || payload.type; // 5. 处理事件 const result = handleEvent(eventType, payload); // 6. 返回成功响应 return new Response(JSON.stringify({ success: true, eventType, result, timestamp: new Date().toISOString() }), { status: 200, headers: { 'Content-Type': 'application/json' } }); } catch (error) { console.error('处理错误:', error); return new Response(JSON.stringify({ error: 'Internal server error', message: error.message }), { status: 500, headers: { 'Content-Type': 'application/json' } }); }}