如何使用 Lambda 定期停止和啟動 Amazon EC2 執行個體?
上次更新日期:2022 年 12 月 13 日
我想要透過自動停止和啟動我的 EC2 執行個體來減少我的 Amazon Elastic Compute Cloud (Amazon EC2) 使用。要如何使用 AWS Lambda 和 Amazon EventBridge 來做到這一點?
簡短描述
注意:下列解決方案是簡單的解決方案。如需更完整的解決方案,請使用 AWS 執行個體排程器。如需更多資訊,請參閲自動啟動和停止 AWS 執行個體。
請依照以下步驟操作,以使用 Lambda 定期停止和啟動 EC2 執行個體:
1. 為 Lambda 函數建立自訂的 AWS Identity and Access Management (IAM) 政策和執行角色。
2. 建立可停止和啟動 EC2 執行個體的 Lambda 函數。
3. 測試 Lambda 函數。
4. 建立能按排程觸發函數的 EventBridge 規則。
注意:您也可以針對 AWS 帳戶中發生的事件建立觸發規則。
解決方案
注意:如果您在完成以下程序後收到啟動時發生用戶端錯誤,請參閲當啟動連接加密磁碟區的執行個體時,執行個體會立即停止並顯示「啟動時發生用戶端錯誤」。
取得要停止和啟動的 EC2 執行個體的 ID。接著,按照以下步驟操作。
為 Lambda 函數建立 IAM 政策和執行角色
1. 使用 JSON 政策編輯器建立 IAM 政策。複製以下 JSON 政策文件並將其貼至政策編輯器:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "arn:aws:logs:*:*:*"
},
{
"Effect": "Allow",
"Action": [
"ec2:Start*",
"ec2:Stop*"
],
"Resource": "*"
}
]
}
2. 為 Lambda 建立 IAM 角色。
重要提醒:在將許可政策連接到 Lambda 時,請確保您選擇的是剛剛建立的 IAM 政策。
建立可停止和啟動 EC2 執行個體的 Lambda 函數
1. 選擇 Lambda 主控台中的 Create function (建立函數)。
2. 選擇 Author from scratch (從頭編寫)。
3. 在基本資訊下,新增以下操作:
在函數名稱欄位中,輸入能將其標識為用於停止 EC2 執行個體的函數的名稱。例如 "StopEC2Instances"。
針對執行時間,選擇 Python 3.9。
在 Permissions (許可) 下,展開 Change default execution role (變更預設執行角色)。
在 Execution role (執行角色) 下,選擇使用現有的角色。
在 Existing role (現有角色) 下,選擇建立的 IAM 角色。
4. 選擇 Create function (建立函數)。
5. 在代碼及代碼來源下,將以下代碼複製並貼到代碼編輯器 (lambda_function) 的編輯器窗格中。此代碼會停止您指定的 EC2 執行個體。
範例函數代碼 — 停止 EC2 執行個體
import boto3
region = 'us-west-1'
instances = ['i-12345cb6de4f78g9h', 'i-08ce9b2d7eccf6d26']
ec2 = boto3.client('ec2', region_name=region)
def lambda_handler(event, context):
ec2.stop_instances(InstanceIds=instances)
print('stopped your instances: ' + str(instances))
重要提醒:在區域,用您執行個體所在的 AWS 區域取代 "us-west-1"。在執行個體,用您想要停止和啟動的特定執行個體的 ID 取代範例 EC2 執行個體的 ID。
6. 選擇 Deploy (部署)。
7. 在 Configuration (組態) 索引標籤上,選擇 General configuration (一般設定)、Edit (編輯)。將 Timeout (逾時) 設定為 10 秒,然後選擇 Save (儲存)。
注意:根據您的使用案例所需來設定 Lambda 函數設定。例如,如果您想要停止和啟動多個執行個體,您可能需要不同的 Timeout (逾時) 和 Memory (記憶體) 值。
8. 重複步驟 1-7,建立另一個函數。執行以下的不同操作,讓此函數變為能啟動 EC2 執行個體:
在步驟 3 中,輸入與剛剛使用的函數名稱不同的函數名稱。例如 "StartEC2Instances"。
在步驟 5 中,將以下代碼複製並粘貼到代碼編輯器 (lambda_function) 的編輯器窗格中:
範例函數代碼 — 啟動 EC2 執行個體
import boto3
region = 'us-west-1'
instances = ['i-12345cb6de4f78g9h', 'i-08ce9b2d7eccf6d26']
ec2 = boto3.client('ec2', region_name=region)
def lambda_handler(event, context):
ec2.start_instances(InstanceIds=instances)
print('started your instances: ' + str(instances))
重要提醒:在區域和執行個體,使用與您剛剛在用於停止 EC2 執行個體的代碼中輸入的相同的值。
測試 Lambda 函數
1. 選擇 Lambda 主控台中的 Function (函數)。
2. 選擇您建立的其中一個函數。
3. 選擇Code (代碼) 索引標籤。
4. 在 Code source (代碼來源) 部分中,選擇 Test (測試)。
5. 在 Configure test event (設定測試事件) 對話框中,選擇 Create new test event (建立新的測試事件)。
6. 輸入 Event name (事件名稱)。 然後選擇 Create (建立)。
注意: 您不需要更改測試事件的 JSON 代碼 — 函數不會使用它。
7. 選擇 Test (測試) 啟用函數。
8. 對您建立的其他函數重複步驟 1-6。
提示:您可以在測試前後檢查 EC2 執行個體的狀態,好確認函數是否如預期地工作。
建立觸發 Lambda 函數的 EventBridge 規則
1. 開啟 EventBridge 主控台。
2. 選取 Create rule (建立規則)。
3. 輸入規則的 Name (名稱),例如 "StopEC2Instances"。您也可以選擇輸入 Description (描述)。
4. 在 Define pattern (定義模式) 中,選擇 Schedule (排程)。
5. 執行以下其中一項操作:
對於 Fixed rate of (固定頻率),輸入以分鐘、小時或天為單位的時間間隔。
對 Cron expression (Cron 表達式),輸入一個表達式,告訴 Lambda 何時要停止執行個體。關於表達式語法的資訊,請參閲規則的排程表達式。
注意:以 UTC 評估 Cron 表達式。確保根據您的偏好時區調整表達式。
6. 在 Select targets (選擇目標) 中,從 Target (目標) 下拉式選單中選擇 Lambda function (Lambda 函數)。
7. 在函數,選擇可停止 EC2 執行個體的函數。
8. 向下捲動並選取Create (建立)。
9. 重複步驟 1-8,建立啟動 EC2 執行個體的規則。執行以下不同操作:
輸入規則的名稱,例如 "StartEC2Instances"。
(可選) 輸入 Description (描述),例如「在每天早上 7 點啟動 EC2 執行個體」。
在步驟 5 中,在 Cron expression (Cron 表達式) 中輸入一個表達式,告訴 Lambda 何時要啟動執行個體。
在步驟 7 中,在 Function (函數) 中,選擇要用來啟動 EC2 執行個體的函數。