From 814da834cd5b89bd853b02a31d2995ce59a8f6d8 Mon Sep 17 00:00:00 2001 From: ls147258 Date: Sun, 9 Aug 2026 14:01:12 +0800 Subject: [PATCH] feat: add s-fc3 Qoder skill and ignore .codegraph - Bundle s-fc3 skill under .agents/skills/s-fc3 for project-relative install - Add .codegraph/ to .gitignore - Fix docs: cross-platform date examples, FC_DOCKER_VERSION 3.1.0, logs --match value, remove certConfig from HTTP domain example - Fix release-ops: alias --vw flag, scaling max-instances removal, horizontal scaling minInstances/maxInstances field names --- .agents/skills/s-fc3/README.md | 126 +++++++ .agents/skills/s-fc3/SKILL.md | 324 ++++++++++++++++++ .agents/skills/s-fc3/agents/openai.yaml | 7 + .agents/skills/s-fc3/references/domain.md | 133 +++++++ .../skills/s-fc3/references/fc-endpoints.md | 53 +++ .../skills/s-fc3/references/release-ops.md | 99 ++++++ .../s-fc3/references/triggers-and-async.md | 61 ++++ .../s-fc3/references/troubleshooting.md | 49 +++ .gitignore | 3 +- 9 files changed, 854 insertions(+), 1 deletion(-) create mode 100644 .agents/skills/s-fc3/README.md create mode 100644 .agents/skills/s-fc3/SKILL.md create mode 100644 .agents/skills/s-fc3/agents/openai.yaml create mode 100644 .agents/skills/s-fc3/references/domain.md create mode 100644 .agents/skills/s-fc3/references/fc-endpoints.md create mode 100644 .agents/skills/s-fc3/references/release-ops.md create mode 100644 .agents/skills/s-fc3/references/triggers-and-async.md create mode 100644 .agents/skills/s-fc3/references/troubleshooting.md diff --git a/.agents/skills/s-fc3/README.md b/.agents/skills/s-fc3/README.md new file mode 100644 index 00000000..d5779bf9 --- /dev/null +++ b/.agents/skills/s-fc3/README.md @@ -0,0 +1,126 @@ +# s-fc3 + +阿里云函数计算 FC3 + Serverless Devs (`s` CLI + `fc3` 组件) 的 Agent Skill。 + +用自然语言操作阿里云函数计算:查函数列表、调用函数、查日志、看实例、管理版本别名灰度、配置弹性伸缩、触发器、VPC/NAS、自定义域名等。 + +## 快速开始 + +```bash +npm i -g @serverless-devs/s +s config add # 配阿里云 AccessKey +``` + +## 使用示例 + +以下对话来自与 Agent 的真实交互(杭州区域,`access: default`): + +### 查函数列表 + +``` +❯ 帮我查看下阿里云杭州 test 为前缀的函数有哪些 +``` + +Agent 自动执行 `s cli fc3 list --region cn-hangzhou -o json --silent`,筛选出所有 `test*` 函数,分类汇总服务名、函数数量、运行时和创建时间。 + +### 调用函数 + +``` +❯ 调用下 test-f 函数 +``` + +Agent 执行 `s cli fc3 invoke --region cn-hangzhou --function-name test-f --silent`,返回 `hello world`。 + +带自定义事件体: + +```bash +s cli fc3 invoke --region cn-hangzhou --function-name test-f --silent \ + -e '{"action":"create","user":"alice","data":{"score":88}}' +``` + +### 批量调用 + +``` +❯ 给我随机产生自定义事件体,调用 test-f 5 次 +``` + +Agent 生成 5 组各不相同的 JSON 事件体(create/update/delete/search/notify),依次调用并汇总结果表格。 + +### 查日志 + +``` +❯ 帮我查看下 test-f 最近调用情况 +``` + +Agent 自动构造时间范围(最近 1 小时),执行: + +```bash +# macOS +s cli fc3 logs --region cn-hangzhou --function-name test-f \ + -s "$(TZ=Asia/Shanghai date -v-1H +%Y-%m-%dT%H:%M:%S+08:00)" \ + -e "$(TZ=Asia/Shanghai date +%Y-%m-%dT%H:%M:%S+08:00)" + +# Linux +s cli fc3 logs --region cn-hangzhou --function-name test-f \ + -s "$(TZ=Asia/Shanghai date -d '1 hour ago' +%Y-%m-%dT%H:%M:%S+08:00)" \ + -e "$(TZ=Asia/Shanghai date +%Y-%m-%dT%H:%M:%S+08:00)" +``` + +### 按实例查日志 + +``` +❯ 查看下实例 c-69f9eed8-15f8e4fe-55032c26cf38 所有请求情况 +``` + +```bash +s cli fc3 logs --region cn-hangzhou --function-name test-f \ + --instance-id c-69f9eed8-15f8e4fe-55032c26cf38 +``` + +Agent 列出该实例上的全部请求(含冷启动标记和每次调用的 RequestId)。 + +### 按 RequestId 查日志 + +``` +❯ 查看 1-69f9ef93-1510a7cb-5873a9384742 日志 +``` + +```bash +s cli fc3 logs --region cn-hangzhou --function-name test-f \ + --request-id 1-69f9ef93-1510a7cb-5873a9384742 +``` + +精确返回该次调用的完整日志。 + +### 查函数详情 + +``` +❯ 查看 test-f 函数详情 +``` + +```bash +s cli fc3 info --region cn-hangzhou --function-name test-f -o json --silent +``` + +Agent 以表格呈现:运行时、CPU/内存/磁盘、超时、代码大小、网络配置、实例模式、创建/修改时间、日志配置等。 + +## 更多能力 + +| 功能 | 说明 | +|------|------| +| `s deploy` | 部署函数(代码/配置/触发器/异步配置可分别部署) | +| `s build` | Docker 环境构建依赖、打层、自定义容器 | +| `s local` | 本地调用/调试(含 VS Code / IntelliJ 断点) | +| `s logs` | SLS 日志查询(按时间/RequestId/实例/失败过滤/tail 跟踪) | +| `s info` / `s plan` | 查看线上配置 / 预览变更 | +| `s remove` | 删除资源(支持 -y 强制、按触发器删除) | +| `s instance` | 查看活跃实例、进入实例 Shell、执行命令 | +| `s version` / `s alias` | 版本发布 + 别名灰度(流量权重) | +| `s scaling` / `s concurrency` | 弹性伸缩 + 并发控制 | +| `s layer` | 层管理(发布/查看/下载/权限/删除) | +| `s session` | 会话管理(创建/列表/更新/删除) | +| `s sync` | 线上配置拉到本地 | +| `s2tos3` | FC2 格式转 FC3 | +| fc3-domain | 自定义域名(多函数路由、HTTPS、TLS、WAF) | + +详细用法见 [SKILL.md](./SKILL.md)。 \ No newline at end of file diff --git a/.agents/skills/s-fc3/SKILL.md b/.agents/skills/s-fc3/SKILL.md new file mode 100644 index 00000000..77069cdb --- /dev/null +++ b/.agents/skills/s-fc3/SKILL.md @@ -0,0 +1,324 @@ +--- +name: s-fc3 +description: 阿里云 FC3 + Serverless Devs(`s` + `fc3` 组件 + s.yaml):部署、调试、日志、版本别名灰度、弹性/并发、触发器、VPC/NAS、自定义域名(fc3-domain)。默认 FC3;`fc` 仅限 FC2 存量。 +--- + +# 阿里云函数计算 FC3(Serverless Devs / `s`) + +> 中文为主;命令、YAML 字段名、错误码保留英文便于检索和复制。 +> 默认使用 `fc3`。只有用户明确在维护 FC2 存量时,才讨论 `fc` / `edition: 1.0.0`。 + +## 使用原则 + +- 先看 `s.yaml`:确认 `region`、`runtime`、`functionName`、`triggers`、`component`。 +- 先查用法:每层命令都先 `-h`,例如 `s -h` → `s cli fc3 -h` → `s cli fc3 logs -h`。 +- 有 `s.yaml` 时优先用简写命令;没有 `s.yaml` 时用 `s cli fc3 ...` 并把参数写全。 +- 非默认接入点、域名、发布运维、触发器、排障等细节,读对应引用文件。 +- 遇到 FC2 存量迁移,优先建议 `s2tos3`,不要默认继续沿用 `fc`。 + +## 核心流程 + +```text +写代码 → s build → 把构建输出中的 environmentVariables / layers 写回 s.yaml → s deploy → s invoke 或 curl +``` + +- 改配置前先 `s plan`。 +- 只改代码用 `s deploy --function code`。 +- 只改配置用 `s deploy --function config`。 +- 只改触发器或异步配置时,单独部署对应部分更稳。 + +## 安装与配置 + +```bash +npm i -g @serverless-devs/s +s config add +``` + +### 非默认 FC API 接入点 + +- 使用 `FC_CLIENT_CUSTOM_ENDPOINT`。 +- 形式:`{协议}://{主账号uid}.{cluster}.{域}`。 +- `{主账号uid}` 必须是主账号 UID,不是子账号 UID。 +- `--region` 要和集群匹配。 +- 常见测试 / 内网集群模板与示例见 [FC 接入点](references/fc-endpoints.md)。 + +## 最小示例 + +```yaml +edition: 3.0.0 +name: my-app +access: default + +resources: + my_func: + component: fc3 + props: + region: cn-hangzhou + functionName: my-func + runtime: python3.10 + handler: index.handler + memorySize: 128 + cpu: 0.5 + diskSize: 512 + code: ./code +``` + +## 常用配置项 + +| 分类 | 配置项 | +|------|--------| +| 身份与运行时 | `region`, `functionName`, `description`, `runtime`, `handler` | +| 算力 | `memorySize`, `cpu`, `diskSize`, `timeout`, `instanceConcurrency` | +| 代码与镜像 | `code`, `customContainerConfig` | +| 网络 | `vpcConfig`, `vpcBinding`, `nasConfig`, `ossMountConfig`, `internetAccess`, `customDNS` | +| 可观测 | `logConfig`, `tracingConfig` | +| 运行时调优 | `customRuntimeConfig`, `environmentVariables`, `instanceLifecycleConfig`, `gpuConfig`, `layers`, `role`, `sessionAffinity`, `sessionAffinityConfig` | +| 发布 | `scalingConfig`(优先), `concurrencyConfig`, `provisionConfig`(存量) | +| 触发器 | `triggers`, `customDomain` | +| 异步 | `asyncInvokeConfig` | +| 其他 | `tags`, `idleTimeout`, `disableInjectCredentials` | + +- `code` 与 `customContainerConfig` 二选一。 +- `cpu` 与 `diskSize` 要么同时写,要么都不写。 +- `custom` / `custom.debian10` / `custom-container` 下 `handler` 可选,`instanceConcurrency` 可调 1–200。 +- 标准运行时的 `instanceConcurrency` 固定为 1。 + +## 常用命令 + +### build / deploy / remove / plan + +```bash +s build +s build --publish-layer +s build --command="pip install -t . flask" +s build --use-sandbox +s build --dockerfile ./Dockerfile + +s deploy +s deploy --function code +s deploy --function config +s deploy --trigger trig1,trig2 +s deploy --async-invoke-config +s deploy --skip-push +s deploy -y + +s remove +s remove -y +s remove --trigger t1 + +s plan +``` + +### local / invoke / logs / instance / info + +```bash +s local invoke +s local invoke -e '{"key":"val"}' +s local invoke -f event.json +s local start + +s invoke +s invoke -e '{"key":"val"}' +s invoke -f oss.json +s invoke --invocation-type Async +s invoke --qualifier LATEST + +s logs +s logs --tail +s logs -s 2026-01-01T10:00:00+08:00 -e 2026-01-01T10:05:00+08:00 +s logs --request-id 1-xxx +s logs --type fail +s logs --instance-id c-xxx +s logs --search "ERROR" --match ERROR + +s instance list +s instance exec --instance-id c-xxx +s instance exec --instance-id c-xxx --cmd "ls -l" + +s info +``` + +- `s logs` 的时间参数要带时区偏移,不能用 `Z`。 +- `s local` 需要 Docker。 +- 调试端口和 IDE 配置直接看 `s local invoke --help`。 + +## 纯 CLI 模式 + +- 没有 `s.yaml` 时,所有参数写全。 +- `--silent` 和 `-o json` / `-o raw` 更适合自动化。 +- 全局参数:`-a/--access`、`--debug`、`--silent`、`-o/--output-format`。 + +```bash +s cli fc3 deploy --region cn-hangzhou --function-name f1 --runtime nodejs20 --handler index.handler --code ./code +s cli fc3 invoke -e "test" --region cn-hangzhou --function-name f1 +s cli fc3 info --region cn-hangzhou --function-name f1 -o json --silent +s cli fc3 logs --region cn-hangzhou --function-name f1 --tail +s cli fc3 list --region cn-hangzhou +s cli fc3 sync --region cn-hangzhou --function-name f1 +s cli fc3 s2tos3 --source s.yaml --target s3.yaml +``` + +## 可观测性 + +- `logConfig` 决定是否能拉函数日志。 +- `--request-id` 精确定位一次调用。 +- `--tail` 用于持续跟踪。 +- `tracingConfig` 用于链路追踪。 +- 冷启动通常靠弹性实例缓解。 + +## 发布与运维 + +- 顺序:`version` → `alias` → `scaling` → `concurrency`。 +- `concurrency` 作用于整函数,不按别名拆分。 +- `scaling` 优先于 `provision`。 +- `LATEST` 适合测试,不适合长期生产配置。 +- `s deploy` 会下发 `scalingConfig`,但后续独立调整更适合 `s scaling`。 + +详细命令、Layer、Session、Provision 见 [发布与运维](references/release-ops.md)。 + +## 自定义域名 + +`fc3-domain`、`customDomain`、证书、路由、TLS、WAF 的完整说明见 [自定义域名](references/domain.md)。 + +## 触发器与异步 + +`triggers` 和 `asyncInvokeConfig` 的字段、常见类型、部署顺序见 [触发器与异步](references/triggers-and-async.md)。 + +## 架构选型 + +### FC3 vs FC2 + +- 新项目默认 `fc3`。 +- 只有 FC2 存量才保留 `fc`。 +- 迁移场景优先考虑 `s2tos3`。 + +### 运行时选择 + +```text +需要对外 HTTP,但不想自己起 HTTP 服务? + ├── 是 → 标准运行时 + HTTP 触发器(Python / Node / Java / Go 等) + └── 否 → 需要自定义二进制 / 端口 / 框架? + ├── 固定端口、自定义启动命令 → custom / custom.debian10 + ├── 更强系统 / 镜像控制 → custom-container + └── GPU 推理 → custom-container + gpuConfig +``` + +| 运行时 | `handler` | `instanceConcurrency` | 构建 | +|--------|-----------|----------------------|------| +| 标准(python、nodejs 等) | 需要 | 固定 1 | `s build` 自动 | +| custom / custom.debian10 | 可选 | 可调 1–200 | `s build` 自动 | +| custom-container | 可选 | 可调 1–200 | `s build --dockerfile` | + +### 何时加网络 / 存储配置 + +| 需求 | 配置项 | 注意 | +|------|--------|------| +| 访问 VPC 内 RDS/Redis 等 | `vpcConfig` | VPC 不额外按 FC 收 | +| 持久化文件 | `nasConfig` + `vpcConfig` | NAS 存储计费 | +| 只读挂载对象存储 | `ossMountConfig` | OSS 存储与流量 | +| 自定义 DNS | `customDNS` | 视解析服务 | +| 自定义域名 + HTTPS | `fc3-domain` | 域名与证书 | +| GPU | `gpuConfig` | GPU 规格计费 | +| 链路追踪 | `tracingConfig` | 追踪产品计费 | + +### 层与代码内联 + +- 适合用 Layer:依赖大、变更少、多函数共享、需叠加公共层。 +- 适合内联:依赖小、每次发版都变、单函数无共享需求。 + +## 常见实践模式 + +### 快速改代码上线 + +```text +改代码 → s build → s deploy --function code → s invoke +``` + +- 部署按代码包 CRC64 判断变更,未变则跳过上传。 + +### 大依赖用 Layer + +```bash +s build --publish-layer +# 将输出中的 layers、environmentVariables 写入 s.yaml +s deploy +``` + +### 多环境(vars) + +```yaml +vars: + env: dev + +resources: + my_func: + props: + functionName: my-func-${vars.env} +``` + +```bash +s deploy --var env=staging +``` + +- 多环境切换也可以用 `s env`,按文档站用户手册 → 内置指令 → Env。 + +### 自定义容器 + +```yaml +props: + runtime: custom-container + customContainerConfig: + image: registry.cn-hangzhou.aliyuncs.com/ns/repo:v1 + port: 9000 + command: ['/start.sh'] +``` + +```bash +s build --dockerfile ./Dockerfile +s deploy --skip-push +``` + +### VPC + NAS + +```yaml +props: + vpcConfig: + vpcId: vpc-xxx + securityGroupId: sg-xxx + vSwitchIds: [vsw-xxx] + nasConfig: + userId: 1000 + groupId: 1000 + mountPoints: + - serverAddr: xxx.nas.aliyuncs.com:/ + mountDir: /mnt/nas + enableTLS: true +``` + +### auto 自动创建资源 + +- `logConfig: auto`、`nasConfig: auto`、`vpcConfig: auto` 由工具自动创建或复用资源,适合 PoC。 +- 生产改为显式 ID。 + +## 凭据与权限 + +- 用 `s config` 管理 AccessKey,勿写入 `s.yaml` 或代码包。 +- 函数执行优先用 `role`(RAM 角色)。 +- 非敏感默认值放 `environmentVariables`;敏感值用 `--var`、CI 注入或组织密钥方案。 +- `disableInjectCredentials` 支持 `All` / `Env` / `Request`。 + +| 操作 | 常见策略 | +|------|----------| +| 部署 | `AliyunFCFullAccess` | +| 部署且 `logConfig: auto` | 上述 + `AliyunLogFullAccess` + `ram:PassRole` | +| info / plan / sync | `AliyunFCReadOnlyAccess` | +| invoke | `AliyunFCInvocationAccess` 或 `AliyunFCFullAccess` | +| logs | `AliyunFCReadOnlyAccess` + 日志读权限 | +| 版本 / 别名 / 并发 / 弹性 | 通常需 `AliyunFCFullAccess` | +| 发布层 | `AliyunFCFullAccess` | + +> 生产建议:用自定义策略替代 `AliyunFCFullAccess`,资源 ARN 收窄到 `acs:fc:{region}:{uid}:functions/{functionName}`;函数执行角色同样最小权限。 + +## 问题排查 + +常见报错、原因和处理见 [问题排查](references/troubleshooting.md)。 diff --git a/.agents/skills/s-fc3/agents/openai.yaml b/.agents/skills/s-fc3/agents/openai.yaml new file mode 100644 index 00000000..334300b6 --- /dev/null +++ b/.agents/skills/s-fc3/agents/openai.yaml @@ -0,0 +1,7 @@ +interface: + display_name: "s-fc3" + short_description: "阿里云 FC3 部署、调试、运维、域名、触发器与排障助手" + default_prompt: "Use $s-fc3 to help me inspect my s.yaml and safely deploy, debug, or troubleshoot an Alibaba Cloud FC3 function." + +policy: + allow_implicit_invocation: true diff --git a/.agents/skills/s-fc3/references/domain.md b/.agents/skills/s-fc3/references/domain.md new file mode 100644 index 00000000..b305a8fc --- /dev/null +++ b/.agents/skills/s-fc3/references/domain.md @@ -0,0 +1,133 @@ +# 自定义域名(fc3-domain) + +`fc3-domain` 用于 HTTP 自定义域名、路径路由、HTTPS、TLS、WAF。单函数快配可用 `customDomain`,多函数路由用 `fc3-domain`。 + +## 目录 + +- 什么时候读 +- props 速查 +- 路由字段 +- certConfig +- `domainName: auto` +- 常用命令 +- 部署顺序 +- 权限 +- 示例 +- 排障 + +## 什么时候读 + +- 你要绑自定义域名。 +- 你要做多函数路由。 +- 你要配 HTTPS / 证书 / TLS / WAF。 + +## props 速查 + +| 字段 | 必填 | 说明 | +|------|------|------| +| `region` | 是 | 地域,与函数一致 | +| `domainName` | 是 | 已备案或接入备案的域名 | +| `protocol` | 是 | `HTTP` / `HTTPS` / `HTTP,HTTPS` | +| `routeConfig` | 是 | 路由表,`routes` 为数组 | +| `certConfig` | 否 | HTTPS 证书配置 | +| `tlsConfig` | 否 | TLS 版本范围、加密套件等 | +| `wafConfig` | 否 | `enableWAF: true` 开启 WAF | + +## 路由字段 + +| 字段 | 必填 | 说明 | +|------|------|------| +| `path` | 是 | URL 路径,如 `/*`、`/api/*` | +| `functionName` | 是 | 目标函数名 | +| `qualifier` | 否 | 版本或别名 | +| `methods` | 否 | HTTP 方法列表 | +| `rewriteConfig` | 否 | `equalRules` / `wildcardRules` / `regexRules` | + +## certConfig + +- 方式一:只填 `certId`,推荐。 +- 方式二:填 `certName` + `certificate` + `privateKey`。 +- `certId` 与 PEM 三字段不要混用。 +- PEM 支持内联、本地文件路径、公网 URL、`oss://{region}/{bucket}/{object}`。 + +## `domainName: auto` + +- 会分配 `*.devsapp.net` 临时测试域名。 +- 通常约 1 天后回收。 +- 只适合学习和测试,不适合生产。 + +## 常用命令 + +```bash +s my_domain deploy +s my_domain plan +s my_domain info +s my_domain remove +``` + +```bash +s cli fc3-domain list --region cn-hangzhou -a default +s cli fc3-domain info --region cn-hangzhou --domain-name www.example.com -a default +``` + +## 部署顺序 + +- 先部署函数和 HTTP 触发器。 +- 再部署域名资源。 +- 最后把 `domainName` CNAME 到 FC 分配的接入域名。 + +## 权限 + +- 部署通常需要 `fc:*CustomDomain*` 相关权限。 +- `domainName: auto` 还需要函数 / 触发器权限和 `ram:PassRole`。 +- `plan` / `info` 通常只要只读权限。 + +## 示例 + +```yaml +edition: 3.0.0 +name: my-app +access: default + +resources: + my_func: + component: fc3 + props: + region: cn-hangzhou + functionName: my-http-func + runtime: custom.debian10 + memorySize: 128 + cpu: 0.5 + diskSize: 512 + code: ./code + customRuntimeConfig: + command: ['/code/start.sh'] + port: 9000 + triggers: + - triggerName: http + triggerType: http + qualifier: LATEST + triggerConfig: + authType: anonymous + methods: [GET, POST] + my_domain: + component: fc3-domain + props: + region: cn-hangzhou + domainName: my-domain.example.com + protocol: HTTP + routeConfig: + routes: + - path: /* + functionName: my-http-func + qualifier: LATEST + - path: /api/* + functionName: my-http-func + qualifier: v1 +``` + +## 排障 + +- HTTPS / 双协议时必须配 `certConfig` 或 `certId`。 +- 路由不生效时,先核对 `path`、`methods`、函数地域和账号。 +- 域名 404 时,先看 DNS 是否 CNAME 到接入域名,再看路由配置。 diff --git a/.agents/skills/s-fc3/references/fc-endpoints.md b/.agents/skills/s-fc3/references/fc-endpoints.md new file mode 100644 index 00000000..bc102563 --- /dev/null +++ b/.agents/skills/s-fc3/references/fc-endpoints.md @@ -0,0 +1,53 @@ +# FC 接入点 + +- 只在非默认 FC OpenAPI 时使用 `FC_CLIENT_CUSTOM_ENDPOINT`。 +- 格式:`{协议}://{主账号uid}.{cluster}.{域}`。 +- `{主账号uid}` 必须替换成当前账号的主账号 UID;子账号也要用其所属主账号 UID。 +- `--region` 必须和集群对应,否则容易出现路由错误、签名错误或找不到函数。 +- 测试集群通常用 HTTP;生产或正式环境使用 HTTPS。 +- `s.yaml` 里的 `props.endpoint` 只对当前资源生效;如果同时设置,它优先于环境变量。 +- `export` 只影响当前 shell;切回正式环境用 `unset FC_CLIENT_CUSTOM_ENDPOINT`。 +- 内网 / 测试域名通常只在公司内网或 VPN 可达。 + +## 常见集群 + +| 集群 | endpoint 模板 | 配套 region | +|------|--------------|-------------| +| 上海 spe | `http://{主账号uid}.cn-shanghai-cloudspe.fc.aliyuncs.com` | `cn-shanghai` | +| 上海 mulzone | `http://{主账号uid}.mulzones-cluster.test.fc.aliyun-inc.com` | `cn-shanghai` | +| 新加坡测试 | `http://{主账号uid}.ap-southeast-1-front.fc-test.aliyuncs.com` | `ap-southeast-1` | +| 北京 pre | `http://{主账号uid}.{cluster}.cn-beijing.fc-pre.aliyuncs.com` | `cn-beijing` | +| 内网(示例) | `https://{主账号uid}.cn-heyuan-acdr-1-internal.fc.aliyuncs.com` | 与集群一致 | + +> 北京 pre 的 `{cluster}` 是具体灰度集群名,按发布团队给出的值替换,不是固定字符串。 + +## 示例 + +```bash +# 上海 spe +export FC_CLIENT_CUSTOM_ENDPOINT="http://123456789.cn-shanghai-cloudspe.fc.aliyuncs.com" +s cli fc3 list --region cn-shanghai -a default + +# 上海 mulzone +export FC_CLIENT_CUSTOM_ENDPOINT="http://123456789.mulzones-cluster.test.fc.aliyun-inc.com" +s cli fc3 info --region cn-shanghai --function-name my-func -a default + +# 新加坡测试 +export FC_CLIENT_CUSTOM_ENDPOINT="http://123456789.ap-southeast-1-front.fc-test.aliyuncs.com" +s cli fc3 invoke --region ap-southeast-1 --function-name my-func -a default + +# 北京 pre +export FC_CLIENT_CUSTOM_ENDPOINT="http://123456789.{cluster}.cn-beijing.fc-pre.aliyuncs.com" +s cli fc3 list --region cn-beijing -a default +``` + +## 排障 + +- 连接超时或 `connect ECONNREFUSED`:通常是内网 endpoint 在公网不可达,或没有连 VPN。 +- `SignatureDoesNotMatch`:通常是 `--region` 与集群不匹配,或 endpoint 里的 UID 填成了子账号 ID。 +- 访问失败后先确认 `curl -v $FC_CLIENT_CUSTOM_ENDPOINT` 是否能连通,再看签名和区域。 + +## 主账号 UID + +- 阿里云控制台右上角头像 → 安全设置 / 账号管理。 +- 或用 `aliyun sts GetCallerIdentity` 查看 `AccountId`。 diff --git a/.agents/skills/s-fc3/references/release-ops.md b/.agents/skills/s-fc3/references/release-ops.md new file mode 100644 index 00000000..34a6461c --- /dev/null +++ b/.agents/skills/s-fc3/references/release-ops.md @@ -0,0 +1,99 @@ +# 发布与运维 + +## 版本 + +```bash +s version list +s version publish --description "v1.0" +s version remove --version-id 1 +``` + +## 别名 + +```bash +s alias list [--table] +s alias get --alias-name pre +s alias publish --alias-name prod --version-id 1 +s alias publish --alias-name prod --version-id latest +s alias publish --alias-name prod --version-id 2 --vw '{"1":0.2}' +s alias remove --alias-name prod +``` + +## 弹性实例 + +- 优先用 `scaling`,`provision` 仅存量可用。 +- `s deploy` 会下发 `scalingConfig`;后续独立调参用 `s scaling`。 + +```bash +s scaling list +s scaling get --qualifier LATEST +s scaling put --qualifier LATEST --min-instances 2 +s scaling remove --qualifier LATEST +``` + +```json +[{"name":"morning","startTime":"2024-01-01T00:00:00Z","endTime":"2024-12-31T00:00:00Z","target":20,"scheduleExpression":"cron(0 30 8 * * *)"}] +``` + +```json +[{"name":"cpu-tracking","startTime":"2024-01-01T00:00:00Z","endTime":"2024-12-31T00:00:00Z","metricType":"CPUUtilization","metricTarget":0.6,"minInstances":5,"maxInstances":50}] +``` + +## 预留 + +```bash +s provision list +s provision get --qualifier prod +s provision put --qualifier prod --default-target 10 +s provision put --qualifier prod --default-target 0 +s provision remove --qualifier prod +``` + +## 并发上限 + +```bash +s concurrency get +s concurrency put --reserved-concurrency 10 +s concurrency remove +``` + +- `reservedConcurrency` 作用于整函数,不会按别名自动拆分。 + +## 层 + +```bash +s layer list [--public] [--official] [--table] +s layer publish --layer-name my-layer --code ./layer-code --compatible-runtime python3.10,nodejs20 +s layer info --layer-name my-layer --version-id 1 +s layer versions --layer-name my-layer +s layer download --layer-name my-layer --version-id 1 +s layer acl --layer-name my-layer --public +s layer remove --layer-name my-layer [--version-id 1] +``` + +| 运行时 | 层内目录 | +|--------|----------| +| Python | `/opt/python` | +| Node.js | `/opt/nodejs/node_modules` | +| Java | `/opt/java/lib` | +| PHP | `/opt/php` | +| 其他非 Custom Runtime/Container 运行时 | `/opt/bin`、`/opt/lib` | + +## 会话 + +```bash +s cli fc3 session create --region cn-hangzhou --function-name my-func --qualifier LATEST +s cli fc3 session create --region cn-hangzhou --function-name my-func --qualifier LATEST --session-ttl-in-seconds 600 --session-idle-timeout-in-seconds 300 +s cli fc3 session list --region cn-hangzhou --function-name my-func +s cli fc3 session get --region cn-hangzhou --function-name my-func --session-id xxx --qualifier LATEST +s cli fc3 session update --region cn-hangzhou --function-name my-func --session-id xxx --qualifier LATEST --session-ttl-in-seconds 900 +s cli fc3 session remove --region cn-hangzhou --function-name my-func --session-id xxx --qualifier LATEST +``` + +## 发布顺序 + +- 先发布版本。 +- 再把别名指到版本。 +- 再配 `scaling`。 +- 最后再调 `concurrency`。 +- `LATEST` 适合测试,生产建议用别名 + 固定版本。 diff --git a/.agents/skills/s-fc3/references/triggers-and-async.md b/.agents/skills/s-fc3/references/triggers-and-async.md new file mode 100644 index 00000000..5525646c --- /dev/null +++ b/.agents/skills/s-fc3/references/triggers-and-async.md @@ -0,0 +1,61 @@ +# 触发器与异步 + +## 触发器 + +`triggers` 是数组,`qualifier` 通常指向版本或别名。HTTP、定时、OSS、CDN、EventBridge 等都在这里配置。 + +| 类型 | 场景 | 常见字段 | +|------|------|----------| +| `http` | HTTP/HTTPS 入口 | `triggerConfig.authType`, `methods`, `disableURLInternet` | +| `timer` | 定时任务 | `triggerConfig.cronExpression`, `enable`, `payload` | +| `oss` | OSS 事件 | `invocationRole`, `sourceArn`, `triggerConfig.events`, `filter` | +| `cdn_events` | CDN 事件通知 | `invocationRole`, `sourceArn`, `triggerConfig.eventName`, `filter` | +| `eventbridge` | EventBridge 事件 | 事件总线 / 事件源配置 | +| `log` | 日志触发 | 按日志投递触发 | +| `mns_topic` | MNS 主题 | 主题投递触发 | +| `tablestore` | TableStore 事件 | 表变更触发 | + +## 触发器示例 + +```yaml +triggers: + - triggerName: http + triggerType: http + qualifier: LATEST + triggerConfig: + authType: anonymous + methods: [GET, POST] + disableURLInternet: false + + - triggerName: timer1 + triggerType: timer + qualifier: LATEST + triggerConfig: + cronExpression: '0 0 8 * * *' + enable: true + payload: 'timer-event' +``` + +## 异步调用 + +`asyncInvokeConfig` 用于重试、存活时间和投递目标。 + +```yaml +props: + asyncInvokeConfig: + maxAsyncEventAgeInSeconds: 86400 + maxAsyncRetryAttempts: 3 + statefulInvocation: false + # destinationConfig: 见官方文档 +``` + +## 部署建议 + +- 触发器通常和函数一起用 `s deploy` 部署。 +- 只改触发器时可用 `s deploy --trigger ...`。 +- 只改异步调用配置时可用 `s deploy --async-invoke-config`。 +- 删除时顺序通常是异步配置 → 触发器 → 版本 / 别名 / 函数。 + +## 事件模板 + +各触发器事件示例见官方 `event-template` 仓库。处理触发器 payload 时,先拿模板做本地回放,再接线上事件。 diff --git a/.agents/skills/s-fc3/references/troubleshooting.md b/.agents/skills/s-fc3/references/troubleshooting.md new file mode 100644 index 00000000..6be52877 --- /dev/null +++ b/.agents/skills/s-fc3/references/troubleshooting.md @@ -0,0 +1,49 @@ +# 问题排查 + +## 部署阶段 + +| 现象 / 报错 | 可能原因 | 处理方向 | +|-------------|----------|----------| +| `AccessDenied` / 403 | RAM 权限不足 | 检查 `s config`;部署常用 `AliyunFCFullAccess` | +| `InvalidArgument: code` | `code` 路径空或不存在 | 确认 `code` 指向有效源码目录 | +| `ServiceException: VPC` | VPC / 交换机 / 安全组无效 | 核对 VPC ID;PoC 可先试 `vpcConfig: auto` | +| 镜像拉取超时 | ACR 地址或权限错误 | 检查仓库地址、网络和权限 | +| `DiskSize must be ...` | `cpu` 与 `diskSize` 未成对 | 两者都设或都不设 | +| `instanceConcurrency is not supported` | 非 custom 运行时 | 仅 custom 系列可调 | +| `OutOfMemory` / exit 137 | 内存过小 | 提高 `memorySize` | +| 自定义域名 404 | DNS / CNAME 未生效或路由不匹配 | 先部署函数再部署域名;核对 `routeConfig` | +| HTTPS 证书报错 | PEM 格式或 `certId` / PEM 混用 | 二者择一;`certId` 须同账号 | +| `domainName: auto` 不可用 | 测试域名已回收 | 生产改用自有备案域名 | +| `Function undefined is not defined`(`s cli fc3 deploy -p`) | 纯 CLI 模式下 `-p` 不能可靠地部分更新配置 | 用临时 `s.yaml` + `s deploy --function config -y`,写完整 `props` 再部署 | +| 测试集群连接超时 / `connect ECONNREFUSED` | 内网 / 测试 endpoint 在公网不可达;或未连 VPN | 确认在公司内网 / VPN;`curl -v $FC_CLIENT_CUSTOM_ENDPOINT` | +| 测试集群 `SignatureDoesNotMatch` / 找不到函数 | endpoint 与 `--region` 不匹配,或 UID 填错 | 按集群匹配 `region`;UID 必须是主账号 UID | +| 切回正式环境后仍走测试集群 | `FC_CLIENT_CUSTOM_ENDPOINT` 未清 | `unset FC_CLIENT_CUSTOM_ENDPOINT`,或新开 shell | + +## 运行阶段 + +| 现象 / 报错 | 可能原因 | 处理方向 | +|-------------|----------|----------| +| 超时 | `timeout` 过短或逻辑阻塞 | 增大 `timeout`;查死循环;`s logs --type fail` | +| `Process exited unexpectedly` | 缺依赖或运行时不对 | `s build`;核对 `runtime` | +| `Unable to import module` | 依赖路径未入环境 | 把 build 提示的 env vars 写回 `s.yaml`;核对层 ARN | +| `413 Request Entity Too Large` | HTTP 请求体过大 | 拆包或用 OSS 传引用 | +| `429 Too Many Requests` | 并发打满 | 调整 `reservedConcurrency` 或分流 | + +## 构建与本地 + +| 现象 / 报错 | 可能原因 | 处理方向 | +|-------------|----------|----------| +| `s local` 立刻退出 | Docker 未启动 | 先确认 Docker 可用 | +| `s build` 镜像版本不对 | 缓存旧镜像 | 清理本地构建镜像缓存;或 `export FC_DOCKER_VERSION=3.1.0` | +| 本地未执行构建 | 只有 `pre-deploy` | 补 `pre-local` | +| `local start` 端口占用 | 9001 被占 | 杀旧进程或换端口 | + +## 权限与安全 + +| 现象 / 报错 | 可能原因 | 处理方向 | +|-------------|----------|----------| +| `ram:PassRole` 拒绝 | `logConfig: auto` 等需要传角色 | 配 `ram:PassRole`,并收窄到 `fc.aliyuncs.com` | +| 函数访问不了 VPC 内资源 | 未挂 VPC 或安全组过严 | 检查 `vpcConfig` 与安全组 | +| 不希望注入临时凭据 | 默认注入 STS | 用 `disableInjectCredentials: All` / `Env` / `Request` | +| 层无法使用 | 未授权或 ARN 错误 | 先确认 ACL,或检查层 ARN | +| 仓库里出现密钥 | 误提交 | 立即轮换;本地环境文件加入忽略 | diff --git a/.gitignore b/.gitignore index 6ad41d2b..982ceaf5 100644 --- a/.gitignore +++ b/.gitignore @@ -66,4 +66,5 @@ CLAUDE.md agent-prompt.md AGENTS.md .qoder -docs/ \ No newline at end of file +docs/ +.codegraph/