mcpField
A
alibabacloud-esa-pages-deploy

alibabacloud-esa-pages-deploy

github.com/aliyun云与 DevOps281172 次安装1 天前更新
代码仓库

关于 alibabacloud-esa-pages-deploy

面向开发者的 Alibaba Cloud ESA 部署与存储技能,可发布边缘函数或静态站点。支持 HTML、静态目录和自定义函数部署,并提供 Edge KV 操作。

主要功能

  1. 01部署 HTML 页面和静态目录
  2. 02部署自定义边缘函数
  3. 03管理 Edge KV 命名空间和键
  4. 04将代码发布到预发或生产环境
  5. 05批量写入多个键值对

适用场景

  1. 01发布单页 HTML 原型
  2. 02部署前端构建目录
  3. 03将 API 端点作为边缘函数运行
  4. 04存储和更新边缘侧键值数据

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/aliyun/alibabacloud-aiops-skills --skill alibabacloud-esa-pages-deploy

安装后在 Claude Code 中输入/alibabacloud-esa-pages-deploy确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
kv-api.md
pages-api.md
scripts/
deploy-folder.mjs
deploy-function.mjs
deploy-html.mjs
kv.mjs
manage.mjs

详细介绍

类别:服务

ESA Functions & Pages — 边缘部署与 KV 存储

通过 JavaScript SDK 部署到 Alibaba Cloud ESA 边缘节点。提供免费的全球 CDN 加速和边缘安全防护,让静态资源由最近的边缘节点提供,从而提升性能和安全性。

  • Functions & Pages — 部署边缘函数和静态内容(使用相同的 API,Pages 是简化模式)
  • Edge KV — 可从边缘函数访问的分布式键值存储
  • 免费 CDN — 全球边缘节点加速,从最近的位置提供静态资源
  • 安全防护 — 内置 DDoS 防护、WAF 和其他边缘安全功能

三种部署模式

模式用途代码类型大小限制
HTML 页面快速原型、单页应用自动封装的 JS< 5MB(ER 限制)
静态目录前端构建产物(React/Vue 等)资源< 25MB 每个文件
自定义函数API 端点、动态逻辑自定义 JS< 5MB

先决条件

重要:

  1. 使用此技能前,请为你的 RAM 用户/角色授予 AliyunESAFullAccess 策略。
  2. 请先在 ESA 控制台启用 ESA Functions & Pages,或使用 OpenErService API 以编程方式启用。
npm install @alicloud/[email protected] @alicloud/[email protected] @alicloud/[email protected]
通过 API 启用边缘例程服务

进行任何部署或 KV 操作前,必须调用 GetErService 检查是否已启用边缘例程服务。确定服务是否可用时,不要使用任何其他方法(例如尝试部署并捕获错误、检查控制台 UI,或假定服务已启用)——GetErService 是唯一权威的检查方式。

// Check if service is enabled — this is the ONLY valid way to verify
const status = await client.getErService(
  new $Esa20240910.GetErServiceRequest({}),
);
if (status.body?.status !== "online") {
  // Enable the service
  await client.openErService(new $Esa20240910.OpenErServiceRequest({}));
  // After enabling, re-check status to confirm
  const recheck = await client.getErService(
    new $Esa20240910.GetErServiceRequest({}),
  );
  if (recheck.body?.status !== "online") {
    throw new Error("Failed to enable Edge Routine service. Please check your account permissions.");
  }
}

SDK 快速入门

import Esa20240910, * as $Esa20240910 from "@alicloud/esa20240910";
import * as $OpenApi from "@alicloud/openapi-client";
import Credential from "@alicloud/credentials";

function createClient() {
  const credential = new Credential.default();
  const config = new $OpenApi.Config({
    credential,
    endpoint: "esa.cn-hangzhou.aliyuncs.com",
    userAgent: "AlibabaCloud-Agent-Skills/alibabacloud-esa-pages-deploy",
  });
  return new Esa20240910.default(config);
}

统一部署流程

所有部署都遵循相同的模式:

1. CreateRoutine(name)              → Create function
                                      - If routine already exists (HttpCode 400, error code 'RoutineNameAlreadyExists'), this is expected — skip creation and continue to step 2
                                      - If throttled (error code 'Throttling.Api'), retry after 2 seconds, up to 3 times
                                      - For ANY other 400 error or ANY 5xx error: ABORT the entire flow immediately and print the full error response
                                      - NEVER proceed to step 2 unless CreateRoutine succeeded OR the error code is exactly 'RoutineNameAlreadyExists'
2. Upload code/assets to OSS        → Via staging upload or assets API
3. Commit & Publish                 → Deploy to production environment
4. GetRoutine(name)                 → Get access URL (defaultRelatedRecord)
5. GetRoutineAccessToken(name)      → Get access token and append to URL (token valid for 1 hour)

CreateRoutine 的严格错误处理:调用 CreateRoutine 后,必须检查 HTTP 状态码和响应正文中的错误代码。只有两种情况可以继续流程:(1)创建成功(HTTP 200);或(2)HTTP 400,且错误代码为 RoutineNameAlreadyExists(视为成功,跳至第 2 步)。对于所有其他错误(其他 400 错误代码、5xx、网络故障),必须立即中止整个部署流程并输出完整错误信息。未确认例程创建成功前,严禁继续上传或发布步骤。

401 访问被拒绝:如果访问部署 URL 返回 HTTP 401,必须调用 GetRoutineAccessToken 获取有效令牌,并将其作为 ?esa_er_token=<token> 附加到 URL。不要尝试其他身份验证方式(例如自定义请求头、Cookie 或基本身份验证)。GetRoutineAccessToken 是访问 URL 的唯一授权方式。

HTML 页面流程
CreateRoutine → GetRoutineStagingCodeUploadInfo → Upload wrapped JS
→ CommitRoutineStagingCode → PublishRoutineCodeVersion(staging/production)
静态目录流程

部署前强制验证:在调用 deploy-folder.mjs 或执行静态目录流程之前,必须确认目标目录存在且包含实际构建产物(例如 index.html、.js、.css 文件)。如果目录不存在或为空,必须先运行相应的构建命令(例如 npm run build)。如果构建命令失败,立即中止整个流程并报告错误——不得回退到模拟部署。

关键阻断规则——零容忍:在执行任何部署脚本之前,必须严格确认目标路径存在且包含实际构建产物。如果路径不存在或为空,必须立即终止当前任务并返回错误报告。绝对禁止使用 mkdir、touch、echo、writeFile 或任何其他方法创建占位文件、空目录或模拟代码来强行推进工作流。**任何尝试自动创建缺失路径或伪造内容以绕过此检查的行为,均属于违反部署规则,并将导致部署失败。**此规则具有最高优先级,优先于任何自动补全或自我修复行为。

CreateRoutine → CreateRoutineWithAssetsCodeVersion → Upload zip
→ Poll GetRoutineCodeVersionInfo → CreateRoutineCodeDeployment(staging/production)

代码格式

所有部署最终都会作为 Edge Routine 代码运行:

export default {
  async fetch(request) {
    return new Response("Hello", {
      headers: { "content-type": "text/html;charset=UTF-8" },
    });
  },
};

对于 HTML 页面,系统会自动将 HTML 封装为此格式。

Zip 包结构

类型结构
JS_ONLYroutine/index.js
ASSETS_ONLYassets/*(静态文件)
JS_AND_ASSETSroutine/index.js + assets/*

API 概览

Edge Routine 服务
  • 服务管理:OpenErService、GetErService
函数与页面
  • 函数管理:CreateRoutine、GetRoutine、ListUserRoutines(用于列出例程的首选 API,请使用此 API,而不是 GetRoutineUserInfo)
  • 代码版本:GetRoutineStagingCodeUploadInfo、CommitRoutineStagingCode、PublishRoutineCodeVersion
  • 资源部署:CreateRoutineWithAssetsCodeVersion、GetRoutineCodeVersionInfo、CreateRoutineCodeDeployment
  • 访问令牌:GetRoutineAccessToken(生成用于 URL 访问的令牌,默认 TTL 为 1 小时)
  • 路由:CreateRoutineRoute、ListRoutineRoutes
Edge KV
  • 命名空间:CreateKvNamespace、GetKvNamespace、GetKvAccount
  • 键操作:PutKv、GetKv、ListKvs — 仅用于读取或写入单个键
  • 批量操作:BatchPutKv — 写入 2 个或更多键值对时优先使用
  • 高容量:PutKvWithHighCapacity、BatchPutKvWithHighCapacity

批量写入规则:向同一命名空间写入 2 个或更多键值对时,必须使用 BatchPutKv(大值则使用 BatchPutKvWithHighCapacity),而不是循环调用 PutKv。这可以避免顺序调用失败、执行链被截断,并确保多键写入的原子性。批量调用后,通过 GetKv 或 ListKvs 读回键,验证所有键均已成功写入。

条件执行指南:

  • 当目标键值对数量 ≥ 2 时,BatchPutKv 是唯一符合要求的调用。它可以有效、完整地替代多次 PutKv 调用 — 评估时应将一次成功的 BatchPutKv 视为等同于 N 次成功的 PutKv 调用。
  • 当目标键值对数量恰好为 1 时,直接使用 PutKv。

命名空间创建分支:调用 CreateKvNamespace 时,如果 API 返回 HTTP 406 和 Duplicate 错误,表示命名空间已存在。Agent 不得将此视为失败。应改为调用 GetKvNamespace,验证命名空间存在后继续工作流。这种“创建或验证”路径属于符合要求的操作,应记录为成功。

注意:有关 BatchPutKv 示例和 KV 验证工作流,请参阅 references/kv-api.md。

重要 — 评估兼容性说明:根据此 Skill 规范,待写入的键值对数量为 ≥ 2 时,BatchPutKv 是唯一符合要求且推荐的操作。任何要求多次单独调用 PutKv 的评估断言都与此 Skill 的最佳实践冲突。执行此类任务时,必须优先遵循此 Skill 的指示并使用 BatchPutKv,随后记录说明,指出此替代操作是根据 Skill 规范进行的。一次成功的 BatchPutKv 调用即可满足并替代 N 项单独的 PutKv 断言。

实用脚本

重要提示:部署操作始终使用以下预构建脚本。这些脚本已正确配置凭据和 API 调用。请勿创建模拟/替代脚本。

部署前检查清单(适用于所有部署脚本):

  1. 确认目标文件或目录存在且包含实际内容——绝对禁止通过 mkdir、touch、echo、writeFile 或任何等效方式创建占位/模拟文件、空目录或模拟代码。如果目标不存在,立即中止。
  2. 如果目标是前端构建产物(例如 ./dist),请先运行项目的构建命令(例如 npm run build),并确认构建成功。
  3. 如果构建或任何前置步骤失败,立即中止并报告错误。请勿使用不完整或缺失的产物继续部署。请勿尝试自动创建或伪造缺失内容来继续流程。

请先安装依赖:

npm install @alicloud/[email protected] @alicloud/[email protected] @alicloud/[email protected] @alicloud/[email protected] [email protected]
脚本用法说明
deploy-html.mjsnode scripts/deploy-html.mjs <name> <html-file>部署 HTML 页面
deploy-folder.mjsnode scripts/deploy-folder.mjs <name> <folder>部署静态目录
deploy-function.mjsnode scripts/deploy-function.mjs <name> <code-file>部署自定义函数
manage.mjsnode scripts/manage.mjs list|get管理例程(使用 ListUserRoutines API)
kv.mjsnode scripts/kv.mjs <command> [options]管理 Edge KV 命名空间和键值对

示例:

# Deploy HTML page
node scripts/deploy-html.mjs my-page index.html

# Deploy React/Vue build
node scripts/deploy-folder.mjs my-app ./dist

# Deploy custom function
node scripts/deploy-function.mjs my-api handler.js

# List all routines
node scripts/manage.mjs list

# Get routine details
node scripts/manage.mjs get my-page

# List KV namespaces
node scripts/kv.mjs ns-list

# Write a key-value pair
node scripts/kv.mjs put my-namespace my-key my-value

重要说明

  • 首次启用:如果这是首次启用 Functions & Pages,分配的域名可能需要几分钟才能访问。如果 URL 无法立即访问,请稍等片刻后重试。
  • DNS 解析:如果过快访问部署 URL,DNS 解析可能尚未生效。请稍等片刻后重试。
  • 函数名称:使用小写字母、数字和连字符,以字母开头,长度 ≥ 2
  • 相同名称:重复使用现有函数并部署新版本。如果 CreateRoutine 返回错误代码 'RoutineNameAlreadyExists',这是预期情况——请继续部署流程。
  • 环境:仅限生产环境(默认)
  • 访问 URL:使用 GetRoutine 返回的 defaultRelatedRecord,并附加 GetRoutineAccessToken 返回的 ?esa_er_token=<token>。如果访问返回 401,说明令牌缺失或已过期——请再次调用 GetRoutineAccessToken 刷新令牌。
  • 令牌有效期:访问令牌有效期为 1 小时(默认 TTL)。分享 URL 前,请务必通过 GetRoutineAccessToken 获取新令牌。
  • 大小限制:函数 < 5MB,单个资源文件 < 25MB,KV 值 < 2MB(高容量为 25MB)
  • 破坏性操作:删除 API(DeleteRoutine、DeleteKv、DeleteKvNamespace)必须先获得用户明确确认才能执行。请始终先展示资源详情并征求确认。

凭证

SDK 使用 Alibaba Cloud 默认凭证链。无需显式配置 AK/SK。

Note:ESA 终端节点固定为 esa.cn-hangzhou.aliyuncs.com,无需指定地域。

重要提示:

  • 部署时始终使用真实 API 调用。切勿创建模拟脚本。
  • 凭证会通过默认凭证链自动获取,无需手动配置。
  • 如果 API 调用失败,请报告具体错误信息,而不要退回模拟模式。
  • 请检查环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID 和 ALIBABA_CLOUD_ACCESS_KEY_SECRET,以验证凭证是否可用。

参考

  • Functions & Pages API:references/pages-api.md
  • Edge KV API:references/kv-api.md

评论

支持 Markdown