如何使用 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 排程。

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

解決方法

先決條件: 取得您想要停止和啟動的 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 角色

  3. 將 IAM 政策附加至 IAM 角色

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

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

完成下列步驟:

  1. 開啟 Lambda 主控台,然後選擇 Create function (建立函數)。

  2. 選擇從頭開始撰寫

  3. 基本資訊下,輸入下列資訊:
    對於 Function name (函數名稱),輸入能夠描述函數的名稱,例如 StopEC2InstancesStartEC2Instances
    對於執行時期,選擇 Python 3.9
    許可下,展開變更預設執行角色
    執行角色下,選擇使用現有角色
    現有角色下,選擇 IAM 角色。

  4. 選擇 Create function (建立函數)。

  5. 選擇 Code (程式碼) 標籤。

  6. 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。

  7. 選擇 Deploy (部署)。

  8. 組態標籤上,選擇一般組態,然後選擇編輯

  9. Timeout (逾時) 設定為 10 秒,然後選擇 Save (儲存)。

測試 Lambda 函數

完成下列步驟:

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

檢查執行個體的狀態

Amazon EC2 主控台

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

CloudTrail

您也可以使用 AWS CloudTrail 以確認 Lambda 函數是否已停止或已啟動執行個體。

完成下列步驟:

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

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

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

完成下列步驟:

  1. 開啟 EventBridge 主控台
  2. 選擇 Create rule (建立規則)。
  3. 輸入規則的名稱,例如 StopEC2InstancesStartEC2Instances
  4. (選用) 對於 Description (描述),請輸入規則的描述。
  5. Rule type (規則類型) 中,選擇 Schedule (排程),然後選擇 Continue in EventBridge Scheduler (在 EventBridge 排程器中繼續)。
  6. Schedule pattern (排程模式) 下的 Occurrence (發生) 中,選擇 Recurring schedule (定期排程)。
  7. 針對 Schedule type (排程類型),選擇 rate-based schedule (依據費率的排程) 或 cron-based schedule (依據 Cron 的排程),然後完成下列其中一個步驟:
    針對 Rate-based schedule (依據費率的排程),輸入費率值,然後選擇以分鐘、小時或天為單位的時間間隔。
    -或-
    針對 Cron-based schedule (依據 Cron 的排程),輸入告知 Lambda 何時停止執行個體的表達式。
    **注意:**Cron 表達式在 UTC 評估。請確保依據您的時區以調整表達式。
  8. Select targets (選取目標) 頁面上,從Target (目標) 下拉式清單中選擇 Lambda function (Lambda 函數)。
  9. 針對 Function (函數) 選擇可停止或啟動執行個體的函數。
  10. 選擇 Skip to review and create (略過以檢閱和建立),然後選擇 Create (建立)。

**注意:**您也可以建立對 AWS 帳戶的事件做出反應的規則

相關資訊

教學課程: 為 AWS Lambda 函數建立 EventBridge 排程規則

EventBridge 內 AWS 服務的事件

Amazon EC2 計費和購買選項

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