前言
在使用AWS云平台的过程中,不免会使用到EC2实例的按需收费模式用于部署测试和开发环境等无需24小时运行的情况。这时为了更加经济,希望每天可以设置EC2只在白天运行,晚上则关机减少费用。
在这里我们以设置EC2实例在每周一至周五的9:00-20:00运行,其余时间关机。即需要实现每天的20:00关闭实例,早上9:00开启实例。
一、创建IAM角色
创建IAM角色,打开IAM-角色-创建角色,可信实体选择AWS服务,使用案例选择Lambda,点击下一步
点击创建策略
点击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": "*"
}
]
}
点击下一步,标签可以不用写,继续点击下一步审核
策略名称和描述可以任意填写,我这里策略名称填写了【LambdaStartStopEC2instances】然后点击创建策略
回到创建角色界面,刷新策略,勾选我们刚刚创建的策略,然后下一步
角色的名称可以任意填写,我这里填写的是【EC2_instance_start_stop】,点击创建。
二、创建Lambda函数
打开lambda控制台,点击控制面板右上角的创建函数按钮,创建第一个关闭EC2实例的函数。
选择从头开始创建,函数名称任取,我的是【StopEC2Instances】
运行时函数编写语言选择Python,版本看情况,我这里是【Python 3.9】
更改默认执行角色选择【使用现有角色】,从下面的框中选择我们刚刚在IAM中创建的角色【EC2_instance_start_stop】,然后点击创建函数
代码中输入以下内容,注意region填自己EC2所在的区域,我这里是东京(ap-northeast-1),instances里面填EC2实例的ID,有多个EC2的话,使用","逗号分开。
修改完成后点击【Deploy】保存。
import boto3
region = 'ap-northeast-1'
instances = ['i-xxxxxxEC2实例ID1','i-xxxxxxEC2实例ID2']
ec2 = boto3.client('ec2', region_name=region)
def lambda_handler(event, context):
ec2.stop_instances(InstanceIds=instances)
print('stopped your instances: ' + str(instances))
继续创建开启EC2的函数,函数名【StartEC2Instances】
运行时函数编写语言选择【Python 3.9】
更改默认执行角色选择【使用现有角色】,从下面的框中选择我们刚刚在IAM中创建的角色【EC2_instance_start_stop】,然后点击创建函数
代码中输入以下内容,注意region填自己EC2所在的区域,我这里是东京(ap-northeast-1),instances里面填EC2实例的ID,有多个EC2的话,使用","逗号分开。
修改完成后点击【Deploy】保存。
import boto3
region = 'ap-northeast-1'
instances = ['i-xxxxxxEC2实例ID1','i-xxxxxxEC2实例ID2']
ec2 = boto3.client('ec2', region_name=region)
def lambda_handler(event, context):
ec2.start_instances(InstanceIds=instances)
print('started your instances: ' + str(instances))
三、CloudWatch创建规则
这里我们选择使用AWS新的入口,打开AWS EventBridge服务,点击Scheduler菜单中的【计划】,然后点击创建计划。
计划名称输入【EverydaystopEC2instances】
发生次数选择【周期性计划】
计划类型选择【基础cron的计划】
Cron表达式按需填写,我这里是设置的每周一至周五的晚上8点关机,所以分钟为0,小时为20,月为*,周中日MON-FRI,年*,月中日和周中日填一个另外一个就会自动变成?,这样就填好了表达式
弹性时间可以按需选择,我这里直接就关闭了
注意:下面时间范围这里我选择的是上海时间,即指上海时间的20点,选择不同时区上面的时间就不一样了,这里有不同的需求可以按需选择
然后点击下一步
常用API里选择【AWS Lambda Invoke】
Lambda函数选择我们创建的【StopEC2Instances】,然后点击下一步
重试策略我直接关闭了(PS:就关个机要啥重试)
权限这里直接就默认的【为此计划创建新角色】就好了,然后点击下一步
下一步就是检查自己的配置,核对无误后拉到最下面点击创建计划即可
这里就创建好了第一个关机的计划了,我们继续创建下一个开机的计划。
返回计划面板,点击创建计划
计划名称【EverydaystartEC2instances】
计划模式这里还是【周期性计划】-【基于cron的计划】,Cron表达式里,我们填写开机时间为每周一至周五的每天早上9点整。确认下面的时区同样是上海时间后,点击下一步。
常用API里选择【AWS Lambda Invoke】,Lambda函数选择我们创建的【StartEC2Instances】,然后点击下一步
同样权限这里还是创建新角色,默认就行,然后下一步
核对信息无误后点击创建计划。
至此,EC2实例的自动开关机就实现了,如果要验证是否成功的话,可以将计划的关机和开机时间调整为几分钟后,然后等到时候看下EC2实例的状态即可验证。文章来源:https://www.toymoban.com/news/detail-675840.html
另外,在EC2实例中建议做好需要启动服务的开机自启动,这样每天早上实例开启后就可以自行启动服务,无需再手动去进行服务启动调整之类的工作了。文章来源地址https://www.toymoban.com/news/detail-675840.html
到了这里,关于AWS EC2定时开关机(lambda+cloudwatch实现)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!