在云计算的世界里,成本管理是一个不可忽视的重要方面。对于使用亚马逊云服务(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"
}