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

3 分钟阅读
0

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

简短描述

您可以使用 AWS Lambda 和 Amazon EventBridge 自动停止及启动 EC2 实例。

**注意:**以下解决方法是一个简单解决方案。要获得更高级的解决方案,请使用 AWS 实例调度器。有关更多信息,请参阅自动启动和停止 AWS 实例

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

1.    为 Lambda 函数创建自定义 AWS Identity and Access Management (IAM) 策略和执行角色。

2.    创建停止和启动 EC2 实例的 Lambda 函数。

3.    测试 Lambda 函数。

4.    创建按计划运行函数的 EventBridge 规则
**注意:**您还可以创建对您的 AWS 账户中发生的事件做出反应的规则

解决方法

**注意:**如果您在完成以下步骤后,收到 Client error on launch(启动时出现客户端错误)错误,请参阅当我启动附加了加密卷的实例时,实例立即停止并显示“client error on launch(启动时出现客户端错误)”错误

获取要停止和启动的 EC2 实例的 ID。然后,请按照以下步骤执行操作。

为 Lambda 函数创建 IAM policy 和执行角色

1.    使用 JSON 策略编辑器创建 IAM policy。复制以下 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 policy。

创建停止和启动 EC2 实例的 Lambda 函数

1.    打开 Lambda 控制台,然后选择 Create function(创建函数)。

2.    选择从头开始创作

3.    在 Basic information(基本信息)下,添加以下信息:

对于 Function name(函数名称),输入一个名称,将其标识为用于停止 EC2 实例的函数。例如,“StopEC2Instances”。
对于 Runtime(运行时),选择 Python 3.9
权限下,展开更改原定设置执行角色
执行角色下,选择使用现有角色
现有角色下,选择所创建的 IAM 角色。

4.    选择创建函数

5.    在 Code(代码)、Code source(代码源)下,将以下代码复制并粘贴到代码编辑器的编辑器窗格中:(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))

**重要提示:**对于 region(区域),将“us-west-1”替换为您的实例所在的 AWS 区域。对于 instances (实例),将示例 EC2 实例 ID 替换为要停止和启动的特定实例的 ID。

6.    选择 Deploy(部署)。

7.    在 Configuration(配置)选项卡中,选择 General configuration(常规配置)、Edit(编辑)。将 Timeout(超时)设为 10 秒,然后选择 Save(保存)。

**注意:**根据您的使用案例需要配置 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))

**重要提示:**对于 region(区域)和 instances(实例),请使用与您用于停止 EC2 实例的代码的相同的值。

测试 Lambda 函数

1.    打开 Lambda 控制台,然后选择 Functions(函数)。

2.    选择您创建的函数之一。

3.    选择 Code(代码)选项卡。

4.    在 Code source(代码源)部分中,选择 Test(测试)。

5.    在配置测试事件对话框中,选择创建新测试事件

6.    输入 Event name(事件名称)。 然后,选择 Create(创建)。

**注意:**不要更改测试事件的 JSON 代码。该函数不使用它。

7.    选择 Test(测试)以运行该函数。

8.    对您创建的另一个函数重复步骤 1-7。

检查 EC2 实例的状态

AWS 管理控制台

您可以在测试前后检查 EC2 实例的状态,以确认函数是否按预期工作。

AWS CloudTrail

您可以使用 CloudTrail 检查事件,以确认 Lambda 函数已停止或已启动 EC2 实例。

1.    打开 CloudTrail 控制台

2.    在导航窗格中,选择事件历史记录

3.    选择 Lookup attributes(查找属性)下拉列表,然后选择 Event name(事件名称)。

4.    在搜索栏中,输入 StopInstances 以查看结果。

5.     在搜索栏中,输入 StartInstances 以查看结果。

如果没有结果,则 Lambda 函数没有停止或启动 EC2 实例。

创建运行您的 Lambda 函数的 EventBridge 规则

1.    打开 EventBridge 控制台

2.    选择创建规则

3.    输入规则的 Name(名称),如“StopEC2Instances”。(可选)在 Description(描述)中,输入规则的描述。

4.    对于 Rule type(规则类型),选择 Schedule(计划),然后在 EventBridge 调度器中选择 Continue(继续)。

5.    对于“Schedule pattern”(计划模式),选择 Recurring schedule(定期计划)。完成以下步骤之一:

Schedule pattern(计划模式)下,对于 Occurrence(发生),选择 Recurring schedule(定期计划)。然后完成以下步骤之一:
Schedule type(计划类型)为 Rate-based schedule(基于费率的计划)时,对于 Rate expression(费率表达式),输入费率值,然后选择以分钟、小时或天为单位的时间间隔。
Schedule type(计划类型)为 Cron-based schedule(基于 Cron 的计划)时,对 Cron expression(Cron 表达式),输入指示 Lambda 何时停止您的实例的表达式。有关表达式语法的信息,请参阅规则的计划表达式
**注意:**Cron 表达式使用 UTC 进行计算。确保针对您的首选时区调整表达式。

6.    在 Select targets(选择目标)中,从 Target(目标)下拉列表中选择 Lambda function(Lambda 函数)。

7.    对于函数,选择停止您的 EC2 实例的函数。

8.    选择 Skip to review and create(跳到查看并创建),然后选择 Create(创建)。

9.    重复步骤 1-8 以创建启动 EC2 实例的规则。以不同方式完成以下步骤:

输入规则的名称,如“StartEC2Instances”。
(可选)在 Description(描述)中,输入规则的描述,如“每天早晨 7 点启动 EC2 实例”。
在步骤 5 中,对于 Cron expression(Cron 表达式),输入指示 Lambda 何时启动您的实例的表达式。
在步骤 7 中,对于 Function(函数),选择启动您的 EC2 实例的函数。


相关信息

教程:使用 EventBridge 计划 Lambda 函数

来自 AWS 服务的事件

向 Amazon CloudWatch 告警添加停止操作

已计划的预留实例

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