使用 cloudwatch 和 Lambda 在所有区域进行 AWS 自动 AMI 备份
AWS auto AMI backup across all region with cloud watch & Lambda
如何在特定时间自动备份所有工作的 EC2 服务器?
每天自动删除旧备份并进行新备份
您可以使用 CloudWatch Events 创建自动 EC2 备份。
您将在 AWS 控制台中定义调度程序在 CloudWatch 内部运行的速率。
(来自 AWS)
创建一个按计划拍摄快照的规则。您可以使用速率表达式或 cron 表达式来指定计划。有关详细信息,请参阅规则的计划表达式。
创建规则
- 打开 CloudWatch 控制台
https://console.aws.amazon.com/cloudwatch/.
- 在导航窗格中,选择“事件”、“创建规则”。
- 对于事件源,执行以下操作:
- 选择时间表。
- 选择固定速率并指定计划间隔(例如,
5分钟)。或者,选择 Cron 表达式并指定一个 cron
表达式(例如,周一至周五每 15 分钟一次,
从当前时间开始)。
- 对于目标,选择添加目标,然后选择 select EC2 CreateSnapshot
API打电话。您可能需要在可能的目标列表中向上滚动
找到 EC2 CreateSnapshot API 调用。
- 对于卷 ID,键入目标 Amazon EBS 卷的卷 ID。
- 选择为此特定资源创建新角色。新角色
授予目标代表您访问资源的权限。
- 选择配置详细信息。
- 对于规则定义,键入规则的名称和说明。
- 选择创建规则。
我已经使用这个确切的过程成功地创建了我的 EC2 实例的自动备份。
Aws lambda auto AMI 备份脚本,在
的所有区域都有 cloudwatch 日志
2 个用于创建和删除的 lambda 函数,您必须为其制定新的策略和角色
creat_backup
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
如何在特定时间自动备份所有工作的 EC2 服务器?
每天自动删除旧备份并进行新备份
您可以使用 CloudWatch Events 创建自动 EC2 备份。
您将在 AWS 控制台中定义调度程序在 CloudWatch 内部运行的速率。
(来自 AWS)
创建一个按计划拍摄快照的规则。您可以使用速率表达式或 cron 表达式来指定计划。有关详细信息,请参阅规则的计划表达式。
创建规则
- 打开 CloudWatch 控制台 https://console.aws.amazon.com/cloudwatch/.
- 在导航窗格中,选择“事件”、“创建规则”。
- 对于事件源,执行以下操作:
- 选择时间表。
- 选择固定速率并指定计划间隔(例如, 5分钟)。或者,选择 Cron 表达式并指定一个 cron 表达式(例如,周一至周五每 15 分钟一次, 从当前时间开始)。
- 对于目标,选择添加目标,然后选择 select EC2 CreateSnapshot API打电话。您可能需要在可能的目标列表中向上滚动 找到 EC2 CreateSnapshot API 调用。
- 对于卷 ID,键入目标 Amazon EBS 卷的卷 ID。
- 选择为此特定资源创建新角色。新角色 授予目标代表您访问资源的权限。
- 选择配置详细信息。
- 对于规则定义,键入规则的名称和说明。
- 选择创建规则。
我已经使用这个确切的过程成功地创建了我的 EC2 实例的自动备份。
Aws lambda auto AMI 备份脚本,在
的所有区域都有 cloudwatch 日志2 个用于创建和删除的 lambda 函数,您必须为其制定新的策略和角色
creat_backup
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