EC2 定時自動開關機實踐


1. 技術方案與原理

  • 目標: EC2 定時自動開關機,徹底自動化省錢。
  • 主要組件:
    • Lambda(自動呼叫 EC2 API)
    • EventBridge Scheduler(定時觸發 Lambda)
    • 單個 IAM 角色即可(Lambda用),權限和信任設置到位。

2. Lambda function 編寫與部署

  1. 登錄 AWS Lambda 控制台。
  2. Create function > Author from scratch
  3. 命名(建議分「EC2AutoStop」&「EC2AutoStart」)。
  4. 選 Python 3.x。
  5. 貼入以下代碼:
import boto3

def lambda_handler(event, context):
    ec2 = boto3.client('ec2', region_name='ap-northeast-3')
    ec2.stop_instances(InstanceIds=['i-xxxxxxxxxxxxxxxxx'])
    return 'EC2 stopped'

(開機則改 .stop_instances → .start_instances)

  1. ⚠️ 每次修改都必須點「Deploy」!否則Lambda實際行為不會更新。
  2. 初次建好後用測試功能(Test)驗證能正確操作EC2並產生日誌。

3. Lambda執行角色設定(包含自定義policy/inline policy與信任關係)

步驟1.建立角色與 Action Policy、Inline Policy

  1. IAM > Roles > Create role
  2. Trusted entity 選 Lambda
  3. Attach Policy: AWSLambdaBasicExecutionRole,然後Attach 自定義托管 policy
    名稱建議:AmazonEC2StopStartInstances
  • 內容如下,用於賦予 Lambda 停啟 EC2 權限:
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ec2:StartInstances",
                "ec2:StopInstances"
            ],
            "Resource": "*"
        }
    ]
}
  1. Attach 另一個 inline policy
    名稱建議:InvokeSpecificLambda
  • 內容如下,授權本角色可以調用特定 Lambda function(可根據需求擴展其它 function 的 ARN):
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "lambda:InvokeFunction",
            "Resource": [
                "arn:aws:lambda:ap-northeast-3:088xx0000000:function:EC2AutoStop",
                "arn:aws:lambda:ap-northeast-3:088xx0000000:function:EC2AutoStart"
            ]
        }
    ]
}

注意替換 ARN,與你環境中的 Lambda 名稱/region/account-id 一致。

步驟2.補充信任(Trust Relationships)政策

  1. IAM > Roles > 找到你 Lambda 執行用的角色。
  2. 點 “Trust relationships” 分頁,選 “Edit trust policy”
  3. 貼入如下 JSON,允許 Lambda 和 Scheduler 兩種方式 assume 這個角色:
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": [
          "lambda.amazonaws.com",
          "scheduler.amazonaws.com"
        ]
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

這裡加入 "scheduler.amazonaws.com",即可允許 EventBridge Scheduler 以這個角色調用 Lambda。

  1. 存檔,確認無誤。

4. EventBridge Scheduler 定時任務設置

  1. AWS Console > EventBridge > Schedules > Create schedule
  2. 務必與 Lambda 選同一 region
  3. 任務 Type 選「Invoke」→「AWS Lambda」。
  4. Lambda function 處選你剛剛部署的 function。
  5. Execution role 處,選 Lambda 上一步設好的執行角色(已信任並賦權)。
  6. 時間排程(cron)範例(JST 08:00 週一至週五):
   cron(0 23 ? * MON-FRI *)
  1. 完成儲存。

5. Lambda 配置最佳實踐(Timeout/Memory)

  • Timeout 設 30-60 秒(防止 Sandbox.Timedout)
  • Memory 推薦 256-512MB
  • 設置路徑:Lambda 控制台 > Configuration > General configuration > Edit
  • 設定完記得 Deploy

6. 問題診斷(CloudWatch 日誌&Scheduler Run History)

狀況核查方式與解決
Lambda test 成功但計劃不中斷檢查 Lambda 角色信任 policy 是否含 scheduler.amazonaws.com
定時沒觸發檢查 Scheduler Run history 與 Lambda CloudWatch Logs
超時Lambda Timeout 要夠長

7. 常見錯誤對應表 & 補充建議

情況對應解法
Lambda執行超時Timeout改30s↑
Scheduler無觸發LambdaLambda角色加 scheduler.amazonaws.com到trust policy
Lambda沒產生日誌執行一次自動產生log group
Lambda可Test計劃無效檢查角色信任關係和權限 policy
改了Lambda沒生效忘記點 Deploy,請務必 Deploy!
  • Action policy及信任完全在Lambda這唯一角色上設,管理簡單有效。
  • inline policy管理更易查維護,精細到臨時或特定EC2都行

留下评论

通过 WordPress.com 设计一个这样的站点
从这里开始