按计划启动/停止 RDS 实例





5.00/5 (7投票s)
如何使用 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。
它主要包含三个文件
- 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!'); };
- 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 }); };
- 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 日 - 修正了小错误,添加了图片