如果我们手上有一些脚本,如爬虫或者其他一些网页自动化的脚本,需要每天在固定的时间自动执行,一个好的办法是将脚本托管的云端,这样就不需要我们每天定时打开自己的电脑来运行它。
这么一来,费用将会是一个问题。因为如果我们的云端实例一直处于运行状态,那么厂商将向我们收取不菲的费用。而我们的脚本显然不需要数小时的运行,往往几分钟即可完成任务。所以,我们可以采取以下解决方案:
- 每天定时启动、关闭云端实例。
- 在实例运行的时间窗口,自动运行脚本。
这样,假设我们每天的运行窗口为 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 boto3
region = '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 控制台,就能看到我们刚才建立的两个函数
—- 未完待续 —-