用多個儲存庫 webhook 觸發 CodeBuild
/ 閱讀時間 5 分鐘
目次
上篇我說這個部落格要用 CI/CD 建置有點複雜,所以實際上的設定跟那篇描述的有一些不同,其中一個不同點是我的原始碼來自兩個儲存庫。在這種情況下要如何修改前篇的配置呢?
只用 CodeBuild
CodeBuild 在設定的時候只要在來源這邊點選「新增來源」的按鈕就可以再增加一個來源的儲存庫。
不過問題出在只有對主要來源儲存庫的 push 才會觸發建置,對於其他來源的 push CodeBuild 是不會觸發的。如果想要在任一儲存庫 push 時都觸發建置,這個方法很明顯就不太合適。
CodePipeline
另一個方式是用 CodePipeline 取得來源的儲存庫,然後送給 CodeBuild 建置。我們可以建立一個 CodePipeline 管道,在來源階段為每個儲存庫新增動作,然後在建置階段新增原先的 CodeBuild 為動作。並且在原來主要來源的動作設定,輸出成品的名稱設為預設的 SourceArtifact,其他來源的輸出成品名稱則設為原來的來源識別符。
這個方法可以在任一儲存庫 push 時都觸發建置,但在費用上有疑慮。CodePipeline 的定價是每分鐘 0.002 美元,前 100 分鐘免費。我的 CodePipeline 執行的持續時間總和是 28 分鐘左右,但帳單上我使用的時間卻是 60 分鐘,不知道 AWS 是怎麽算的。照這種增長速度 CodeBuild 的免費時數用到一半 CodePipeline 的免費時數就會用完了。雖然就算超出免費時數被收費還是很便宜,不過用下面免費額度更高的方法更好。
Lambda function URL
在第一個方法,我們是讓 CodeBuild 設定好儲存庫的 webhook,不過只能設定主要來源儲存庫的。如果是自己另外創 webhook,然後做一個接收 webhook 訊息的 lambda function,觸發 CodeBuild 建置,就可以繞過這個限制了。
Lambda function URL 看起來是 AWS 推薦用來接收 GitHub webhook 的服務,他們還為這個寫了一個教學。
照著教學在 CloudFormation 建立堆疊卻會出錯。在建立 Lambda function 時,會產生這個錯誤:Specified ReservedConcurrentExecutions for function decreases account's UnreservedConcurrentExecution below its minimum value of [10].
看範本才發現原來是它好心幫我們預留了同時執行的數量:ReservedConcurrentExecutions: 10
,可是我的帳號同時執行的數量限制是 10 啊。

為了能夠成功建立堆疊,只能 fork 範本,把那一行刪除,刪除後果然堆疊就建立成功了。
預設範本的 Lambda function 是把 GitHub webhook 轉換成 EventBridge 的事件,所以可以建立 EventBridge 規則接收上面的事件,觸發 CodeBuild 執行建置。
不想繞 EventBridge 一圈的話也可以直接改 Lambda function,讓它直接執行 CodeBuild 建置就好。
這個方法優點是免費用量幾乎用不完。AWS Lambda 每月前一百萬次請求與 400,000 GB-秒執行免費,webhook 根本就用不到那麼多。除非 webhook 網址洩漏,被他人 denial of wallet 攻擊。因為有這個風險,所以 CloudFormation 連帶建立的 CloudWatch 警示最好不要刪除比較好。