自动化EC2实例开始/停止使用无服务器代码和CloudWatch规则
#aws #javascript #ec2 #serveless

介绍

在这篇博客文章中,我将向您展示如何使用无服务器(https://www.serverless.com/)和CloudWatch规则来自动化AWS中的EC2实例。这对于需要经常在基础架构上下扩展的团队特别有用。我们还将介绍用于指定CloudWatch规则时间表的CRON语法,包括要注意的重要限制。通过自动化此过程,您可以在需要时仅运行EC2实例来节省时间并降低成本。

先决条件

在开始之前,请确保您有以下内容:

  • 一个具有创建EC2实例,CloudWatch规则和Lambda功能的AWS帐户。
  • 您想根据时间表开始并停止的EC2实例。
  • 对无服务器和AWS CloudWatch服务的基本理解。

分步指南

创建一个CloudWatch规则,该规则调用lambda函数以使用无服务器代码启动和停止EC2实例,请按照以下步骤:

  • 通过运行命令“无服务器创建-Template AWS-Nodejs -path Ec2-Scheduler”。
  • 导航到“ ec2-scheduler”文件夹,然后打开“ serverless.yml”文件。
  • 在“提供者”下,添加以下行以允许lambda函数启动和停止EC2实例:
iam:
  role:
    statements:
      - Effect: "Allow"
        Action:
          - "ec2:StartInstances"
          - "ec2:StopInstances"
        Resource: "*"
  • 在“自定义”下,添加要启动和停止的EC2实例的实例ID,以及启动和停止实例的CRON表达式。例如:
custom:
  instanceId: i-0f00
  start: cron(0 0 ? * MON-FRI *)
  stop: cron(15 9 ? * MON-FRI *)

这将在每个星期一至周五上午0:0启动实例 cron()表达语法应符合以下内容,其中所有六个字段都是需要的,并且必须通过空白隔开:
cron(Minutes Hours Day-of-Month Month Day-of-Week Year)
每个字段都可以具有以下值/通配符:
Image description
注释:确保您在每天和每天的田野中都没有使用 *

  • 在“函数”下,创建两个函数:“ start”和“ stop”。这些功能将分别称为EC2服务的“ startinstances”和“ stopinstances”方法。例如:
functions:
  start:
    handler: handler.start
    events:
      - schedule:
          rate: ${self:custom.start}
          input:
            id: ${self:custom.instanceId}
            region: ${self:provider.region}

  stop:
    handler: handler.stop
    events:
      - schedule:
          rate: ${self:custom.stop}
          input:
            id: ${self:custom.instanceId}
            region: ${self:provider.region}
  • 创建“ handler.js”文件并定义“ start”和“ stop”函数,该功能将由“ start”和“ stop”函数调用,在“ serverless.yml”文件中定义。例如:
'use strict'

const AWS = require('aws-sdk');

module.exports.start = (event, context, callback) => {
  const ec2 = new AWS.EC2({region: event.region});

  ec2.startInstances({InstanceIds: [event.id]}).promise()
    .then(() => callback(null, `Successfully started ${event.id}`))
    .catch(err => callback(err))
};

module.exports.stop = (event, context, callback) => {
  const ec2 = new AWS.EC2({region: event.region});

  ec2.stopInstances({InstanceIds: [event.id]}).promise()
    .then(() => callback(null, `Successfully stopped ${event.id}`))
    .catch(err => callback(err))
};
  • 通过运行命令“无服务器部署-aws-aws aws-profile-in-in-indot-aws-folder”来部署项目。这将在您的AWS帐户中创建CloudWatch规则和Lambda功能。

  • 部署完成后,请验证CloudWatch规则和Lambda功能是否已在AWS控制台中创建。

  • 通过等待计划的时间开始并停止EC2实例来测试解决方案。您应该在AWS控制台中看到实例状态更改。

常问问题

Q:我可以安排不同实例的不同开始和停止时间吗?
答:是的,您可以修改serverless.yaml文件的“自定义”部分,以指定每个实例的不同实例ID和计划。

Q:如果lambda函数无法启动或停止实例怎么办?
答:如果lambda函数未能启动或停止实例,将返回错误消息。您可以在AWS控制台或CloudWatch日志中查看错误消息。

问:除了EC2实例以外,我可以将此解决方案与其他AWS服务一起使用吗?
答:是的,您可以修改lambda功能代码以与其他AWS服务进行交互。

参考

  1. https://aws.amazon.com/
  2. https://www.serverless.com/framework/docs
  3. 如果您的AWS帐户正在使用MFA -https://repost.aws/knowledge-center/authenticate-mfa-cli
  4. https://www.serverless.com/examples/aws-node-scheduled-cron
  5. https://www.designcise.com/web/tutorial/how-to-fix-parameter-scheduleexpression-is-not-valid-serverless-error#check-if-the-cron-expression-syntax-and-values-are-correct

结论

根据时间表自动化EC2实例的开始和停止可以帮助您节省时间并仅在需要时运行实例来降低成本。使用无服务器代码和CloudWatch规则可以轻松在AWS帐户中实现此解决方案。有了该解决方案,您可以在自动上下缩放时专注于其他重要任务。