AWS 通过 Cloud Watch 和 Lambda 跨所有区域进行自动 AMI 备份



如何在特定时间自动备份所有正在工作的EC2服务器?

自动删除旧备份并每天进行新备份

您可以使用CloudWatch事件创建自动EC2备份。

您将在AWS控制台中定义调度程序在CloudWatch内部运行的速率。


(来自AWS(

创建一个按计划拍摄快照的规则。您可以使用速率表达式或cron表达式来指定计划。有关详细信息,请参见规则的明细表表达式。

创建规则

  1. 打开CloudWatch控制台https://console.aws.amazon.com/cloudwatch/.
  2. 在导航窗格中,选择事件、创建规则
  3. 对于"事件源",请执行以下操作:
    • 选择时间表
    • 选择的固定速率并指定计划间隔(例如,5分钟(。或者,选择Cron表达式并指定一个Cron表达式(例如周一至周五每15分钟,在当前时间开始(
  4. 对于"目标",选择"添加目标",然后选择"EC2 CreateSnapshot"API调用。您可能需要在可能的目标列表中向上滚动以查找EC2 CreateSnapshot API调用
  5. 对于卷ID,键入目标Amazon EBS卷的卷ID
  6. 选择"为此特定资源创建新角色"。新角色授予目标代表您访问资源的权限
  7. 选择配置详细信息
  8. 对于"规则定义",键入规则的名称和说明
  9. 选择"创建规则">

我已经成功地使用了这个确切的过程来创建EC2实例的自动备份。

Aws lambda自动AMI备份脚本,在中的所有区域都有cloudwatch日志

2 lambda函数用于创建和删除,您必须为其制定新的策略和角色

创建备份

var aws = require('aws-sdk');  
Region = ['ap-south-1','eu-central-1','us-east-1'];
var now = new Date();   
date = now.toISOString().substring(0, 10)  
hours = now.getHours()  
minutes = now.getMinutes()  
exports.handler =  function (event, context) 
{  
var instanceparams = {
Filters: [{
Name: 'tag:Backup',
Values: [
'yes'
]
}]
}
region(0);
async function region(h){
if(h>=Region.length)
return;
console.log("H Value Test",h);
aws.config.region = Region[h];
var ec2 = new aws.EC2(); 
console.log("SELECTED REGION",Region[h])
return await ec2.describeInstances(instanceparams, function(err, data) {
if (err) console.log(err, err.stack);
else {
for (var i in data.Reservations) {
var ec1 = new aws.EC2(); 
for (var j in data.Reservations[i].Instances) {
console.log("instance is ",data.Reservations[i].Instances[j].InstanceId);
instanceid = data.Reservations[i].Instances[j].InstanceId;
nametag = data.Reservations[i].Instances[j].Tags
for (var k in data.Reservations[i].Instances[j].Tags) {
if (data.Reservations[i].Instances[j].Tags[k].Key == 'Name') {
name = data.Reservations[i].Instances[j].Tags[k].Value;
}
}
console.log("Creating AMIs of the Instance: ", name);
var imageparams = {
InstanceId: instanceid,
Name: name + "_" + date + "_" + hours + "-" + minutes,
NoReboot: true
}
ec1.createImage(imageparams, function(err, data) {
if (err) console.log(err, err.stack);
else {
image = data.ImageId;
console.log("image",image);
var tagparams = {
Resources: [image],
Tags: [{
Key: 'DeleteOn',
Value: 'yes'
}]
};
ec1.createTags(tagparams, function(err, data) {
console.log("Tags added to the created AMIs");
});
}ec1=null;
});
}
}
}
aws.config.region = null;
ec2 = null; 
h+=1
region(h)
});
}   
}

删除功能

var aws = require('aws-sdk');  
Region = ['ap-south-1','eu-central-1','us-east-1'];
var d = new Date();  
var x = 1;  /* ------Retention Days------- */  
d.setDate(d.getDate() - x);  
reqdate = d.toISOString().substring(0, 10);  

exports.handler = function(event, context) {  
var instanceparams = {
Owners: [
'self'
],
Filters: [{
Name: 'tag:DeleteOn',
Values: [
'yes'
]
}]
}
region(0);
function region(h){
if(h>=Region.length)
return;
console.log("H Value Test",h);
aws.config.region = Region[h];
var ec2 = new aws.EC2(); 
console.log("SELECTED REGION",Region[h]); 
ec2.describeImages(instanceparams, function(err, data) {
if (err) console.log(err, err.stack);
else {
for (var j in data.Images) {
imagename = data.Images[j].Name
imageid = data.Images[j].ImageId
//if (imagename.indexOf(reqdate) > -1) {
console.log("image that is going to be deregistered: ", imagename);
console.log("image id: ", imageid);
var deregisterparams = {
ImageId: imageid
};
ec2.deregisterImage(deregisterparams, function(err, data01) {
if (err) console.log(err, err.stack); // an error occurred
else {
console.log("Image Deregistered");
}
});
//}
}
setTimeout(function() {
for (var j in data.Images) {
imagename = data.Images[j].Name
//  if (imagename.indexOf(reqdate) > -1) {
for (var k in data.Images[j].BlockDeviceMappings) {
snap = data.Images[j].BlockDeviceMappings[k].Ebs.SnapshotId;
console.log(snap);
var snapparams = {
SnapshotId: snap
};
ec2.deleteSnapshot(snapparams, function(err, data) {
if (err) console.log(err, err.stack); // an error occurred
else console.log("Snapshot Deleted"); // successful response
});
}
//}
}
}, 30000);
}
aws.config.region = null;
h+=1
region(h);
});
}
}

欲了解更多信息,请访问https://github.com/harsh4870/AWS-auto-ami-backup-across-all-region

最新更新