如何使用 EventBridge 调度器定期停止和启动 Amazon EC2 实例?
我想使用 Amazon EventBridge 调度器来自动停止和启动我的 Amazon Elastic Compute Cloud (Amazon EC2) 实例。
简短描述
要自动停止和启动 EC2 实例,请使用 EventBridge 调度器直接调用 StartInstances 和 StopInstances Amazon EC2 API。或者,您可以使用调度器调用 AWS Lambda 函数来停止和启动实例。最佳做法是使用 Amazon EC2 API 作为调度器目标,以避免创建额外的 Lambda 函数。
如需更高级的解决方案,请使用 AWS 的实例调度器。
解决方法
先决条件:获取您要停止和启动的实例的 ID。
使用调度器直接调用 Amazon EC2 API
为 EventBridge 调度器创建 IAM 策略和角色
完成以下步骤:
- 使用 JSON 策略编辑器创建 AWS Identity and Access Management (IAM) 策略,允许 EventBridge 调度器停止和启动您的实例。
策略示例:
**注意:**如果您已使用客户管理型 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 密钥策略)。{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:Start*", "ec2:Stop*" ], "Resource": "*" } ] } - 打开 IAM 控制台。
- 选择 Roles(角色),然后选择 Create role(创建角色)。
- 对于 Trusted entity type(可信实体类型),选择 Custom Trust Policy(自定义信任策略)。
- 创建以下 IAM 策略:
**注意:**请将 AWS_ACCOUNT_ID 替换为您的 AWS 账户 ID。{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "scheduler.amazonaws.com" }, "Action": "sts:AssumeRole", "Condition": { "StringEquals": { "aws:SourceAccount": "AWS_ACCOUNT_ID" } } } ] } - 选择 Next(下一步)。
- 对于 Permissions policies(权限策略),选择您在步骤 1 中创建的 IAM 策略。
- 对于 Role name(角色名称),输入诸如 EventBridge_Scheduler_Role 之类的名称。
- 选择 Create role(创建角色)。
创建 EventBridge 调度器计划
为 StopInstances API 创建一个计划,为 StartInstances API 创建另一个计划。创建计划时,配置以下设置:
- 对于 Target API(目标 API),选择 All APIs(所有 API),然后搜索 Amazon EC2。
- 选择 StopInstances 或 StartInstances,然后输入实例 ID。
- 对于 Settings - optional(设置 - 可选),在 Permissions(权限)下,选择 Select an existing role(选择现有角色),然后选择您创建的 IAM 角色。
使用调度器调用 Lambda 函数
为 Lambda 函数创建 IAM 策略和角色
完成以下步骤:
- 使用 JSON 策略编辑器创建 IAM 策略,允许 Lambda 停止和启动实例。
策略示例:
**注意:**如果您使用通过客户管理型 AWS KMS 密钥加密的 Amazon EBS 卷,请将 kms:CreateGrant 添加到策略中。如果 Lambda 函数无权访问加密密钥,则只能停止实例,但不能重启。有关详细信息,请参阅 Required AWS KMS key policy for use with encrypted volumes(使用加密卷所需的 AWS KMS 密钥策略)。{ "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": "*" } ] } - 为 Lambda 创建 IAM 角色。
- 将 IAM 策略附加到 IAM 角色。
创建 Lambda 函数来停止和启动实例
完成以下步骤:
- 打开 Lambda 控制台。
- 选择 Create function(创建函数),然后选择 Author from scratch(从头开始创作)。
- 对于 Basic information(基本信息),请配置以下设置:
在 Function name(函数名称)中,输入一个描述函数的名称,例如 StopEC2Instances 或 StartEC2Instances。
对于 Runtime(运行时),选择 Python 3.14。
在 Permissions(权限)下,展开 Change default execution role(更改默认执行角色)。
在 Execution role(执行角色)下,选择 Use an existing role(使用现有角色)。
在 Existing role(现有角色)下,选择您创建的 IAM 角色。 - 选择 Create function(创建函数)。
- 选择 Code(代码)选项卡,然后选择 lambda_funciton.py 选项卡。
- 对于 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))
**注意:**请将 us-west-1 替换为实例的 AWS 区域,将 i-12345acdb12345abcd 替换为实例的 ID。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)) - 选择 Deploy(部署)。
- 选择 Configuration(配置)选项卡,然后选择 General configuration(常规配置)。
- 选择 Edit(编辑)。
- 对于 Timeout(超时),选择 10 秒,然后选择 Save(保存)。
**注意:**如果您已将函数与 Amazon Virtual Private Cloud (Amazon VPC) 相关联,请验证函数是否可以通过互联网到达 Amazon EC2 端点。或者,为 Amazon EC2 配置虚拟私有云 (VPC) 端点。
测试 Lambda 函数
测试 Lambda 函数是否可用于实例停止和实例启动。
在您运行测试之前和之后,请检查实例的状态,以确认您的函数是否正常运行。
要使用 AWS CloudTrail 确认 Lambda 函数已停止或启动实例,请完成以下步骤:
- 打开 CloudTrail 控制台。
- 在导航窗格中,选择 Event history(事件历史记录)。
- 在 Lookup attributes(查找属性)下拉列表中,选择 Event name(事件名称)。
- 在搜索栏中,输入 StopInstances 以查看结果。然后,输入 StartInstances。
**注意:**如果没有结果,则说明 Lambda 函数没有停止或启动实例。
创建 EventBridge 调度器计划来运行 Lambda 函数
创建计划来运行 Lambda 函数。对于 Select target(选择目标),选择 Templated targets(模板化目标),然后选择 AWS Lambda Invoke。使用您创建的 Lambda 函数。
- 语言
- 中文 (简体)

This article was reviewed and updated on 2026-01-22.
