是一款由 AWS 提供的無伺服器事件驅動服務,透過 Event、Pipe、Schedule等搭配使事件的產生者發送到特定目標。
例如: 倘若一台 EC2 服務啟動的時候想要發送信件亦或是簡訊通知開發者,就可以搭配 EventBridge。
Event Bridge 核心
Event Bridge 主要由以下組成
- 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 欄位得值
實作 Event Bridge 範例
當 EC2 服務運行起來的時候紀錄資訊
主要用到的服務:
- Lambda
使用情境:
當 EC2 運行起來的時候觸發 Lambda。
實際操作:
- 新增一個 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