如果我们手上有一些脚本,如爬虫或者其他一些网页自动化的脚本,需要每天在固定的时间自动执行,一个好的办法是将脚本托管的云端,这样就不需要我们每天定时打开自己的电脑来运行它。

这么一来,费用将会是一个问题。因为如果我们的云端实例一直处于运行状态,那么厂商将向我们收取不菲的费用。而我们的脚本显然不需要数小时的运行,往往几分钟即可完成任务。所以,我们可以采取以下解决方案:

  1. 每天定时启动、关闭云端实例。
  2. 在实例运行的时间窗口,自动运行脚本。

这样,假设我们每天的运行窗口为10分钟,使用 AWS t2.micro 实例,拥有750小时免费时间,我们就可拥有 750 * 6 / 10 = 450 天的免费运行。

准备

我们将要用到的AWS的服务包括:

  1. EC2, 即云端虚拟机,将用于运行我们的脚本。
  2. Lambda, 用于操作我们的EC2实例,即启动和关闭。
  3. IAM, AWS Identity and Access Management, 用于赋予Lambda函数操作我们EC2实例的权限。
  4. Cloud Watch, 用于定时执行我们的Lambda函数,达到定时开关机的效果。

以上是定时启动和关闭云端实例所需要的服务,至于在机器启动时自动运行脚本,我们只需使用Linux自带的crontab定时任务即可完成。

EC2



在EC2的主控台点击Lanch Instance, 根据步骤配置好虚拟机。当 Instance State显示为running则表示机器在运行。接下来,我们要为这台机器配置Lambda函数。

IAM

我们先为Lambda函数创建IAM角色,然后再编写Lambda函数,因为之后创建Lambda函数时要求角色已经创建好。

创建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": "*"    }  ]}

点击 检阅政策 然后为其取名和填写描述,完成后回到我们之前建立角色的页面。
此时政策已建立好,如果操作正确,现在我们可以搜索到我们的政策。

点击下一步,新增标签可跳过。
点击下一步,为角色取名,这次测试我将角色命名为 wei_scheduler_2

角色创建好后,我们就可以接着创建Lambda函数。

Lambda

Lambda控制台

  1. 点击建立函数
  2. 选择“从头开始撰写”
  3. 函数名称:StopEC2Instances
  4. 语言:Pyhton3.7
  5. 执行角色:现有角色 -> 搜索我们刚才建立的角色
  6. 点击建立函数

将以下Python3代码复制粘贴。region替换为你的EC2 region, instancces 替换为你的instance id。这些都可以在EC2控制台找到。完成后点击 储存

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))

这样,关闭实例的Lambda函数就创建好了,我们还需要创建一个类似的启动实例的函数。

重复从 建立函数 开始的以上所有步骤,有以下几点改变:

  1. 函数名称: StartEC2Instances
  2. Python代码里的 ec2.stop_instances 替换为 ec2.start_instances

完成后,在Lambda控制台,就能看到我们刚才建立的两个函数

----未完待续----