如何使用 Lambda 以停止和啟動 Amazon EC2 執行個體?
我想自動停止並啟動我的 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體,以減少我的 Amazon EC2 使用量。
簡短描述
使用 AWS Lambda 和 Amazon EventBridge 以自動停止和啟動 EC2 執行個體。
**注意:**下列解決方法是簡單的範例解決方案。如需更進階的解決方案,請使用 AWS 執行個體排程器。如需詳細資訊,請參閱自動啟動和停止 AWS 執行個體。
若要使用 Lambda 來定期停止和啟動 EC2 執行個體,請完成下列步驟:
- 為 Lambda 函數建立自訂 AWS Identity and Access Management (IAM) 政策和 IAM 角色。
- 建立停止和啟動 EC2 執行個體的 Lambda 函數。
- 測試 Lambda 函數。
- 建立依排程執行函數的 EventBridge 排程。
**注意:**您也可以建立對 AWS 帳戶的事件做出反應的規則。
解決方法
**注意:**完成下列步驟後,您可能會收到 Client error on launch 錯誤。如需詳細資訊,請參閱我使用連接的加密執行個體啟動執行個體時,執行個體立即停止並顯示錯誤 "client error on launch"。
取得您想要停止和啟動的 EC2 執行個體 ID。然後,完成下列步驟。
為 Lambda 函數建立 IAM 政策和 IAM 角色
-
使用 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": "*" } ] }
-
為 Lambda 建立 IAM 角色。
**重要:**將許可政策連接至 Lambda 時,請確定選擇 IAM 政策。
**注意:**如果您使用客戶管理的 AWS Key Management Service (KMS) 金鑰加密的 Amazon Elastic Block Store (Amazon EBS) 磁碟區,請將 kms:CreateGrant 新增至 IAM 政策。
建立停止和啟動執行個體的 Lambda 函數
- 開啟 Lambda 主控台,然後選擇建立函數。
- 選擇從頭開始撰寫。
- 在基本資訊下,輸入下列資訊:
對於函數名稱,輸入描述函數的名稱,例如 "StopEC2Instances"。
對於執行時期,選擇 Python 3.9。
在許可下,展開變更預設執行角色。
在執行角色下,選擇使用現有角色。
在現有角色下,選擇 IAM 角色。 - 選擇建立函數。
- 在程式碼標籤的程式碼來源下,將下列程式碼貼到 lambda_function 標籤上的程式碼編輯器的編輯器窗格中。此程式碼會停止您識別的執行個體:
使用您的執行個體所在的 AWS 區域取代 us-west-1。將 InstanceIds 取代為您要停止和啟動的執行個體的 ID。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))
- 選擇部署。
- 在組態標籤上,選擇一般組態,然後選擇編輯。
- 將逾時設定為 10 秒,然後選擇儲存。
注意:(選用) 您可以調整 Lambda 函數設定。例如,若要停止和啟動多個執行個體,逾時和記憶體可能需要使用不同的值。 - 重複步驟 1-7 以建立其他函數。完成下列步驟,讓此函數啟動您的執行個體:
在步驟 3 中,輸入不同的函數名稱。例如,"StartEC2Instances"。
在步驟 5 中,將下列程式碼貼到 lambda\ _function 標籤上程式碼編輯器的編輯器窗格中: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))
使用您的區域和相同的執行個體 ID。
測試 Lambda 函數
- 開啟 Lambda 主控台,然後選擇函數。
- 選擇其中一個函數。
- 選擇程式碼標籤。
- 在程式碼來源區段中,選擇測試。
- 在設定測試事件對話方塊中,選擇建立新測試事件。
- 輸入事件名稱。然後,選擇建立。
**注意:**請勿變更測試事件的 JSON 程式碼。 - 選擇測試以執行該函數。
- 對其他函數重複步驟 1-7。
檢查執行個體的狀態
AWS 管理主控台
在測試之前和之後,請檢查執行個體的狀態以確認函數是否正常運作。
CloudTrail
若要確認 Lambda 函數已停止或已啟動執行個體,請使用 AWS CloudTrail 以檢查是否有事件。
- 開啟 CloudTrail 主控台。
- 在導覽窗格中,選取事件歷史記錄。
- 選擇查詢屬性下拉式清單,然後選擇事件名稱。
- 在搜尋列中,輸入 StopInstances,以檢閱結果。然後,輸入 StartInstances。
如果沒有結果,則 Lambda 函數不會停止或啟動執行個體。
建立可執行 Lambda 函數的 EventBridge 規則
- 開啟 EventBridge 主控台。
- 選取建立規則。
- 輸入規則的名稱,例如 "StopEC2Instances"。(選用) 在描述中,輸入規則描述。
- 在規則類型中,選擇排程,然後選擇在 EventBridge 排程器中繼續。
- 針對排程器模式,選擇定期排程。
- 在排程模式下的發生中,選擇定期排程。
- 針對排程類型,選擇排程類型,然後完成下列步驟:
針對依據費率的排程,輸入費率值,然後選擇以分鐘、小時或天為單位的時間間隔。
-或-
對於依據 Cron 的排程,輸入表達式,以告知 Lambda 停止執行個體的時間。如需表達式語法的資訊,請參閱建立按排程執行的 Amazon EventBridge 規則。
**注意:**Cron 表達式在 UTC 評估。請確定依據您的時區以調整表達式。 - 在選取目標中,從目標下拉式清單中選擇 Lambda 函數。
- 對於函數,選擇停止執行個體的函數。
- 選擇略過以檢閱和建立,然後選擇建立。
- 重複步驟 1-10 以建立規則,然後啟動執行個體。請完成下列步驟:
輸入規則名稱,例如 "StartEC2Instances"。
(選用) 在描述中,輸入規則描述,例如「每天上午 7 時啟動 EC2 執行個體」。
在步驟 7 中,對於 Cron 表達式,輸入表達式以告知 Lambda 啟動執行個體的時間。
在步驟 9 中,對於函數,選擇可啟動執行個體的函數。
**注意:**有時,Lambda 函數會停止執行個體,並且無法重新啟動。Amazon Elastic Block Store (Amazon EBS) 磁碟區已加密,且 Lambda 角色未授權使用加密金鑰時,就會發生這種情況。如需詳細資訊,請參閱使用加密的磁碟區所需的 AWS KMS key 政策和 AWS KMS 的金鑰政策。
相關資訊
相關內容
- 已提問 5 個月前lg...
- 已提問 5 個月前lg...
- 已提問 10 個月前lg...
- 已提問 9 個月前lg...
- AWS 官方已更新 3 年前
- AWS 官方已更新 2 年前
- AWS 官方已更新 1 年前
- AWS 官方已更新 1 年前