跳至內容

如何使用 EventBridge 排程器定期停止和啟動 Amazon EC2 執行個體?

3 分的閱讀內容
1

我想使用 Amazon EventBridge 排程器自動停止和啟動我的 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體。

簡短說明

若要自動停止和啟動 EC2 執行個體,請使用 EventBridge 排程器直接呼叫 StartInstancesStopInstances Amazon EC2 API。或者,您可以使用排程器來調用 AWS Lambda 函式以停止和啟動執行個體。使用 Amazon EC2 API 作為排程器目標是最佳實務,這樣可以避免建立額外的 Lambda 函式。

若要尋求更進階的解決方案,請使用 AWS 上的 Instance Scheduler

解決方法

先決條件:取得您想要停止和啟動的執行個體 ID

使用排程器直接呼叫 Amazon EC2 API

**為 EventBridge 排程器建立 IAM 政策和角色 **

請完成下列步驟:

  1. 使用 JSON 政策編輯器建立 AWS Identity and Access Management (IAM) 政策,讓 EventBridge 排程器可以停止和啟動您的執行個體。
    政策範例:
    {    
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "ec2:Start*",
                    "ec2:Stop*"
                ],
                "Resource": "*"
            }
        ]
    }
    **注意:**如果您使用客戶受管 AWS Key Management Service (KMS) 金鑰加密的 Amazon Elastic Block Store (Amazon EBS) 磁碟區,請將 kms:CreateGrant 新增至該政策。如果 Lambda 函式沒有加密金鑰的存取權,則只能停止而無法重新啟動執行個體。如需更多資訊,請參閱 Required AWS KMS key policy for use with encrypted volumes (與加密磁碟區搭配使用的必要 AWS KMS key 政策)。
  2. 開啟 IAM 主控台
  3. 選擇 Roles (角色),然後選擇 Create role (建立角色)。
  4. Trusted entity type (受信任實體類型) 中,選擇 Custom trust policy (自訂信任政策)。
  5. 輸入下列 IAM 政策:
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": {
                    "Service": "scheduler.amazonaws.com"
                },
                "Action": "sts:AssumeRole",
                "Condition": {
                    "StringEquals": {
                        "aws:SourceAccount": "AWS_ACCOUNT_ID"
                    }
                }
            }
        ]
    }
    **注意:**請將 AWS_ACCOUNT_ID 替換為您的 AWS 帳戶 ID。
  6. 選擇 Next (下一步)。
  7. 針對 Permissions policies (許可政策),選取您在步驟 1 中建立的 IAM 政策。
  8. 針對 Role name (角色名稱),輸入名稱,例如 EventBridge_Scheduler_Role
  9. 選擇 Create role (建立角色)。

建立 EventBridge 排程器排程

StopInstances API 建立一個排程,並為 StartInstances API 建立另一個排程。建立排程時,請採用下列設定:

  • 針對 Target API (目標 API),選取 All APIs (所有 API),然後搜尋 Amazon EC2
  • 選取 StopInstancesStartInstances,然後輸入執行個體 ID。
  • 針對 Settings - optional (設定 – 選用),在 Permissions (許可) 下選擇 Select an existing role (選取現有角色),然後選擇您建立的 IAM 角色。

使用排程器調用 Lambda 函式

為 Lambda 函式建立 IAM 政策和角色

請完成下列步驟:

  1. 使用 JSON 政策編輯器建立 IAM 政策,以允許 Lambda 停止和啟動執行個體。
    政策範例:
    {    "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": "*"
            }
        ]
    }
    **注意:**如果您使用客戶受管 AWS KMS key 加密的 Amazon EBS 磁碟區,請將 kms:CreateGrant 新增至該政策。如果 Lambda 函式沒有加密金鑰的存取權,則只能停止而無法重新啟動執行個體。如需更多資訊,請參閱 Required AWS KMS key policy for use with encrypted volumes (與加密磁碟區搭配使用的必要 AWS KMS key 政策)。
  2. 為 Lambda 建立 IAM 角色
  3. 將 IAM 政策附加至 IAM 角色

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

請完成下列步驟:

  1. 開啟 Lambda 主控台
  2. 選擇 Create function (建立函式),然後選擇 Author from scratch (從頭開始撰寫)。
  3. Basic information (基本資訊) 下,採用下列設定:
    針對 Function name (函式名稱),輸入能夠描述函式的名稱,例如 StopEC2InstancesStartEC2Instances
    Runtime (執行時期) 請選擇 Python 3.14
    Permissions (許可) 下,展開 Change default execution role (變更預設執行角色)。
    Execution role (執行角色) 下,選擇 Use an existing role (使用現有角色)。
    Existing role (現有角色) 下,選擇您建立的 IAM 角色。
  4. 選擇 Create function (建立函式)。
  5. 選擇 Code (程式碼) 索引標籤,然後選擇 lambda_function.py 索引標籤。
  6. 針對 Code source (程式碼來源),在程式碼編輯器中輸入下列程式碼以設定執行個體停止:
    import boto3  
    region = 'us-west-1'
    instances = ['i-12345acdb12345abcd', 'i-12345acdb12345abcd']
    ec2 = boto3.client('ec2', region_name=region)
    
    def lambda_handler(event, context):
        ec2.stop_instances(InstanceIds=instances)
        print('stopped your instances: ' + str(instances))
    若要設定執行個體啟動,請在程式碼編輯器中輸入下列程式碼:
    import boto3  
    region = 'us-west-1'
    instances = ['i-12345acdb12345abcd', 'i-12345acdb12345abcd']
    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 區域,並將 i-12345acdb12345abcd 替換為您的執行個體 ID。
  7. 選擇 Deploy (部署)。
  8. 選擇 Configuration (組態) 索引標籤,然後選擇 General configuration (一般組態)。
  9. 選擇 Edit (編輯)。
  10. 針對 Timeout (逾時),選取 10 seconds (10 秒),然後選擇 Save (儲存)。

**注意:**如果您將該函式與 Amazon Virtual Private Cloud (Amazon VPC) 建立關聯,請確認函式是否可以透過網際網路連線至 Amazon EC2 端點。或者,為 Amazon EC2 設定虛擬私有雲端 (VPC) 端點

測試 Lambda 函式

針對執行個體停止和執行個體啟動測試 Lambda 函式

在執行測試前後,請檢查執行個體的狀態,確認函式正常運作。

若要使用 AWS CloudTrail 確認 Lambda 函式已停止或啟動執行個體,請完成下列步驟:

  1. 開啟 CloudTrail 主控台
  2. 在導覽窗格中,選擇 Event history (事件歷史記錄)。
  3. Lookup attributes (查詢屬性) 下拉式清單中,選擇 Event name (事件名稱)。
  4. 在搜尋列中,輸入 StopInstances 以檢閱結果,接著輸入 StartInstances
    **注意:**如果沒有結果,則 Lambda 函式不會停止或啟動執行個體。

建立 EventBridge 排程器排程以執行 Lambda 函式

建立排程以執行您的 Lambda 函式。針對 Select target (選取目標),選擇 Templated targets (範本化目標),然後選擇 AWS Lambda Invoke (AWS Lambda 調用)。使用您建立的 Lambda 函式。