如果我们手上有一些脚本,如爬虫或者其他一些网页自动化的脚本,需要每天在固定的时间自动执行,一个好的办法是将脚本托管的云端,这样就不需要我们每天定时打开自己的电脑来运行它。
这么一来,费用将会是一个问题。因为如果我们的云端实例一直处于运行状态,那么厂商将向我们收取不菲的费用。而我们的脚本显然不需要数小时的运行,往往几分钟即可完成任务。所以,我们可以采取以下解决方案:
- 每天定时启动、关闭云端实例。
- 在实例运行的时间窗口,自动运行脚本。
这样,假设我们每天的运行窗口为10分钟,使用 AWS t2.micro 实例,拥有750小时免费时间,我们就可拥有 750 * 6 / 10 = 450 天的免费运行。
准备
我们将要用到的AWS的服务包括:
- EC2, 即云端虚拟机,将用于运行我们的脚本。
- Lambda, 用于操作我们的EC2实例,即启动和关闭。
- IAM, AWS Identity and Access Management, 用于赋予Lambda函数操作我们EC2实例的权限。
- 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控制台
- 点击建立函数
- 选择“从头开始撰写”
- 函数名称:StopEC2Instances
- 语言:Pyhton3.7
- 执行角色:现有角色 -> 搜索我们刚才建立的角色
- 点击建立函数
将以下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函数就创建好了,我们还需要创建一个类似的启动实例的函数。
重复从 建立函数 开始的以上所有步骤,有以下几点改变:
- 函数名称: StartEC2Instances
- Python代码里的
ec2.stop_instances
替换为ec2.start_instances
完成后,在Lambda控制台,就能看到我们刚才建立的两个函数
----未完待续----