使用AWS re:Post即您表示您同意 AWS re:Post 使用条款

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

3 分钟阅读
0

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

简短描述

使用 Amazon Lambda 和 Amazon EventBridge 来自动停止和启动 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 时间表。

有时,Lambda 函数会停止实例并且无法再次启动该实例。在 Amazon Elastic Block Store (Amazon EBS) 卷已加密且 Lambda 角色未获得使用加密密钥的授权时,会发生这种情况。有关详细信息,请参阅使用加密卷所需的 AWS KMS 密钥策略

解决方法

先决条件:获取您要停止和启动的 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) 卷,则可能需要进行额外的配置。如果使用客户自主管理型 AWS Key Management Service (AWS KMS) 密钥对 Amazon EBS 卷进行加密,请将 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 Scheduler 中继续)。
  6. Schedule pattern(计划模式)的 Occurrence(出现次数)中,选择 Recurring schedule(定期计划)。
  7. 对于 Schedule type(计划类型),选择 rate-based schedule(基于速率的计划)或 cron-based schedule(基于 Cron 的计划),然后完成以下步骤之一:
    对于基于速率的计划,输入速率值,然后选择以分钟、小时或天为单位的时间间隔。
    -or-
    对于 Cron-based schedule(基于 Cron 的计划),请输入一个表达式来告诉 Lambda 何时停止或启动实例。
    **注意:**Cron 表达式是按 UTC 时间来估算的。务必按照您的时区来调整表达式。
  8. Select targets(选择目标)中,从 Target(目标)下拉列表中选择 Lambda 函数
  9. 对于 Function(函数),选择用于停止或启动实例的函数。
  10. 选择 Skip to review and create(跳至查看并创建),然后选择 Create(创建)。

**注意:**您还可以创建对您的 AWS 账户中的事件做出反应的规则

相关信息

教程: 为 AWS Lambda 函数创建 EventBridge 计划的规则

来自 EventBridge 中 AWS 服务的事件

Amazon EC2 账单和购买选项

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