跳至内容

如何使用 EventBridge 调度器定期停止和启动 Amazon EC2 实例?

3 分钟阅读
0

我想使用 Amazon EventBridge 调度器来自动停止和启动我的 Amazon Elastic Compute Cloud (Amazon EC2) 实例。

简短描述

要自动停止和启动 EC2 实例,请使用 EventBridge 调度器直接调用 StartInstancesStopInstances Amazon EC2 API。或者,您可以使用调度器调用 AWS Lambda 函数来停止和启动实例。最佳做法是使用 Amazon EC2 API 作为调度器目标,以避免创建额外的 Lambda 函数。

如需更高级的解决方案,请使用 AWS 的实例调度器

解决方法

先决条件:获取您要停止和启动的实例的 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 (AWS KMS) 密钥加密 Amazon Elastic Block Store (Amazon EBS) 卷,请将 kms:CreateGrant 添加到策略中。如果 Lambda 函数无权访问加密密钥,则只能停止实例,但不能重启。有关详细信息,请参阅 Required AWS KMS key policy for use with encrypted volumes(使用加密卷所需的 AWS KMS 密钥策略)。
  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 密钥加密的 Amazon EBS 卷,请将 kms:CreateGrant 添加到策略中。如果 Lambda 函数无权访问加密密钥,则只能停止实例,但不能重启。有关详细信息,请参阅 Required AWS KMS key policy for use with encrypted volumes(使用加密卷所需的 AWS KMS 密钥策略)。
  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_funciton.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 秒,然后选择 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。使用您创建的 Lambda 函数。