CodeBuild Build State Change,再以 API Destination 對你的 HTTPS 端點送 POST(可視為「類 Webhook」)。本文給最小可複現步驟:本機安裝與 openclaw onboard --install-daemon、閘道埠與健康檢查、靜態 Bearer、規則篩選、buildspec 依賴預檢、摘要出站與2/4/8 秒有界重試。延伸可讀站內 CircleCI Webhook × lockfile 摘要、閘道健康與 LaunchAgent、OpenClaw 安裝排錯。對齊上游文件可參考 docs.openclaw.ai;Node 主機連閘道之 --port 預設常見為 18789(請以本機設定為準)。
名詞釐清:主控台「來源 Webhook」通常是 Git → 觸發 AWS 內建置,不會直接把 JSON 推到你的 Mac。要到自管機器,請用下表右欄模式。
| 機制 | 方向 | 符合本文? |
|---|---|---|
| CodeBuild 來源 Webhook | Git 供應商 → AWS 啟動建置 | 否 |
| EventBridge + API Destination | AWS → 你可控的 HTTPS | 是(最小出站) |
| Lambda → 自訂 URL | AWS → 你的程式 → Mac | 是(彈性高、步驟多) |
- 逾時天花板:API Destination 單次呼叫預算極短,請先回 2xx 再排背景跑
npm ci等重活。 - 靜默 401:
Authorization大小寫、Bearer前綴、Connection 模板與 handler 讀取不一致。 - 區域錯位:規則建在
us-east-1、建置發在ap-northeast-1會永遠收不到。
安裝、Node 版本與 openclaw onboard --install-daemon
Node:目前 OpenClaw 主線建議 Node.js 22 LTS 或更新;若暫留 20/21,請確認 WebSocket 相依(上游文件建議以 22+ 為準)。以 npm i -g openclaw@latest 安裝後跑 openclaw doctor。
常駐:openclaw onboard --install-daemon 會在完成精靈步驟後,把閘道寫成 macOS LaunchAgent(與上游精靈一致)。plist 內請固定 NODE_BINARY、PATH,必要時設 NODE_EXTRA_CA_CERTS,讓 launchd 與 SSH 互動 shell 行為一致。可預先匯出 OPENCLAW_GATEWAY_TOKEN 再 onboard,避免本機控制面令牌與預期不符。
openclaw node run --host 127.0.0.1 --port 18789 為上游 CLI 文件常見範例埠;實際值以 ~/.openclaw/openclaw.json 為準。日常以 openclaw health、openclaw status --deep 驗證;監控可對反代上的 /health 做週期 GET,並帶與閘道一致的 Bearer。
curl -sS -o /dev/null -w '%{http_code}\n' \
-H 'Authorization: Bearer YOUR_GATEWAY_TOKEN' \
--connect-timeout 3 --max-time 10 \
http://127.0.0.1:PORT/health
AWS:規則、Connection、API Destination
於 EventBridge 建立 Connection(API Key 型),把金鑰映射到 Authorization: Bearer …。Mac 端以 chmod 600 檔案或鑰匙圈保存同一把祕鑰。再建 API Destination 指向 https://你的網域/openclaw/codebuild,方法 POST。
規則掛在預設事件匯流排:source 為 aws.codebuild,detail-type 為 CodeBuild Build State Change,並以 detail.build-status 篩 SUCCEEDED、FAILED、FAULT、STOPPED,避免每個 IN_PROGRESS 都打爆 Mac。可用 detail.project-name 或 ARN 前綴縮小範圍。目標選 API Destination;必要時用 Input Transformer 只留 build-id、狀態、專案名、主控台深連結欄位。
- 最小權限:操作者帳號僅需該匯流排上的
events:PutRule、events:PutTargets、events:DescribeRule、events:ListTargetsByRule等;祕鑰留在 Connection,勿寫進規則 JSON。 - 建議單行日誌欄位:EventBridge
id、time、region、account、detail.build-id、detail.build-status、detail.project-name、自訂correlation。 - 重試:AWS 側失敗會長時間重試;Mac 端仍應以
build-id去重。出站 Slack/第二 HTTP 建議另做 2/4/8 秒有界退避。
{
"source": ["aws.codebuild"],
"detail-type": ["CodeBuild Build State Change"],
"detail": {
"build-status": ["SUCCEEDED", "FAILED", "FAULT", "STOPPED"],
"project-name": ["your-ci-project"]
}
}
閘道路由、Bearer 與 TLS
自動化 HTTP 建議只綁 127.0.0.1,邊界用 nginx/Caddy 終止 TLS。以公開網路 curl -v 驗證憑證鏈與 SNI。Handler 應保留原始 body 以便日後加簽章而不必改反代。驗簽通過後立即回 2xx 並把預檢丟佇列;骨架可類比站內 CircleCI 文,只是把 HMAC 換成靜態 Bearer。
// 概念示例:先驗 Bearer,再 ACK,勿 await 重活
const secret = fs.readFileSync(process.env.HOOK_SECRET_FILE, 'utf8').trim();
const hdr = req.headers.authorization || '';
if (hdr !== `Bearer ${secret}`) return res.status(401).end();
res.status(200).json({ ok: true, buildId: body.detail?.['build-id'] });
// enqueue: git shallow clone + npm ci --dry-run / bundle check …
Webhook(API Destination)驗證檢查清單
curl -H "Authorization: Bearer …" 打本機 handler,確認 JSON 解析與路由。start-build 製造失敗與成功各一次,對照規則 Invocations 與 Mac 日誌是否出現同一 build-id。buildspec 依賴預檢與摘要回傳
在 install 或 pre_build 放入快失敗步驟:npm ci --dry-run、pnpm install --frozen-lockfile、composer validate、bundle check 等,讓主錯誤留在 CodeBuild Logs。Mac 端收到終態事件後,若要對同一提交做二次預檢,請淺克隆到以 build-id 為名的暫存目錄,再截取日誌末段組 JSON,以 2/4/8 秒退避 POST 到 Slack 或內部 API。
收不到事件與其他 FAQ
規則命中數永遠是 0?
檢查帳號/區域是否與專案一致;暫時放寬 project-name Predicate;確認事件是否在預設匯流排上。
CloudWatch 顯示 InvocationFailures?
401/403 多為 Bearer 或反代剝除標頭;5xx/timeout 常為同步路徑太重或憑證鏈不完整。
Mac 有日誌但重複執行預檢?
EventBridge 在非 2xx 會重送;驗簽成功後應快速 ACK,並以 build-id + 事件 id 去重。
結語
CodeBuild × EventBridge × OpenClaw
常駐閘道與出站摘要,穩定承接 AWS 事件
需要擴容算力或加開節點時,請參考購買與說明中心(免登入)。