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 降低。

關於這個動作,我們其實要拆解成兩個部分:

  1. 用 Lambda 去調整 Aurora Serverless v2 ACU
  2. 用 EventBridge 去 Trigger Lambda

下圖是從 AWS 官方 Blog 下載下來的架構圖,純示意圖大概讓各位認識 EventBridge 和 Lambda 的配合 image

整體的步驟大概會是

  1. 創建 IAM Role
  2. 創建 Lambda Function
  3. 創建 EventBridge Scheduler

創建 IAM Policy 及 IAM Role

這個 IAM Role 將會給我們的 Lambda Function 可以去讀取和修改 Aurora

  • 創建 IAM Policy image
{
    "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 image

  • 創建完畢應該會類似下圖 image

創建 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 image

創建 EventBridge Scheduler

  1. 搜尋 EventBridge 後進入該頁面,側邊選單點選 Scheduler/Schedules

  2. 點擊 “Create Schedule”

  3. 選擇 “Recurring schedule”

    • Timezone: (UTC+8) Asia/Taipei
    • Schedule Type: Cron-based schedule
    • Cron Expression: 02 4 * * ? * (這邊請依照你想觸發的特定時間去更動) image
  4. Next

  5. Target Detail

    • Target API: Lambda
    • Invoke: {選擇你剛才創建的 Lambda Function}
      • Payload

        {
          "cluster_identifier": "demoAurora",
          "min_capacity": 1,
          "max_capacity": 1.5
        }
        

    image

  6. Next

  7. Permisison: Create new role for this schedule

  8. Create

照著以上的步驟做到這裡就完成,照理來說應該就沒問題了


Troubleshooting

  1. InvalidParameterCombination image 這是我剛開始踩到的坑,原因是 Aurora Serverless V2 必須指定 ServerlessV2ScalingConfiguration

    You can set the capacity of an Aurora DB instance with the ModifyDBCluster API operation. Specify the ServerlessV2ScalingConfiguration parameter.

    AWS Docs - What is Amazon EventBridge Scheduler?


相關資料