如何使用 Lambda 按固定间隔停止和启动 Amazon EC2 实例?
我想自动停止和启动 Amazon Elastic Compute Cloud(Amazon EC2)实例,以减少 Amazon EC2 使用量。
简短描述
使用 Amazon Lambda 和 Amazon EventBridge 来自动停止和启动 EC2 实例。
**注意:**以下解决方法是一种比较简单的示例解决方案。如需更高级的解决方案,请使用 AWS 的 Instance Scheduler。有关详细信息,请参阅 Automate starting and stopping AWS instances。
要使用 Lambda 按固定间隔停止和启动 EC2 实例,请完成以下步骤:
- 为 Lambda 函数创建自定义 AWS Identity and Access Management(IAM)策略和 IAM 角色。
- 创建用于停止和启动 EC2 实例的 Lambda 函数。
- 测试 Lambda 函数。
- 创建按计划运行此函数的 EventBridge 时间表。
有时,Lambda 函数会停止实例并且无法再次启动该实例。在 Amazon Elastic Block Store (Amazon EBS) 卷已加密且 Lambda 角色未获得使用加密密钥的授权时,会发生这种情况。有关详细信息,请参阅使用加密卷所需的 AWS KMS 密钥策略。
解决方法
先决条件:获取您要停止和启动的 EC2 实例的 ID。
为 Lambda 函数创建 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 角色。
**注意:**如果您使用 Amazon Elastic Block Store (Amazon EBS) 卷,则可能需要进行额外的配置。如果使用客户自主管理型 AWS Key Management Service (AWS KMS) 密钥对 Amazon EBS 卷进行加密,请将 kms:CreateGrant 添加到 IAM 策略中。
创建用于停止和启动实例的 Lambda 函数
完成以下步骤:
-
打开 Lambda 控制台,然后选择 Create function(创建函数)。
-
选择从头开始创作。
-
在基本信息下,输入以下信息:
在 Function name(函数名称)中,输入一个描述函数的名称,例如 StopEC2Instances 或 StartEC2Instances。
对于运行时,选择 Python 3.9。
在权限下,展开更改默认执行角色。
在执行角色下,选择使用现有角色。
在现有角色下,选择 IAM 角色。 -
选择 Create function(创建函数)。
-
选择 Code(代码)选项卡。
-
在 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。
-
选择 Deploy(部署)。
-
在配置选项卡上,依次选择常规配置、编辑。
-
将 Timeout(超时)设置为 10 秒,然后选择 Save(保存)。
测试 Lambda 函数
完成以下步骤:
- 打开 Lambda 控制台,然后选择 Functions(函数)。
- 选择其中一个函数。
- 选择代码选项卡。
- 在代码源部分中,选择测试。
- 在 Configure test event(配置测试事件)对话框中,选择 Create new test event(创建新的测试事件)。
- 输入事件名称,然后选择 Create(创建)。
**注意:**请勿更改测试事件的 JSON 代码。 - 选择测试,以运行函数。
- 对另一个函数重复步骤 1-7。
检查实例的状态
Amazon EC2 控制台
在测试之前和之后,请检查实例的状态,以确认您的函数是否正常运行。
CloudTrail
您也可以使用 AWS CloudTrail 来确认 Lambda 函数是否已停止或启动实例。
完成以下步骤:
- 打开 CloudTrail 控制台。
- 在导航窗格中,选择 Event history(事件历史记录)。
- 在 Lookup attributes(查找属性)下拉列表中,选择 Event name(事件名称)。
- 在搜索栏中,输入 StopInstances 以查看结果。然后,输入 StartInstances。
如果没有结果,则说明 Lambda 函数没有停止或启动实例。
创建运行 Lambda 函数的 EventBridge 规则
完成以下步骤:
- 打开 EventBridge 控制台。
- 选择 Create rule(创建规则)。
- 输入规则的名称,例如 StopEC2Instances 或 StartEC2Instances。
- (可选)对于 Description(描述),输入规则的描述。
- 对于 Rule type(规则类型),选择 Schedule(计划),然后选择 Continue in EventBridge Scheduler(在 EventBridge Scheduler 中继续)。
- 在 Schedule pattern(计划模式)的 Occurrence(出现次数)中,选择 Recurring schedule(定期计划)。
- 对于 Schedule type(计划类型),选择 rate-based schedule(基于速率的计划)或 cron-based schedule(基于 Cron 的计划),然后完成以下步骤之一:
对于基于速率的计划,输入速率值,然后选择以分钟、小时或天为单位的时间间隔。
-or-
对于 Cron-based schedule(基于 Cron 的计划),请输入一个表达式来告诉 Lambda 何时停止或启动实例。
**注意:**Cron 表达式是按 UTC 时间来估算的。务必按照您的时区来调整表达式。 - 在 Select targets(选择目标)中,从 Target(目标)下拉列表中选择 Lambda 函数。
- 对于 Function(函数),选择用于停止或启动实例的函数。
- 选择 Skip to review and create(跳至查看并创建),然后选择 Create(创建)。
**注意:**您还可以创建对您的 AWS 账户中的事件做出反应的规则。
相关信息
相关内容
- AWS 官方已更新 2 年前
- AWS 官方已更新 3 年前
- AWS 官方已更新 2 年前
- AWS 官方已更新 2 年前