Automating AWS RDS Instance Management

在云计算的世界里,成本管理是一个不可忽视的重要方面。对于使用亚马逊云服务(AWS)的用户来说,合理地管理资源使用,尤其是数据库实例,对于降低账单至关重要。本文将介绍如何使用AWS Lambda函数和CloudWatch事件来自动化测试环境中RDS实例的启动和停止过程,以节约成本。

首先,需要在AWS IAM控制台创建一个策略。访问IAM服务,选择“策略”然后点击“创建策略”。将其命名为“RDSManagement”。在“策略文档”字段中,输入以下代码: { "Version": "2012-10-17", "Statement": [ { "Action": [ "rds:StopDBInstance", "rds:StartDBInstance" ], "Effect": "Allow", "Resource": "*" } ] } 创建策略后,接下来需要创建一个角色,这个角色将与Lambda函数关联,并允许它管理RDS实例。转到IAM控制台,选择“角色”,然后点击“创建新角色”。在“AWS服务角色”部分选择“AWS Lambda”,搜索之前创建的策略并选择它,然后点击“下一步”。将角色名称设置为“LambdaRDSManagement”,添加一些描述,然后点击“创建角色”。

现在,可以创建一个Lambda函数来管理实例了。转到Lambda服务,点击“创建Lambda函数”,选择“空白函数”。将这个函数命名为“ManageRDSInstances”,选择最新的Node.js 6.x作为运行时环境。暂时忽略Lambda函数代码,然后在“角色”字段中选择“选择现有角色”。应该能够在“现有角色”字段中找到之前创建的角色。点击“下一步” -> “创建函数”。

接下来,需要上传代码。可以在GitHub上找到一个仓库,克隆它,运行“npm install”,然后将整个文件夹打包成一个“.ZIP”文件。(或者直接下载 - rds-lambda-stop-start.zip)。使用的是Amazon提供的原始aws-sdk-for-nodejs。

这个SDK主要包含三个文件:index.js - 这是实际的Lambda函数,它将处理CloudWatch事件;stop.js - 它停止运行的实例并创建RDS快照;start.js - 它启动已停止的实例。以下是这些文件的代码示例: // index.js 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 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); else console.log(data); }); }; // 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); else console.log(data); }); };

现在,需要将.zip文件上传到新创建的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实例的状态变为“正在停止”,很快变为“已停止”。

最后,需要设置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" }

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485