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控制台,就能看到我们刚才建立的两个函数

—-未完待续—-

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理