EventBridge 簡介
EventBridge Scheduler 是 AWS 在 2022/11 推出的新服務,相較於傳統事件驅動的 EventBridge,新推出的 Scheduler 是時間驅動的一個服務,你可以很輕易的在上面設置一些排程任務去調用 AWS 的其他服務,截至 2024/04/06,官方文件是顯示可以調用 AWS 超過 270 種服務,就我目前使用下來的心得,真的是相當易用!
常見的使用場景:
- 自動調整服務容量: 如 Amazon ECS 任務的數量或今天要介紹的 Aurora Serverless V2 ACU (今天要示範的)
- 自動化維護任務: 定時啟動或停止 EC2 Instance,以節省成本或進行系統維護。
- SasS 訂閱即將到期通知: 蠻多 SaaS 系統可能會需要在用戶快到期時發送信件通知客戶續訂
架構說明
關於本文,我會預設讀者們對於 AWS 有基本的操作能力和認識,對於一些較瑣碎的動作會省略不講解
本文要教學的是排程每天固定時間,會透過 EventBridge Scheduler 調用 Lambda Function 然後將 Aurora Serverless V2 的 ACU 降低。
關於這個動作,我們其實要拆解成兩個部分:
- 用 Lambda 去調整 Aurora Serverless v2 ACU
- 用 EventBridge 去 Trigger Lambda
下圖是從 AWS 官方 Blog 下載下來的架構圖,純示意圖大概讓各位認識 EventBridge 和 Lambda 的配合
整體的步驟大概會是
- 創建 IAM Role
- 創建 Lambda Function
- 創建 EventBridge Scheduler
創建 IAM Policy 及 IAM Role
這個 IAM Role 將會給我們的 Lambda Function 可以去讀取和修改 Aurora
- 創建 IAM Policy
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"rds:DescribeDBClusters",
"rds:ModifyDBCluster"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": "logs:CreateLogGroup",
"Resource": "arn:aws:logs:ap-northeast-1:784523829721:*"
},
{
"Effect": "Allow",
"Action": "logs:CreateLogStream",
"Resource": "arn:aws:logs:ap-northeast-1:784523829721:log-group:/aws/lambda/AdjustAuroraACU:*"
},
{
"Effect": "Allow",
"Action": "logs:PutLogEvents",
"Resource": "arn:aws:logs:ap-northeast-1:784523829721:log-group:/aws/lambda/AdjustAuroraACU:log-stream:*"
}
]
}
-
創建 IAM Role,然後 Attach 剛才所創建的 Policy
-
創建完畢應該會類似下圖
創建 Lambda Function
- Runtime: Python 3.12
- IAM Role: {你剛才創建的 IAM Role}
import boto3
def lambda_handler(event, context):
# Extract ACU configuration and cluster identifier from the event
min_capacity = event.get('min_capacity')
max_capacity = event.get('max_capacity')
cluster_identifier = event.get('cluster_identifier')
# Ensure cluster_identifier is provided
if not cluster_identifier:
print("Error: 'cluster_identifier' not provided in the event.")
return {
'statusCode': 400,
'body': "'cluster_identifier' is required."
}
# Modify the capacity for Aurora Serverless v2
modify_aurora_serverless_v2_capacity(cluster_identifier, min_capacity, max_capacity)
def modify_aurora_serverless_v2_capacity(cluster_identifier, min_capacity, max_capacity):
# Initialize the RDS client
rds_client = boto3.client('rds')
try:
response = rds_client.modify_db_cluster(
DBClusterIdentifier=cluster_identifier,
ServerlessV2ScalingConfiguration={
'MinCapacity': min_capacity,
'MaxCapacity': max_capacity
},
ApplyImmediately=True
)
print(f"Capacity update successful: {response}")
return {
'statusCode': 200,
'body': f"Capacity updated to Min: {min_capacity}, Max: {max_capacity} for {cluster_identifier}"
}
except Exception as e:
print(f"Error updating capacity: {e}")
return {
'statusCode': 500,
'body': f"Error updating capacity for {cluster_identifier}: {e}"
}
- 進到 Configuration - General Configuration 調整 Lambda Timeout,我這邊是改成 10s
創建 EventBridge Scheduler
-
搜尋 EventBridge 後進入該頁面,側邊選單點選 Scheduler/Schedules
-
點擊 “Create Schedule”
-
選擇 “Recurring schedule”
- Timezone: (UTC+8) Asia/Taipei
- Schedule Type: Cron-based schedule
- Cron Expression:
02 4 * * ? *
(這邊請依照你想觸發的特定時間去更動)
-
Next
-
Target Detail
- Target API: Lambda
- Invoke: {選擇你剛才創建的 Lambda Function}
-
Payload
{ "cluster_identifier": "demoAurora", "min_capacity": 1, "max_capacity": 1.5 }
-
-
Next
-
Permisison: Create new role for this schedule
-
Create
照著以上的步驟做到這裡就完成,照理來說應該就沒問題了
Troubleshooting
-
InvalidParameterCombination 這是我剛開始踩到的坑,原因是 Aurora Serverless V2 必須指定
ServerlessV2ScalingConfiguration
You can set the capacity of an Aurora DB instance with the ModifyDBCluster API operation. Specify the ServerlessV2ScalingConfiguration parameter.