如何使用 Lambda,按固定间隔停止和启动 Amazon EC2 实例?

3 分钟阅读
0

我想自动停止和启动 Amazon Elastic Compute Cloud(Amazon EC2)实例,以减少 Amazon EC2 使用量。

简短描述

使用 AWS Lambda 和 Amazon EventBridge 来自动停止和启动 Amazon EC2 实例。

**注意:**以下解决方法是一种比较简单的解决方案。如需更高级的解决方案,请使用 AWS Instance Scheduler。有关更多信息,请参阅 Automate starting and stopping AWS instances

要使用 Lambda 按固定间隔停止和启动 EC2 实例,请完成以下步骤:

  1. 为 Lambda 函数创建自定义 AWS Identity and Access Management(IAM)策略和 IAM 角色。
  2. 创建用于停止和启动 EC2 实例的 Lambda 函数。
  3. 测试 Lambda 函数。
  4. 创建按计划运行此函数的 EventBridge 时间表
    **注意:**您还可以创建对您的 AWS 账户中的事件做出反应的规则

解决方案

**注意:**完成下面的步骤后,您可能会遇到 Client error on launch 错误。有关更多信息,请参阅 When I start my instance with encrypted volumes attached, the instance immediately stops with the error "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(AWS 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))
    us-west-1 替换为您的实例所在的 AWS 区域。将 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 Scheduler 中继续
  5. 对于计划模式,选择定期计划
  6. 计划模式下的出现次数中,选择定期计划
  7. 对于计划类型,选择计划类型,然后完成下面的步骤:
    对于基于速率的计划,输入速率值,然后选择以分钟、小时或天为单位的时间间隔。
    -或-
    对于基于 cron 的计划,请输入一个表达式来告诉 Lambda 何时停止实例。有关表达式语法的信息,请参阅 Creating an Amazon EventBridge rule that runs on a schedule
    **注意:**Cron 表达式是按 UTC 时间来估算的。务必按照您的时区来调整表达式。
  8. 选择目标中,从目标下拉列表中选择 Lambda 函数
  9. 对于函数,选择用于停止实例的函数。
  10. 选择跳至查看,创建,然后选择创建
  11. 重复步骤 1-10,以创建用于启动实例的规则。完成下面的步骤:
    为规则输入一个名称,例如“StartEC2Instances”。
    (可选)在描述中,输入对规则的描述,例如“每天早上 7 点启动 EC2 实例”。
    在步骤 7 中,对于 Cron 表达式,输入一个表达式来告知 Lambda 何时启动实例。
    在步骤 9 中,对于函数,选择用于启动实例的函数。

**注意:**有时,Lambda 函数会停止实例并且无法再次启动该实例。在 Amazon Elastic Block Store(Amazon EBS)卷已加密且 Lambda 角色未获得使用加密密钥的授权时,会发生这种情况。有关更多信息,请参阅 Required AWS KMS key policy for use with encrypted volumesKey policies in AWS KMS

相关信息

Tutorial: Schedule AWS Lambda functions using EventBridge

Events from AWS services

Adding stop actions to Amazon CloudWatch alarms

Instance purchasing options

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