JSM Bot v2 正式切换清单
从 TEST FORGE 切换到正式 “Submit a request”,并将正式 Slack Bot、飞书 Bot 流量迁移到 production v2。
Request Type 已切到正式 “Submit a request”,字段快照暂未刷新。
当前按明确决策只替换 ST、TCID、TCLID 的 Request Type ID,继续沿用已有字段快照。
JSM 管理员完成正式表单字段迁移后,仍需重新核对并更新字段元数据。
1. 切换范围与已知资源
| 用途 | 现正式版 | 目标 v2 | 切换动作 |
|---|---|---|---|
| Slack Bot Lambda | slack-bot |
slack-bot-v2 |
换正式凭证,再切 Slack App 三类回调 |
| 飞书 Bot Lambda | lark-support-bot |
lark-support-bot-v2 |
换正式凭证,再切事件和卡片回调 |
| 提单 Worker | CreatJsmIssueHandler |
CreateJsmIssueHandler-v2 |
继续消费独立 v2 队列;更新正式 Bot 发消息凭证 |
| Org 同步 | jsm-orgs-lambda(Assets) |
jsm-orgs-lambda-v2(新 API) |
创建 v2 调度;验证后停旧调度 |
| Slack API Gateway | 51c5tv1vsk |
knj0kkq1sh |
在 Slack App 控制台切换 URL |
| 飞书 API Gateway | rw75r1e3bi |
abfl58h599 |
在飞书开放平台切换 URL |
已经具备的连续性条件
v2 与正式版共用
DATABASE_URL,并复用
messages、ticket_thread、
user_openid_email_mapping。因此已有工单线程和用户映射可以延续,
不需要迁移这三张表。
2. Request Type 与字段快照
“Submit a request” 的 Request Type ID 已能定位,但由于正式表单字段尚未迁移, 下表中的目标 ID只能作为切换目标候选;字段完成修改后必须重新读取元数据并再次确认。
| Project | Project / Service Desk | 之前 TEST FORGE | 当前 Submit a request | 正式 Portal |
|---|---|---|---|---|
| ST | Project 10008Service Desk 9Issue Type 10003 |
Request Type 4432 |
2164 已切换 |
https://tidb.support.pingcap.com/servicedesk/customer/portal/9/ |
| TCID | Project 10005Service Desk 6Issue Type 10003 |
Request Type 4431 |
30 已切换 |
https://tidb.support.pingcap.com/servicedesk/customer/portal/6/ |
| TCLID | Project 15248Service Desk 4219Issue Type 10003 |
Request Type 4433 |
4398 已切换 |
https://tidb.support.pingcap.com/servicedesk/customer/portal/4219/ |
2.1 表单迁移后必须核对的目标字段
| 产品 | 目标字段 | 预期 ID | 必须核对 |
|---|---|---|---|
| Cloud(ST / TCID) | TiDB Cloud Org | customfield_17125 |
必填;可接受完整 Org snapshot payload |
| Cloud(ST / TCID) | TiDB Cloud Cluster | customfield_17124 |
非必填;不存在或已删除时仍允许提单 |
| Lake(TCLID) | TiDB Cloud Lake | customfield_17123 |
必填;可接受完整 Lake snapshot payload |
| 三项目 | Environment | customfield_10050 |
必填状态及 production / pre-production / poc / test 的提交格式 |
| 三项目 | Severity | customfield_10090 |
必填状态以及 S1–S4 object ID |
| ST / TCID | Components | components |
正式表单完整选项;TEST FORGE 临时新增项是否仍存在 |
| ST / TCID | Affects versions | versions |
必填状态和完整版本列表 |
2.2 Repo 修改点
-
同步修改
jsm-production-v2/slack-bot/request-fields.json和jsm-production-v2/lark-bot/request-fields.json: 三个requestTypeId、必填状态和选项快照。 - 保持两份 JSON 完全一致;现有测试会检查一致性。
-
更新
jsm-production-v2/config.test.js中2164、30、4398的断言。 - 如果字段 ID 与预期一致,不需要修改 Bot 表单代码和 Create Handler。
-
如果 Org / Cluster / Lake 字段 ID 发生变化,修改
create-issue-handler/snapshot-payload.js,并同时修改 Slack/Larkapp.js的字段构造逻辑和相关测试。 -
更新 README 和
infrastructure/deployment-state.md, 删除“仅 pilot 启用”和“TEST FORGE”过期说明。
3. Channel / Group 配置
当前状态
线上正式版已有的 Slack Channel 和飞书 Group 已在 v2 中设为
enabled: true;退休 Org 保持删除。Org Sync 的 18 个目标与当前
Channel/Group 引用的 18 个有效 Org 完全一致。
| 配置 | 当前 v2 值 | 正式切换前动作 |
|---|---|---|
Slack 测试入口 C08S1QZM39V |
Cloud Premium:1372813089187041280Lake Enterprise: 1372813089194331289
|
按当前决定暂时保留;正式稳定后再决定删除或继续作为 canary |
飞书测试入口 oc_ca98042ab78d27a044d56966df23c3e9 |
Cloud Enterprise:1372813089194331289Lake Enterprise: 1372813089194331289
|
按当前决定暂时保留;正式稳定后再决定删除或继续作为 canary |
被测试覆盖的正式群 oc_741a848f5e0538f02e4273bbdb1741ef |
当前 v2:Cloud Premium,Org 1372813089187041280 |
正式切流前必须恢复为 Cloud Premium,
Org self-managed、1372813089209292464
|
正式 Lake 群 oc_1192a9156d9b2b06627e74cdb039b289 |
enabled;Lake Enterprise;Org 1372813089209321686 |
保留;已确认 snapshot 中存在 active Lake ClinkBI |
Support Plan 的实时影响
评论同步每次都读取 Channel/Group 当前配置,并不保存提单时的 Support Plan。
当前代码只有 Premium 开启双向评论同步;Enterprise 创建的工单以及此前 Premium
创建、后来配置改为 Enterprise 的工单都会停止双向同步。
4. 正式应用凭证与 Lambda 环境变量
AWS 只读比对结果显示:v2 当前使用的 Slack/Lark 应用凭证与线上正式应用不同。 正式切换不能只换回调 URL,必须先换 v2 Lambda 中的应用凭证。不得把值写入 repo。
| Lambda | 变量 | 目标动作 |
|---|---|---|
slack-bot-v2 |
SLACK_BOT_TOKENSLACK_SIGNING_SECRET |
复制线上 slack-bot 正式应用对应值 |
lark-support-bot-v2 |
LARK_BOT_APP_IDLARK_BOT_APP_SECRETLARK_BOT_UNION_ID
|
复制线上 lark-support-bot 正式应用对应值 |
CreateJsmIssueHandler-v2 |
SLACK_BOT_TOKENSLACK_SIGNING_SECRETLARK_BOT_APP_IDLARK_BOT_APP_SECRET
|
复制正式 Bot 应用值,以便成功/失败卡片和回复由正式 Bot 发出 |
CreateJsmIssueHandler-v2 |
JIRA_EMAILJIRA_API_TOKEN |
保留当前 v2 服务账号方案,不要盲目复制旧 Lambda;验证该账号可访问
ST、TCID、TCLID,支持 raiseOnBehalfOf、附件和评论
|
4.1 必须保留的 v2 独立变量
SQS_QUEUE_URL:继续指向JsmBotTicketQueue-v2,不能复制旧队列 URL。EXPECTED_SQS_QUEUE_NAME=JsmBotTicketQueue-v2。EXPECTED_JSM_HOST:继续使用当前生产 JSM host 保护值。BOT_EVENT_SOURCE、LARK_EVENT_SOURCE:保持 v2 当前约定。DATABASE_URL、JSM_SITE:当前与正式版一致,无需修改。-
飞书
LAMBDA_API_URL必须保持为 v2 地址:https://abfl58h599.execute-api.us-west-2.amazonaws.com/default/lark-support-bot-v2。
5. Slack / 飞书回调地址
5.1 Slack 正式应用
| 配置项 | 当前正式地址 | 目标 v2 地址 |
|---|---|---|
| Event Subscriptions → Request URL | https://51c5tv1vsk.execute-api.us-west-2.amazonaws.com/default/slack-bot |
https://knj0kkq1sh.execute-api.us-west-2.amazonaws.com/default/slack-bot-v2 |
| Interactivity & Shortcuts → Request URL | ||
| Options Load URL(external_select) |
- 先更新 v2 的正式 Signing Secret,再验证 Slack URL challenge。
- 三个地址全部切换;漏掉 Options Load URL 会导致 Cluster/Lake 搜索无结果。
- 确认正式 App 的事件 scope、Bot scope 和 Channel 安装状态不变。
- 确认按钮、Modal、external_select 都在 3 秒内完成 ack。
5.2 飞书正式应用
| 配置项 | 当前正式地址 | 目标 v2 地址 |
|---|---|---|
| 事件订阅 Request URL | https://rw75r1e3bi.execute-api.us-west-2.amazonaws.com/default/lark-support-bot |
https://abfl58h599.execute-api.us-west-2.amazonaws.com/default/lark-support-bot-v2 |
| 卡片回调 / Card Action Request URL |
- 先更新 v2 的正式 App ID、Secret、Union ID,再进行 URL 校验。
- 确认事件订阅和卡片回调均已发布到正式应用版本,而不是只保存草稿。
- 验证群内 @Bot、类型选择、表单提交、成功卡片自动消失。
- 确认 API Gateway 3 秒内返回,耗时工作继续通过异步调用/SQS 完成。
6. JSM Automation Webhook
JSM → IM 的评论、状态和附件同步由 Jira Automation 的 Send web request 调用 Bot API Gateway。正式切换时必须搜索 ST、TCID、 TCLID 范围内所有指向旧地址的规则,不应只修改一个评论规则。
| 目标 | 旧 URL | 新 URL |
|---|---|---|
| Slack Automation | https://51c5tv1vsk.execute-api.us-west-2.amazonaws.com/default/slack-bot |
https://knj0kkq1sh.execute-api.us-west-2.amazonaws.com/default/slack-bot-v2 |
| 飞书 Automation | https://rw75r1e3bi.execute-api.us-west-2.amazonaws.com/default/lark-support-bot |
https://abfl58h599.execute-api.us-west-2.amazonaws.com/default/lark-support-bot-v2 |
- 导出/备份每条 Automation 完整规则 JSON。
- 检查 comment created、status changed、attachment/comment webhook 等所有规则。
- 只替换 URL,保留请求体、header、触发条件和隐藏值。
- 修改前通过 Automation validation;修改后重新读取确认。
- 不要让同一事件同时发给旧 URL 和新 URL,否则会重复同步。
7. SQS 与 Create Handler
| 项目 | 正式版 | v2 | 切换处理 |
|---|---|---|---|
| 队列 | SlackJsmQueue |
JsmBotTicketQueue-v2 |
保持隔离,不迁移队列 URL |
| DLQ | 旧队列配置 | JsmBotTicketQueue-v2-dlq |
切换前后检查消息数为 0 |
| Event Source Mapping | 45601cbb-0874-40d9-9959-c0e7505d5189,batch 10 |
6ad3bb0e-3a7d-4a5c-a796-371bbc038c04,batch 1 |
v2 已 Enabled;旧队列排空后再禁用旧 mapping |
- 切换前确认 v2 Queue、DLQ 都没有历史失败消息。
- 确认 Slack/Lark v2 均发送到 v2 Queue。
- 创建 ST、TCID、TCLID 各一单,确认 batch item failure 不会重复提单。
- 保留旧 Mapping 到旧队列排空;排空后禁用,不要立即删除。
8. Org / Cluster / Lake 同步
v2 Org Sync 定时任务已于 2026-07-24 创建并启用。
Scheduler
jsm-orgs-v2-daily-sync 每 24 小时调用
jsm-orgs-lambda-v2,使用独立最小权限执行角色,最多重试 3 次。
正式切换前仍需确认至少一次自动执行成功。
| 配置项 | 目标值 |
|---|---|
| Scheduler 名称 | jsm-orgs-v2-daily-sync |
| Target | jsm-orgs-lambda-v2 |
| Schedule | rate(24 hours) |
| Timezone | Asia/Shanghai |
| Retry | 最多 3 次 |
| 同步目标 | 当前 18 个有效 Org;拉取 Org、Clusters、Lakes |
- 正式切换前手工运行一次 v2 Sync,确认 18 个 Org 均完成。
- 核对 Org、Cluster、Lake snapshot active/deleted 数量和最近同步时间。
- 等待并确认至少一次 v2 Scheduler 自动执行成功。
- 确认 Bot 表单能读取目标 Org 的 Cluster/Lake。
- 验证后再禁用旧
jsm-orgs-daily-sync;先禁用,不删除。
9. AWS 运行配置
| Lambda | Runtime / Handler | Memory / Timeout | Layer |
|---|---|---|---|
slack-bot-v2 |
nodejs24.xslack-bot/app.handler |
128 MB / 303 s | jsm-production-v2-dependencies:3 |
lark-support-bot-v2 |
nodejs24.xlark-bot/app.handler |
256 MB / 303 s | |
CreateJsmIssueHandler-v2 |
nodejs24.xcreate-issue-handler/index.handler |
128 MB / 63 s | |
jsm-orgs-lambda-v2 |
nodejs24.xorg-sync/index.handler |
512 MB / 303 s |
- Slack、飞书、Create Handler 保持无 Reserved Concurrency,与正式版一致。
- IAM Role 当前已按正式版权限模型建立;切换前重新检查 Logs、SQS、飞书自调用权限。
- 不要把 v2 Handler 改回根目录旧路径。
- 切换发布时重新 build,必要时发布新的不可变 Layer version,并让四个 Lambda 指向同一已验证版本。
- 确认 API Gateway access log、Lambda log 和 SQS/DLQ 告警可用。
10. 推荐切换顺序
阶段 A:JSM 表单准备(不切流)
- JSM 管理员完成 ST、TCID、TCLID 正式 Submit a request 字段迁移。
- 重新读取三份 Request Type metadata,确认 ID、字段、必填状态、选项。
- 更新两份
request-fields.json和必要代码。 - 恢复
oc_741...的正式 Org 映射。 - 跑全套测试、build、提交、push,部署四个 v2 包但不改正式回调。
阶段 B:凭证、同步和 canary
- 给 v2 三个交互 Lambda 换正式 Slack/Lark 应用凭证。
- 验证 Jira 服务账号对三个 Portal 的创建、代提、附件和评论权限。
- 手工执行 Org Sync,并确认已启用的 v2 Scheduler 至少自动成功一次。
- 在保留的测试 Channel/Group 中创建 ST、TCID、TCLID canary 工单。
阶段 C:逐平台切流
- 先切 Slack 三个回调 URL;观察 15–30 分钟。
- 更新 Slack 相关 JSM Automation URL;验证双向评论。
- 再切飞书事件与卡片回调;观察 15–30 分钟。
- 更新飞书相关 JSM Automation URL;验证双向评论。
- 整个过程中旧 Lambda、API Gateway、Queue 保留可回滚。
阶段 D:收尾
- 确认旧 Queue 排空,禁用旧 Create Handler Event Source Mapping。
- 确认 v2 自动同步成功后禁用旧 Org Sync schedule。
- 至少观察一个完整业务周期,再决定删除旧资源。
- 更新 repo 文档和最终部署状态。
11. 验收清单
11.1 提单
- Slack 创建 ST Enterprise、TCID Premium、TCLID Lake 工单。
- 飞书创建 ST Enterprise、TCID Premium、TCLID Lake 工单。
- Reporter 来自 IM 用户映射,未使用 Slack 表单中的 Reporter email。
- Org payload、Cluster payload、Lake payload 与 snapshot 一致。
- Cluster 为空、已删除或不存在时 Cloud 工单仍能创建。
- 附件、特殊字符、链接、HTML 文件均能正确创建和展示。
- 同一表单提交只产生一张工单,没有 SQS 重复消费。
11.2 评论同步
- Premium:Slack/飞书 → JSM 和 JSM → Slack/飞书均同步。
- Enterprise:按当前设计不进行双向评论同步。
- 旧工单的
ticket_thread可以被 v2 继续读取。 - 链接、inlineCard、代码中的
</>、图片和多个文件正确。 - Automation 只调用 v2,不产生新旧 Bot 双份消息。
11.3 运行状态
- API Gateway 无新增 5xx,Slack/Lark 回调在 3 秒内响应。
- 四个 v2 Lambda 均为 Active / Successful,无持续错误或超时。
- v2 Queue 可见消息归零,DLQ 为 0。
- Org Sync 18 个 Org 全部完成,个别失败不会阻塞其他 Org。
12. 回滚方案
回滚原则:切回入口,不删除数据。
旧 Lambda、API Gateway、SQS Mapping 和 Automation 规则备份必须保留到 v2
稳定观察期结束。
-
Slack App 三个 URL 恢复为
https://51c5tv1vsk.execute-api.us-west-2.amazonaws.com/default/slack-bot。 -
飞书事件和卡片 URL 恢复为
https://rw75r1e3bi.execute-api.us-west-2.amazonaws.com/default/lark-support-bot。 - 将 JSM Automation Send web request 恢复到旧 URL。
- 如已禁用,重新启用旧 Queue Event Source Mapping 和旧 Org Sync schedule。
- 暂停 v2 Bot 回调流量;保留 v2 snapshot 和线程数据用于排查。
- 检查两边 Queue,避免回滚期间重复消费或遗漏工单。