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

3 分的閱讀內容
0

我想自動停止並啟動我的 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體,以減少我的 Amazon EC2 使用量。

簡短描述

使用 AWS Lambda 和 Amazon EventBridge 以自動停止和啟動 EC2 執行個體。

**注意:**下列解決方法是簡單的範例解決方案。如需更進階的解決方案,請使用 AWS 執行個體排程器。如需詳細資訊,請參閱自動啟動和停止 AWS 執行個體

若要使用 Lambda 來定期停止和啟動 EC2 執行個體,請完成下列步驟:

  1. 為 Lambda 函數建立自訂 AWS Identity and Access Management (IAM) 政策和 IAM 角色。
  2. 建立停止和啟動 EC2 執行個體的 Lambda 函數。
  3. 測試 Lambda 函數。
  4. 建立依排程執行函數的 EventBridge 排程
    **注意:**您也可以建立對 AWS 帳戶的事件做出反應的規則

解決方法

**注意:**完成下列步驟後,您可能會收到 Client error on launch 錯誤。如需詳細資訊,請參閱我使用連接的加密執行個體啟動執行個體時,執行個體立即停止並顯示錯誤 "client error on launch"。

取得您想要停止和啟動的 EC2 執行個體 ID。然後,完成下列步驟。

為 Lambda 函數建立 IAM 政策和 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 政策。

**注意:**如果您使用客戶管理的 AWS Key Management Service (KMS) 金鑰加密的 Amazon Elastic Block Store (Amazon EBS) 磁碟區,請將 kms:CreateGrant 新增至 IAM 政策。

建立停止和啟動執行個體的 Lambda 函數

  1. 開啟 Lambda 主控台,然後選擇建立函數
  2. 選擇從頭開始撰寫
  3. 基本資訊下,輸入下列資訊:
    對於函數名稱,輸入描述函數的名稱,例如 "StopEC2Instances"。
    對於執行時期,選擇 Python 3.9
    許可下,展開變更預設執行角色
    執行角色下,選擇使用現有角色
    現有角色下,選擇 IAM 角色。
  4. 選擇建立函數
  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.stop_instances(InstanceIds=instances)
        print('stopped your instances: ' + str(instances))
    使用您的執行個體所在的 AWS 區域取代 us-west-1。將 InstanceIds 取代為您要停止和啟動的執行個體的 ID。
  6. 選擇部署
  7. 組態標籤上,選擇一般組態,然後選擇編輯
  8. 逾時設定為 10 秒,然後選擇儲存
    注意:(選用) 您可以調整 Lambda 函數設定。例如,若要停止和啟動多個執行個體,逾時記憶體可能需要使用不同的值。
  9. 重複步驟 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 函數

  1. 開啟 Lambda 主控台,然後選擇函數
  2. 選擇其中一個函數。
  3. 選擇程式碼標籤。
  4. 程式碼來源區段中,選擇測試
  5. 設定測試事件對話方塊中,選擇建立新測試事件
  6. 輸入事件名稱。然後,選擇建立
    **注意:**請勿變更測試事件的 JSON 程式碼。
  7. 選擇測試以執行該函數。
  8. 對其他函數重複步驟 1-7。

檢查執行個體的狀態

AWS 管理主控台

在測試之前和之後,請檢查執行個體的狀態以確認函數是否正常運作。

CloudTrail

若要確認 Lambda 函數已停止或已啟動執行個體,請使用 AWS CloudTrail 以檢查是否有事件。

  1. 開啟 CloudTrail 主控台
  2. 在導覽窗格中,選取事件歷史記錄
  3. 選擇查詢屬性下拉式清單,然後選擇事件名稱
  4. 在搜尋列中,輸入 StopInstances,以檢閱結果。然後,輸入 StartInstances

如果沒有結果,則 Lambda 函數不會停止或啟動執行個體。

建立可執行 Lambda 函數的 EventBridge 規則

  1. 開啟 EventBridge 主控台
  2. 選取建立規則
  3. 輸入規則的名稱,例如 "StopEC2Instances"。(選用) 在描述中,輸入規則描述。
  4. 規則類型中,選擇排程,然後選擇在 EventBridge 排程器中繼續
  5. 針對排程器模式,選擇定期排程
  6. 排程模式下的發生中,選擇定期排程
  7. 針對排程類型,選擇排程類型,然後完成下列步驟:
    針對依據費率的排程,輸入費率值,然後選擇以分鐘、小時或天為單位的時間間隔。
    -或-
    對於依據 Cron 的排程,輸入表達式,以告知 Lambda 停止執行個體的時間。如需表達式語法的資訊,請參閱建立按排程執行的 Amazon EventBridge 規則
    **注意:**Cron 表達式在 UTC 評估。請確定依據您的時區以調整表達式。
  8. 選取目標中,從目標下拉式清單中選擇 Lambda 函數
  9. 對於函數,選擇停止執行個體的函數。
  10. 選擇略過以檢閱和建立,然後選擇建立
  11. 重複步驟 1-10 以建立規則,然後啟動執行個體。請完成下列步驟:
    輸入規則名稱,例如 "StartEC2Instances"。
    (選用) 在描述中,輸入規則描述,例如「每天上午 7 時啟動 EC2 執行個體」。
    在步驟 7 中,對於 Cron 表達式,輸入表達式以告知 Lambda 啟動執行個體的時間。
    在步驟 9 中,對於函數,選擇可啟動執行個體的函數。

**注意:**有時,Lambda 函數會停止執行個體,並且無法重新啟動。Amazon Elastic Block Store (Amazon EBS) 磁碟區已加密,且 Lambda 角色未授權使用加密金鑰時,就會發生這種情況。如需詳細資訊,請參閱使用加密的磁碟區所需的 AWS KMS key 政策AWS KMS 的金鑰政策

相關資訊

教程: 使用 EventBridge 以排程 AWS Lambda 函數

AWS 服務的事件

將停止動作新增至 Amazon CloudWatch 警示

執行個體購買選項

AWS 官方
AWS 官方已更新 6 個月前