如何使用 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 排程。
有時,Lambda 函數會停止執行個體,並且無法重新啟動。Amazon Elastic Block Store (Amazon EBS) 磁碟區已加密,且 Lambda 角色未獲得加密金鑰使用權時,就會發生這種情況。如需詳細資訊,請參閱與加密磁碟區搭配使用的必要 AWS KMS key 政策。
解決方法
先決條件: 取得您想要停止和啟動的 EC2 執行個體 ID。
為 Lambda 函數建立 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 角色。
**注意:**如果您使用 Amazon Elastic Block Store (Amazon EBS) 磁碟區,則可能需要額外的組態。如果 Amazon EBS 磁碟區使用客戶自管 AWS Key Management Service (KMS) 金鑰加密,請將 kms:CreateGrant 新增至 IAM 政策。
建立可停止和啟動執行個體的 Lambda 函數
完成下列步驟:
-
開啟 Lambda 主控台,然後選擇 Create function (建立函數)。
-
選擇從頭開始撰寫。
-
在基本資訊下,輸入下列資訊:
對於 Function name (函數名稱),輸入能夠描述函數的名稱,例如 StopEC2Instances 或 StartEC2Instances。
對於執行時期,選擇 Python 3.9。
在許可下,展開變更預設執行角色。
在執行角色下,選擇使用現有角色。
在現有角色下,選擇 IAM 角色。 -
選擇 Create function (建立函數)。
-
選擇 Code (程式碼) 標籤。
-
在 lambda_funciton.py 標籤上的Code source (程式碼來源) 下,在程式碼編輯器中輸入下列程式碼以 stop_instances:
import boto3region = '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))
若要 start_instances,請在程式碼編輯器中輸入下列程式碼:
import boto3region = '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))
**注意:**將 us-west-1 取代為執行個體所在的 AWS 區域,並且將 InstanceIds 取代為您要停止並啟動的執行個體 ID。
-
選擇 Deploy (部署)。
-
在組態標籤上,選擇一般組態,然後選擇編輯。
-
將 Timeout (逾時) 設定為 10 秒,然後選擇 Save (儲存)。
測試 Lambda 函數
完成下列步驟:
- 開啟 Lambda 主控台,然後選擇 Functions (函數)。
- 選擇其中一個函數。
- 選擇程式碼標籤。
- 在程式碼來源區段中,選擇測試。
- 在 Configure test event (設定測試事件) 對話方塊中,選擇 Create new test event (建立新測試事件)。
- 輸入事件名稱,然後選擇 Create ( ())。
**注意:**請勿變更測試事件的 JSON 程式碼。 - 選擇測試以執行該函數。
- 對其他函數重複步驟 1-7。
檢查執行個體的狀態
Amazon EC2 主控台
在測試之前和之後,請檢查執行個體的狀態以確認函數是否正常運作。
CloudTrail
您也可以使用 AWS CloudTrail 以確認 Lambda 函數是否已停止或已啟動執行個體。
完成下列步驟:
- 開啟 CloudTrail 主控台。
- 在導覽窗格中,選擇 Event history (事件歷史記錄)。
- 在 Lookup attributes (查詢屬性) 下拉清單中,選擇 Event name (事件名稱)。
- 在搜尋列中,輸入 StopInstances 以檢閱結果。然後,輸入 StartInstances。
如果沒有結果,則 Lambda 函數不會停止或啟動執行個體。
建立可執行 Lambda 函數的 EventBridge 規則
完成下列步驟:
- 開啟 EventBridge 主控台。
- 選擇 Create rule (建立規則)。
- 輸入規則的名稱,例如 StopEC2Instances 或 StartEC2Instances。
- (選用) 對於 Description (描述),請輸入規則的描述。
- 在 Rule type (規則類型) 中,選擇 Schedule (排程),然後選擇 Continue in EventBridge Scheduler (在 EventBridge 排程器中繼續)。
- 在 Schedule pattern (排程模式) 下的 Occurrence (發生) 中,選擇 Recurring schedule (定期排程)。
- 針對 Schedule type (排程類型),選擇 rate-based schedule (依據費率的排程) 或 cron-based schedule (依據 Cron 的排程),然後完成下列其中一個步驟:
針對 Rate-based schedule (依據費率的排程),輸入費率值,然後選擇以分鐘、小時或天為單位的時間間隔。
-或-
針對 Cron-based schedule (依據 Cron 的排程),輸入告知 Lambda 何時停止執行個體的表達式。
**注意:**Cron 表達式在 UTC 評估。請確保依據您的時區以調整表達式。 - 在 Select targets (選取目標) 頁面上,從Target (目標) 下拉式清單中選擇 Lambda function (Lambda 函數)。
- 針對 Function (函數) 選擇可停止或啟動執行個體的函數。
- 選擇 Skip to review and create (略過以檢閱和建立),然後選擇 Create (建立)。
**注意:**您也可以建立對 AWS 帳戶的事件做出反應的規則。
相關資訊
相關內容
- 已提問 2 個月前lg...
- 已提問 1 年前lg...
- 已提問 1 年前lg...
- 已提問 2 年前lg...
- AWS 官方已更新 2 年前
- AWS 官方已更新 3 年前
- AWS 官方已更新 2 年前
- AWS 官方已更新 2 年前