AWS EventBridge 事件驅動

Gary Ng
8 min readAug 18, 2024

--

是一款由 AWS 提供的無伺服器事件驅動服務,透過 Event、Pipe、Schedule等搭配使事件的產生者發送到特定目標。

例如: 倘若一台 EC2 服務啟動的時候想要發送信件亦或是簡訊通知開發者,就可以搭配 EventBridge。

Event Bridge 核心

Event Bridge 主要由以下組成

  1. Event Bus

類似路由,會將接收到的事件發送到多個目標位置(每個規則至多 5 個 target)。且帳號建立後會創建一個 default event bus, 它會接收來自 AWS 服務的事件。假如不想使用預設的 event bus 也可以自定義一個 event bus。

這邊為了測試方便就先都使用預設的 event bus。

2. Event

事件的主要內容,格式為 JSON。

Event 的傳遞方式分為兩種

a. Best effort delivery

盡可能的傳送 aws service 所有 event 到 event bridge

b. Durable delivery

傳送到 event bridge 至少要有一次成功

3. Event Source

發送事件的來源, 通常來源會有 AWS Service, Custom Application 等。

所有的 event 都一定會有以下欄位資料

{
// 預設為 0
"version": "0",
"id": "UUID",
// 發送事件的類型
"detail-type": "event name",
// 發送事件的來源
"source": "event source",
"account": "ARN",
"time": "timestamp",
"region": "region",
"resources": [
"ARN"
],
// 資料內容
"detail": {
JSON object
}
}

參數說明

version:

預設所有的服務皆為 0

detail_type:

發送事件的類型

source:

發送事件的來源,也可以客制,官方建議命名的方式採用 reverse domain-name 的方式。預設 aws 服務開頭皆為 aws,例如: cloudfront 的 source 為 aws.cloudfront,倘若想找特定 aws service 的 source 為何,可以透過以下網址查閱。

4.Rules

事件觸發後根據所定義的規則發送至目標位置,每個 rule 至多發送至 5 個目標位置。

規則匹配的方式分為三大類

a. Event metadata: 比較 event 的 source、account、 region

b. Event data: 比較 event 的 json data 本身

c. Event field: 比較event 欄位得值

AWS 官方流程圖

實作 Event Bridge 範例

當 EC2 服務運行起來的時候紀錄資訊

主要用到的服務:

  1. Lambda

使用情境:
當 EC2 運行起來的時候觸發 Lambda。

實際操作:

  1. 新增一個 Lambda function name 叫做 LogEC2InstanceChange

創建完後 IAM 會有如下權限

以下的 policy 主要是允許可以創建 CloudWatch group 以及使用 cloudwatch log

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "logs:CreateLogGroup",
"Resource": "arn:aws:logs:ap-northeast-1:<account id>:*"
},
{
"Effect": "Allow",
"Action": [
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": [
"arn:aws:logs:ap-northeast-1:<account id>:log-group:/aws/lambda/LogEC2InstanceChange:*"
]
}
]
}

2.允許 EventBridge 可以觸發 Lambda 的前提下,我們須先設定 resource-base-policy

a.進入到剛剛新增的 Lambda 服務

b. 點選 Configuration 後接著點選 Permissions

c. 往下拖拉即可看到 Resource-based policy, 點選 Add permissions 創建權限

d. 設定成以下的 policy

以下 policy 主要是允許 event bridge 可以觸發 lambda

{
"Effect": "Allow",
"Action": "lambda:InvokeFunction",
"Resource": "arn:aws:lambda:region:account-id:function:function-name",
"Principal": {
"Service": "events.amazonaws.com"
},
"Condition": {
"ArnLike": {
"AWS:SourceArn": "arn:aws:events:region:account-id:rule/rule-name"
}
},
"Sid": "InvokeLambdaFunction"
}

3. 編輯 Lambda function code 為如下, 設定完成後點選 Deploy

export const handler = async (event, context, callback) => {
console.log('LogEC2InstanceStateChange');
console.log('Received event:', JSON.stringify(event, null, 2));
callback(null, 'Finished');
};

4. 設定 Event Bridge Rule

a. 點選創建 Rule

b. Rule Name 設定為 EC2StateChange, Rule Type 則選擇 Rule with an event pattern

c. 按下以下設定

c-1. 因為要監聽 EC2 資源,所以 AWS Service 選擇 EC2

c-2. 因為是監聽 EC2 啟動的事件,所以選擇 EC2 Instance State-change Notification

c-3. 因為僅監聽 running state , 所以選擇 specific state 且 state 選擇 running

d. 設定 event bridge target

d-1因為是要使用 Lambda , 所以 Target Type 選擇 AWS Serviec

d-2Function 選擇前面步驟創建的 Lambda function name

d-3 一直按下一步到 Create Rule 即創建成功

5. 測試的方式則是啟用一個 EC2 Instance, 然後觀察 CloudWatch Log。

6. 記得刪除 Event Rule 免得之後有啟用 EC2 的時候一直觸發 event bridge

--

--

Gary Ng
Gary Ng

Written by Gary Ng

軟體工程師、後端工程師

No responses yet