1. 技術方案與原理
- 目標: EC2 定時自動開關機,徹底自動化省錢。
- 主要組件:
- Lambda(自動呼叫 EC2 API)
- EventBridge Scheduler(定時觸發 Lambda)
- 單個 IAM 角色即可(Lambda用),權限和信任設置到位。
2. Lambda function 編寫與部署
- 登錄 AWS Lambda 控制台。
- 點
Create function>Author from scratch。 - 命名(建議分「EC2AutoStop」&「EC2AutoStart」)。
- 選 Python 3.x。
- 貼入以下代碼:
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)
- ⚠️ 每次修改都必須點「Deploy」!否則Lambda實際行為不會更新。
- 初次建好後用測試功能(Test)驗證能正確操作EC2並產生日誌。
3. Lambda執行角色設定(包含自定義policy/inline policy與信任關係)
步驟1.建立角色與 Action Policy、Inline Policy
- IAM > Roles > Create role
- Trusted entity 選 Lambda
- Attach Policy: AWSLambdaBasicExecutionRole,然後Attach 自定義托管 policy
名稱建議:AmazonEC2StopStartInstances
- 內容如下,用於賦予 Lambda 停啟 EC2 權限:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2:StartInstances",
"ec2:StopInstances"
],
"Resource": "*"
}
]
}
- 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)政策
- IAM > Roles > 找到你 Lambda 執行用的角色。
- 點 “Trust relationships” 分頁,選 “Edit trust policy”
- 貼入如下 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。
- 存檔,確認無誤。
4. EventBridge Scheduler 定時任務設置
- AWS Console > EventBridge > Schedules > Create schedule
- 務必與 Lambda 選同一 region
- 任務 Type 選「Invoke」→「AWS Lambda」。
- Lambda function 處選你剛剛部署的 function。
- Execution role 處,選 Lambda 上一步設好的執行角色(已信任並賦權)。
- 時間排程(cron)範例(JST 08:00 週一至週五):
cron(0 23 ? * MON-FRI *)
- 完成儲存。
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無觸發Lambda | Lambda角色加 scheduler.amazonaws.com到trust policy |
| Lambda沒產生日誌 | 執行一次自動產生log group |
| Lambda可Test計劃無效 | 檢查角色信任關係和權限 policy |
| 改了Lambda沒生效 | 忘記點 Deploy,請務必 Deploy! |
- Action policy及信任完全在Lambda這唯一角色上設,管理簡單有效。
- inline policy管理更易查維護,精細到臨時或特定EC2都行