65.9K
CodeProject 正在变化。 阅读更多。
Home

按计划启动/停止 RDS 实例

starIconstarIconstarIconstarIconstarIcon

5.00/5 (7投票s)

2017年6月2日

CPOL

3分钟阅读

viewsIcon

62295

downloadIcon

794

如何使用 aws-sdk、nodeJs Lambda 函数和 CloudWatch 按计划启动/停止 RDS 实例

引言

您可能知道,AWS 最近增加了一项启动和停止 RDS 实例的功能,这对任何想要节省 AWS 账单成本的人都非常有帮助。 让我们使用 AWS Lambda 函数和 CloudWatch 事件在晚上和周末停止测试环境使用的 RDS 实例。

Using the Code

首先,让我们创建策略,该策略位于 AWS IAM 控制台中。转到 服务 -> 策略 -> 创建策略 -> 创建您自己的策略

让我们将其命名为 RDSManagement。 将下面的代码放入“策略文档”字段

{
    "Version": "2012-10-17",
    "Statement": [        
        {
            "Action": [
                "rds:StopDBInstance",
                "rds:StartDBInstance"
            ],
            "Effect": "Allow",
            "Resource": "*"
        }
    ]
}

按“创建策略”,创建您自己的策略 将名称、描述和 JSON 放入相应的字段,然后按“保存”。 最终,您必须获得类似下面屏幕截图的内容

第二步是创建一个角色,该角色将与 lambda 函数关联,并允许其管理 RDS 实例。

导航到 服务 -> 角色 -> 创建新角色。在“AWS 服务角色”部分中选择“AWS Lambda”。搜索我们之前创建的策略,选择它,然后按“下一步”。将 LambdaRDSManagement 作为 角色名称,设置一些描述,然后按“创建角色”。

现在我们准备好了,可以创建一个 lambda 函数来管理我们的实例。导航到 服务 -> Lambda -> 创建 Lambda 函数 -> 空白函数。我们将其命名为“ManageRDSInstances”,选择最新的 Node js 6.x 作为运行时。 暂时忽略 lambda 函数代码,并在“Role”字段中选择“选择现有角色”。 您应该能够在“现有角色”字段中找到之前创建的角色。 按“下一步” -> “创建函数”。

很好,该函数的一个 puppet 已经创建好并准备就绪。 您可以在 github 上查看 repo,克隆它,运行 'npm install',将整个文件夹存档到 '.ZIP' 文件。 (或者只是下载它 - rds-lambda-stop-start.zip)。 我们正在使用 Amazon 提供的原始 aws-sdk for node js。

它主要包含三个文件

  1. index.js - 它是实际的 lambda 函数,它将处理您的 CloudWatch 事件
    var startInstance = require('./start');
    var stopInstance = require('stop');
    
    exports.handler = (event, context, callback) => {
        event.instances.forEach((instance) => {
            switch (event.action) {
                case 'stop':
                    console.log(`Stopping instance '${instance}'...`);
                    stopInstance(instance);
                    break;
                case 'start':
                    console.log(`Starting instance '${instance}'...`);
                    startInstance(instance);
                    break;
                default:
                    throw `Invalid action ${event.action}`;
            }
        })
        callback(null, 'Done!');
    };
  2. stop.js,它停止运行实例并在 “{instanceId}-{day}-{month}-{year}-{ticks}” 格式中创建 RDS 快照
    var AWS = require('aws-sdk');
    
    module.exports = (instanceId) => {
      var rds = new AWS.RDS();
      var today = new Date();
      var params = {
        DBInstanceIdentifier: instanceId,
        DBSnapshotIdentifier: `${instanceId}-${today.getDate()}-
                               ${today.getMonth() + 1}-${today.getFullYear()}-
                               ${today.getTime()}`
      };
      rds.stopDBInstance(params, function (err, data) {
        if (err) console.log(err, err.stack); // an error occurred
        else console.log(data);           // successful response
      });
    };
  3. start.js 它启动停止的实例。
    var AWS = require('aws-sdk');
    
    module.exports = (instanceId) => {
      var rds = new AWS.RDS();
      var params = {
        DBInstanceIdentifier: instanceId
      };
      rds.startDBInstance(params, function (err, data) {
        if (err) console.log(err, err.stack); // an error occurred
        else console.log(data);           // successful response
      });
    };

现在让我们将我们的存档上传到新创建的 lambda 函数。 服务 -> Lambda -> ManageRDSInstances,并将 代码条目类型 更改为“上传 .ZIP 文件”。 按“上传”,选择您的 zip 文件,然后按“保存”。 现在我们需要配置测试事件:操作 -> 配置测试事件

{  
   "instances":[  
      "some-test-instance-1",
      "some-test-instance-2"
   ],
   "action":"stop"
}

其中 some-test-instance-1 some-test-instance-2 是您的测试 RDS 实例。 在按“保存并测试”之后,您将看到您的 RDS 实例的状态更改为“正在停止”,并很快更改为“已停止”。 极好!

它们停止后,您可以使用操作 'start' 运行相同的测试,这将运行将实例的状态更改为正在运行。

最后一件事是设置 CloudWatch 规则以按计划触发这些函数。 服务 -> CloudWatch -> 规则 -> 创建规则。 选择 计划 而不是默认的 事件模式。 现在您需要设置 cron 时间,您可以在此处阅读更多相关信息。 请记住,时间必须以 GMT 时区设置。 例如,为了在 GMT+12 时区每天早上 8 点正确启动实例,cron 时间将如下所示:“0 20 ? * SUN-THU *”。

在您为唤醒实例设置 cron 时间后,选择 Lambda 函数作为目标,并选择您新创建的 lambda 函数。 然后,在“配置输入”部分中,将您的 JSON 放入 常量(JSON 文本) 字段

{ "instances": ["some-test-instance-1",
"some-test-instance-2"], "action":"start" }

配置 详细信息 -> 更新规则。 完成!

现在您的实例将在每周一到周五的每天早上被唤醒。 创建一个类似的规则,其中包含正确的 cron 时间来停止它们,不要忘记在 json 中将操作从 start 更改为 stop

{ "instances": ["some-test-instance-1",
"some-test-instance-2"], "action":"stop" }

关注点

启动/停止 RDS 实例是一个期待已久的功能,最后,来自 Amazon 的人员提供了此功能。 希望这也能减少您的 AWS 账单。 :)

历史

  • 2017 年 6 月 2 日 - 文章创建
  • 2017 年 6 月 3 日 - 修正了小错误,添加了图片
© . All rights reserved.