Amazon EventBridge 的核心能力是依內容路由:各個 AWS 服務內部發生狀態變化時,會自動把相關資訊送進 EventBridge,使用者寫規則比對送進來的內容,決定分流到哪個目的地,不用自己寫輪詢程式去偵測變化,也不用手動把服務一個一個串接起來。來源不限於 AWS 服務本身,自訂應用程式與第三方 SaaS 的通知也能一併送進來,統一交由同一套規則分流。
EventBridge 由三個元件組成,事件依序經過它們:

| 元件 | 作用 |
|---|---|
| Event Bus | 接收事件的地方。每個帳號都有一個 default bus,接收 AWS 服務產生的事件;custom bus 接收自己應用程式送出的事件;partner bus 接收第三方 SaaS(例如 Shopify、Zendesk)的事件 |
| Rule | 一條比對規則,用 event pattern 比對事件的內容;符合的事件才會送到這條規則的 target。一個 bus 上可以有多條 rule,各自獨立比對 |
| Target | 符合規則後的目的地,一條 rule 最多 5 個 target,例如 Lambda、SQS、SNS、Step Functions(把多個步驟串成工作流程的服務)、另一個帳號的 event bus |
事件本身是一個 JSON 物件,基本結構如下:
{
"source": "aws.ec2",
"detail-type": "EC2 Instance State-change Notification",
"detail": { "instance-id": "i-0123abcd", "state": "stopped" }
}
Event pattern 也是 JSON,只列出需要比對的欄位,沒列到的欄位不影響結果。下面這條 pattern 會比對所有被停止或終止的 EC2:
{
"source": ["aws.ec2"],
"detail-type": ["EC2 Instance State-change Notification"],
"detail": { "state": ["stopped", "terminated"] }
}
每個欄位的值寫成陣列,符合其中任一個就算符合。除了完全相等,event pattern 也支援前綴、後綴、數值範圍等比對方式,例如「key 以 .pdf 結尾,而且大小超過 10 MB」。
SNS(Day 16)同樣能把一則訊息送到多個目的地,也支援依內容篩選(filter policy 比對訊息屬性或本文)。兩者的差別在訊息來源與附加功能:
| SNS | EventBridge | |
|---|---|---|
| 事件來源 | 主要是應用程式自己 publish | 200 多個 AWS 服務的事件自動送進 default bus,加上自訂事件、SaaS 事件 |
| 篩選 | filter policy,比對訊息屬性或訊息本文 | event pattern,比對事件的任何欄位 |
| 目的地數量 | 一個 topic 可以有大量訂閱者 | 一條 rule 最多 5 個 target,可以建多條 rule |
| 目的地類型 | 除了 AWS 服務,也能直接發 email、簡訊、手機推播 | AWS 服務、其他帳號的 bus、API 端點 |
| 排程 | 無 | 有(見後面排程小節) |
| 保存與重播 | 不保存 | archive & replay |
選擇依據:要回應 AWS 服務的狀態變化、接 SaaS 事件、需要排程或重播時,用 EventBridge;應用程式自己發出、要推送給大量訂閱者或直接發簡訊和 email 時,用 SNS。
EventBridge 在架構裡最常見的用法,是讓 AWS 服務的事件直接觸發後續動作,中間不需要任何查詢程式:
| 事件來源 | 事件 | 常見的 target 與用途 |
|---|---|---|
| EC2 | instance 狀態改變(停止、終止) | SNS 通知維運團隊 |
| CloudTrail | 有人呼叫 API,例如修改 Security Group 的規則(需要啟用 CloudTrail trail) | Lambda 自動還原設定,並用 SNS 通知資安團隊 |
| GuardDuty | 偵測到威脅(Day 7) | Lambda 自動隔離可疑的 instance |
| AWS Health | AWS 排定的維護、服務異常 | SNS 通知相關團隊 |
| S3 | 新物件上傳 | Lambda 處理檔案(下一段) |
| 自己的應用程式 | 用 PutEvents API 送進 custom bus,例如「訂單已成立」 |
依內容分送到不同的處理服務 |
| SaaS 夥伴 | 例如 Shopify 的訂單取消 | 透過 partner bus 觸發 Lambda |
多帳號的環境也是同樣的做法:每個帳號的 default bus 只收到自己帳號的事件,所以在中央帳號建立一個 custom bus,用 resource-based policy 允許其他帳號寫入,各帳號再用一條 rule 把事件轉送過去,就能集中處理所有帳號的事件。
考題描述「某件事發生時,自動執行某個動作」,而那件事是 AWS 服務本身的狀態變化或 API 呼叫時,答案通常就是 EventBridge。
S3 自己也有通知功能,稱為 S3 event notification。同樣是「檔案上傳後觸發處理」,有兩種做法:
| S3 event notification | 送進 EventBridge | |
|---|---|---|
| 設定方式 | 在 bucket 的通知設定裡指定目的地 | bucket 開啟「傳送到 EventBridge」,再在 EventBridge 建 rule |
| 可用的目的地 | Lambda、SQS、SNS | EventBridge 支援的所有 target,包括 Step Functions |
| 篩選條件 | 只能依 key 的前綴、後綴 | event pattern:前綴、後綴、物件大小、metadata 等 |
| 同一個事件送到多個目的地 | 篩選條件重疊的同類事件只能送到一個目的地,要送到多個,需先送進 SNS 再 fan-out | 多條 rule 各自比對,可以送到多個目的地 |
| 保存與重播 | 無 | 支援 archive & replay(見補充) |
只需要「上傳 .jpg 就觸發一個 Lambda」時,S3 event notification 最簡單。需要依物件大小等條件分流,或同一個事件要送到多個目的地時,改用 EventBridge。
EventBridge 的 rule 除了比對事件,也可以依時間表觸發,不需要任何事件來源:
| 排程方式 | 寫法 | 適合情境 |
|---|---|---|
| Rate expression | 例如 rate(5 minutes) |
固定間隔重複執行 |
| Cron expression | 例如 cron(0 20 * * ? *)(每天 UTC 20:00) |
在特定時間點執行 |
Cron expression 和 Linux 的 cron 有兩個差別:欄位有 6 個(分、時、日、月、星期、年),比 Linux 多了「年」;「日」和「星期」兩個欄位必須有一個填 ?,代表不指定。時間一律以 UTC 計算。
固定時間要執行的工作,以前需要一台全年開機的機器跑 cron;改用排程 rule 觸發 Lambda 之後,只在執行時計費,也不用維護作業系統。
AWS 後來另外推出 EventBridge Scheduler,專門處理排程:支援一次性排程(例如「明天早上 9 點執行一次」)、指定時區,並能管理大量排程。新的排程需求,AWS 建議使用 Scheduler。
| 主題 | 說明 |
|---|---|
| Archive & Replay | 把送進某個 bus 的事件保存下來(archive),之後可以把指定時段的事件重新送一次(replay),用於除錯或程式修正後補跑 |
| Dead-letter queue | target 處理失敗時,EventBridge 預設會重試最長 24 小時,重試用完就丟棄事件;為 target 設定 SQS DLQ,可以接住這些事件 |
| Input Transformer | 送到 target 前,只挑出事件裡需要的欄位,重組成 target 需要的格式 |
| 概念 | 說明 |
|---|---|
| 事件 | 已經發生的事;事件來源不指定目的地,由 EventBridge 的 rule 決定 |
| Event Bus | default(AWS 服務事件)、custom(自訂事件)、partner(SaaS 事件) |
| Rule | 用 event pattern 比對事件內容,符合才送到 target |
| Target | 一條 rule 最多 5 個,例如 Lambda、SQS、SNS、Step Functions |
| 常見組合 | AWS 服務的狀態變化或 API 呼叫,直接觸發 Lambda 或 SNS,不需要查詢程式 |
| S3 事件 | 簡單觸發用 S3 event notification;依大小分流或送到多個目的地用 EventBridge |
| EventBridge 與 SNS | AWS 服務事件、SaaS、排程、重播用 EventBridge;大量訂閱者、email、簡訊用 SNS |
| 排程 | rate 或 cron expression;新的排程需求用 EventBridge Scheduler |
摘要:EventBridge 接收 AWS 服務、自己的應用程式和 SaaS 產生的事件,再用 rule 比對事件內容,送到對應的 target。它讓「某件事發生時自動執行某個動作」不需要寫查詢程式,也取代了需要專門機器的 cron 排程。
下一天進 Lambda:Serverless 執行模型與限制。
某公司以 AWS Organizations 管理 40 個帳號,每個帳號都已啟用 CloudTrail。資安團隊要求:任何成員帳號只要有人修改 Security Group 的輸入規則,相關事件都必須在幾秒內送到資安帳號,由那裡的 Lambda 統一分析,而且之後新加入組織的帳號也要一併涵蓋。公司希望以維運負擔最低(LEAST operational overhead)的方式完成。
解決方案架構師應該怎麼做?
某公司有一台全年開機的 t3.small EC2,唯一的用途是用 cron 每 15 分鐘執行一次腳本,呼叫外部 API 同步匯率並寫進 DynamoDB,每次執行約 20 秒。維運團隊還得定期幫這台機器更新作業系統。公司希望以最符合成本效益(MOST cost-effective)的方式處理。
哪一個方案能以最低的成本取代這台機器?
rate(15 minutes) 的 EventBridge 排程規則觸發某電商把訂單事件送進 EventBridge 的 custom bus,由 rule 觸發 Lambda 寫入會計系統。上個月 Lambda 的一次錯誤部署讓處理失敗了 6 小時,EventBridge 重試用完後把事件丟棄,會計資料因此出現缺口。公司要求:之後 target 失敗時,送不出去的事件不能遺失、要能讓工程師檢查;程式修正後,也要能把出錯期間的事件重新送一次。
解決方案架構師應該採取哪兩項做法?(選擇兩項)
某設計公司的使用者會把檔案上傳到同一個 S3 bucket。副檔名為
.jpg的檔案要交給 Lambda 產生縮圖;副檔名為
哪一個方案能以最少的維運工作滿足需求?
.jpg 與 .pdf 後綴觸發同一個 Lambda,由它判斷大小再啟動 Step Functions某品牌在 SaaS 電商平台 Shopify 上開設網路商店。營運團隊要求:只要有訂單被取消,就要在一分鐘內自動於 AWS 上觸發 Lambda,建立內部事件並通知客服主管追蹤原因。開發團隊人力有限,公司希望盡量不撰寫、也不維護整合用的程式碼。
解決方案架構師應該怎麼做?
source 為 Shopify 的事件,篩出取消訂單的事件後觸發 Lambda 處理EventBridge 可以跨帳號傳送事件:在資安帳號建立 custom bus,resource-based policy 以 aws:PrincipalOrgID 條件允許整個組織寫入;各成員帳號的 default bus 會收到自己帳號的 Security Group 變更事件(透過 CloudTrail 產生的 API 事件),再用一條 rule 把它轉送到資安帳號的 bus。事件幾秒內就能送達。成員帳號的 rule 可以用 CloudFormation StackSets 自動部署到新帳號,不用另外寫程式。
A 是誤解:每個帳號的 default bus 只會收到自己帳號產生的事件,資安帳號的 bus 看不到其他帳號的變更。B 要在每個帳號各寫一個發布通知的 Lambda,等於自己重做 EventBridge 原生就有的事件來源,維運負擔最高。D 能收集到事件,但 CloudTrail 日誌是批次寫進 S3 的,再加上每 5 分鐘掃描一次,做不到「幾秒內」送達。
EventBridge 的排程規則直接取代 cron,Lambda 只在每 15 分鐘被叫醒的那 20 秒計費,沒呼叫時完全不用付錢,也不用再維護作業系統。一天 96 次、每次 20 秒的工作量,Lambda 的費用遠低於一台全年開機的 EC2。
B 能降低 EC2 的費率,但這台機器 99% 的時間都在閒置,打折之後依然是在為閒置付費,也沒有解決更新作業系統的負擔。C 更便宜一些,但一樣是全天候跑一台機器,還多了中斷後重建的複雜度。D 是最有誘惑力的干擾項:Fargate task 跑完就結束,同樣不用維護作業系統;但 Fargate 以秒計費、每次最少收 1 分鐘,20 秒的工作要付 1 分鐘的錢,每次啟動還要拉取容器映像檔,另外得維護映像檔和 task definition,成本和工作量都輸給 Lambda。
target 的 DLQ 會接住重試用完之後仍然送不出去的事件,事件不會被丟棄,工程師可以直接到 SQS 裡檢查。archive 則會保存送進這個 bus 的事件,程式修正後,可以用 replay 把指定時段的事件重新送一次,補回出錯期間的資料。兩項各自滿足一個要求。
A 在調整 Lambda 的資源,但這次失敗是錯誤部署造成的,不是時間不夠。C 確實能把每一筆事件存下來,但那只是日誌:要重新送一次,得自己寫程式把事件從日誌讀出來再逐筆送回 bus;而且兩個 target 是分開送的,哪些事件在 Lambda 那邊失敗,日誌裡也看不出來。E 只是多一個負責推送的服務,SNS 同樣不會保存歷史事件,沒辦法事後重送,反而多了一層要維護。
S3 可以把 bucket 的事件送進 EventBridge,而 EventBridge 的 event pattern 可以同時比對事件內容裡的 key 後綴(suffix matching)和物件大小(numeric matching)。兩條 rule 各自把 .jpg 送到 Lambda、把大於 10 MB 的 .pdf 送到 Step Functions,分流完全靠設定,不用寫程式碼。
A 是最常見的做法,也是最有誘惑力的干擾項:S3 event notification 支援依前綴、後綴篩選,但不支援依物件大小篩選,只能再寫一個 Lambda 判斷大小,違反「盡量不寫額外的分流程式碼」。B 要自己維護 EC2 上的 worker 和分派邏輯,維運負擔最高。C 用 CloudTrail 加輪詢,延遲高又要寫查詢程式,是繞遠路的做法。
EventBridge 有現成的 SaaS partner 整合,Shopify 就是其中之一。在 Shopify 設定 EventBridge 作為 webhook 的傳送目的地後,訂單事件會直接送進帳號裡的 partner bus,只要寫一條 event pattern 篩出「訂單取消」的事件並觸發 Lambda,整合的部分完全不用寫程式,而且是事件驅動、即時送達。
A 能做到,但要自己寫、自己維護呼叫 Shopify API 的輪詢程式,還要處理認證、分頁和重複資料。C 也能做到,但 webhook 端點、驗證與解析邏輯都要自己寫和維護,跟「盡量不寫整合程式碼」相反。D 是誤解:SaaS 夥伴的事件不會進到 default bus,一定要透過 partner event source 送進專屬的 partner bus,rule 也要建在那個 bus 上。