如何使用 Lambda 定期停止和啟動 Amazon EC2 執行個體?

上次更新日期:2022 年 1 月 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.    選擇 AWS 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.    在「設定」索引標籤上,選擇「一般設定」、「編輯」。將「逾時」設定為 10 秒,然後選擇「儲存」。

注意:根據您的使用案例所需來設定 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.    選擇 AWS 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 執行個體的函數。

(可選) 使用 AWS 執行個體排程器來自動化程序

如需更多資訊,請參閲自動啟動和停止 AWS 執行個體