如何使用 Lambda,按固定间隔停止和启动 Amazon EC2 实例?
我想自动停止和启动 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 实例,请完成以下步骤:
- 为 Lambda 函数创建自定义 AWS Identity and Access Management(IAM)策略和 IAM 角色。
- 创建用于停止和启动 EC2 实例的 Lambda 函数。
- 测试 Lambda 函数。
- 创建按计划运行此函数的 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 角色
-
使用 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": "*" } ] }
-
为 Lambda 创建 IAM 角色。
**重要提示:**向 Lambda 附加权限策略时,务必选择您刚刚创建的 IAM 策略。
**注意:**如果使用由客户自主管理型 AWS Key Management Service(AWS KMS)密钥加密的 Amazon Elastic Block Store(Amazon EBS)卷,请将 kms:CreateGrant 添加到 IAM 策略。
创建用于停止和启动实例的 Lambda 函数
- 打开 Lambda 控制台,然后选择创建函数。
- 选择从头开始创作。
- 在基本信息下,输入以下信息:
在函数名称中,输入一个描述函数的名称,例如“StopEC2Instances”。
对于运行时,选择 Python 3.9。
在权限下,展开更改默认执行角色。
在执行角色下,选择使用现有角色。
在现有角色下,选择 IAM 角色。 - 选择创建函数。
- 在代码选项卡上的代码源下,复制以下代码并将其粘贴到代码编辑器的编辑器窗格的 lambda_function 选项卡中。此代码会停止您标识的实例:
将 us-west-1 替换为您的实例所在的 AWS 区域。将 InstanceIds 替换为要停止和启动的实例的 ID。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))
- 选择部署。
- 在配置选项卡上,依次选择常规配置、编辑。
- 将超时设置为 10 秒,然后选择保存。
注意:(可选)您可以调整 Lambda 函数设置。例如,要停止和启动多个实例,您可能需要使用不同的超时和内存值。 - 重复步骤 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 函数
- 打开 Lambda 控制台,然后选择函数。
- 选择其中一个函数。
- 选择代码选项卡。
- 在代码源部分中,选择测试。
- 在配置测试事件对话框中,选择创建新的测试事件。
- 输入事件名称。然后,选择创建。
**注意:**请勿更改测试事件的 JSON 代码。 - 选择测试,以运行函数。
- 对另一个函数重复步骤 1-7。
检查实例的状态
AWS 管理控制台
在测试之前和之后,请检查实例的状态,以确认您的函数是否正常运行。
CloudTrail
要确认 Lambda 函数是否已停止或启动实例,请使用 AWS CloudTrail 查看事件。
- 打开 CloudTrail 控制台。
- 在导航窗格中,选择事件历史记录。
- 选择查找属性下拉列表,然后选择事件名称。
- 在搜索栏中,输入 StopInstances 以查看结果。然后,输入 StartInstances。
如果没有结果,则说明 Lambda 函数没有停止或启动实例。
创建运行 Lambda 函数的 EventBridge 规则
- 打开 EventBridge 控制台。
- 选择创建规则。
- 为规则输入名称,例如“StopEC2Instances”。(可选)在描述中输入对规则的描述。
- 对于规则类型,选择计划,然后选择在 EventBridge Scheduler 中继续。
- 对于计划模式,选择定期计划。
- 在计划模式下的出现次数中,选择定期计划。
- 对于计划类型,选择计划类型,然后完成下面的步骤:
对于基于速率的计划,输入速率值,然后选择以分钟、小时或天为单位的时间间隔。
-或-
对于基于 cron 的计划,请输入一个表达式来告诉 Lambda 何时停止实例。有关表达式语法的信息,请参阅 Creating an Amazon EventBridge rule that runs on a schedule。
**注意:**Cron 表达式是按 UTC 时间来估算的。务必按照您的时区来调整表达式。 - 在选择目标中,从目标下拉列表中选择 Lambda 函数。
- 对于函数,选择用于停止实例的函数。
- 选择跳至查看,创建,然后选择创建。
- 重复步骤 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 volumes 和 Key policies in AWS KMS。
相关信息
Tutorial: Schedule AWS Lambda functions using EventBridge
相关内容
- AWS 官方已更新 3 年前
- AWS 官方已更新 6 个月前
- AWS 官方已更新 2 年前
- AWS 官方已更新 1 年前