前言

        在使用AWS云平台的过程中,不免会使用到EC2实例的按需收费模式用于部署测试和开发环境等无需24小时运行的情况。这时为了更加经济,希望每天可以设置EC2只在白天运行,晚上则关机减少费用。

        在这里我们以设置EC2实例在每周一至周五的9:00-20:00运行,其余时间关机。即需要实现每天的20:00关闭实例,早上9:00开启实例。

一、创建IAM角色

        创建IAM角色,打开IAM-角色-创建角色,可信实体选择AWS服务,使用案例选择Lambda,点击下一步

云服务器部署自动钉钉 云服务器定时开关机_云服务器部署自动钉钉

         点击创建策略

云服务器部署自动钉钉 云服务器定时开关机_aws_02

点击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": "*"
    }
  ]
}

云服务器部署自动钉钉 云服务器定时开关机_aws_03

        点击下一步,标签可以不用写,继续点击下一步审核

        策略名称和描述可以任意填写,我这里策略名称填写了【LambdaStartStopEC2instances】然后点击创建策略

云服务器部署自动钉钉 云服务器定时开关机_AWS_04

         回到创建角色界面,刷新策略,勾选我们刚刚创建的策略,然后下一步

云服务器部署自动钉钉 云服务器定时开关机_AWS_05

        角色的名称可以任意填写,我这里填写的是【EC2_instance_start_stop】,点击创建。

云服务器部署自动钉钉 云服务器定时开关机_云计算_06

二、创建Lambda函数

        打开lambda控制台,点击控制面板右上角的创建函数按钮,创建第一个关闭EC2实例的函数。

云服务器部署自动钉钉 云服务器定时开关机_云服务器部署自动钉钉_07

        选择从头开始创建,函数名称任取,我的是【StopEC2Instances】

        运行时函数编写语言选择Python,版本看情况,我这里是【Python 3.9】

        更改默认执行角色选择【使用现有角色】,从下面的框中选择我们刚刚在IAM中创建的角色【EC2_instance_start_stop】,然后点击创建函数

云服务器部署自动钉钉 云服务器定时开关机_Python_08

        代码中输入以下内容,注意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))

云服务器部署自动钉钉 云服务器定时开关机_云计算_09

        继续创建开启EC2的函数,函数名【StartEC2Instances】

        运行时函数编写语言选择【Python 3.9】

        更改默认执行角色选择【使用现有角色】,从下面的框中选择我们刚刚在IAM中创建的角色【EC2_instance_start_stop】,然后点击创建函数

云服务器部署自动钉钉 云服务器定时开关机_aws_10

         代码中输入以下内容,注意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))

云服务器部署自动钉钉 云服务器定时开关机_AWS_11

 三、CloudWatch创建规则

        这里我们选择使用AWS新的入口,打开AWS EventBridge服务,点击Scheduler菜单中的【计划】,然后点击创建计划。

云服务器部署自动钉钉 云服务器定时开关机_AWS_12

         计划名称输入【EverydaystopEC2instances】

云服务器部署自动钉钉 云服务器定时开关机_aws_13

        发生次数选择【周期性计划】

        计划类型选择【基础cron的计划】

        Cron表达式按需填写,我这里是设置的每周一至周五的晚上8点关机,所以分钟为0,小时为20,月为*,周中日MON-FRI,年*,月中日和周中日填一个另外一个就会自动变成?,这样就填好了表达式

        弹性时间可以按需选择,我这里直接就关闭了

云服务器部署自动钉钉 云服务器定时开关机_AWS_14

         注意:下面时间范围这里我选择的是上海时间,即指上海时间的20点,选择不同时区上面的时间就不一样了,这里有不同的需求可以按需选择

        然后点击下一步

云服务器部署自动钉钉 云服务器定时开关机_aws_15

         常用API里选择【AWS Lambda Invoke】

云服务器部署自动钉钉 云服务器定时开关机_云计算_16

        Lambda函数选择我们创建的【StopEC2Instances】,然后点击下一步

云服务器部署自动钉钉 云服务器定时开关机_aws_17

        重试策略我直接关闭了(PS:就关个机要啥重试)

        权限这里直接就默认的【为此计划创建新角色】就好了,然后点击下一步

云服务器部署自动钉钉 云服务器定时开关机_AWS_18

        下一步就是检查自己的配置,核对无误后拉到最下面点击创建计划即可

云服务器部署自动钉钉 云服务器定时开关机_云计算_19

        这里就创建好了第一个关机的计划了,我们继续创建下一个开机的计划。

        返回计划面板,点击创建计划

        计划名称【EverydaystartEC2instances】

        计划模式这里还是【周期性计划】-【基于cron的计划】,Cron表达式里,我们填写开机时间为每周一至周五的每天早上9点整。确认下面的时区同样是上海时间后,点击下一步。

云服务器部署自动钉钉 云服务器定时开关机_AWS_20

         常用API里选择【AWS Lambda Invoke】,Lambda函数选择我们创建的【StartEC2Instances】,然后点击下一步

云服务器部署自动钉钉 云服务器定时开关机_aws_21

        同样权限这里还是创建新角色,默认就行,然后下一步

云服务器部署自动钉钉 云服务器定时开关机_云计算_22

        核对信息无误后点击创建计划。

        至此,EC2实例的自动开关机就实现了,如果要验证是否成功的话,可以将计划的关机和开机时间调整为几分钟后,然后等到时候看下EC2实例的状态即可验证。

        另外,在EC2实例中建议做好需要启动服务的开机自启动,这样每天早上实例开启后就可以自行启动服务,无需再手动去进行服务启动调整之类的工作了。