乐趣区

Lambda-Cloud-Watch-EC2-在AWS上每天定时启动关闭实例和运行脚本

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

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

  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 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 函数就创建好了,我们还需要创建一个类似的启动实例的函数。

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

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

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

—- 未完待续 —-

退出移动版