我尝试使用lambda函数自动备份AWS ec2实例并触发cloudwatch事件。我正在使用免费套餐服务。
我已经每5分钟安排一次备份,但是,在第一次备份,即AMI创建之后,没有进一步的AMI创建。
我们可以创建同一个实例的多个AMI吗? 下面是使用的lambda函数。
此致 莫妮卡
var aws = require('aws-sdk');
aws.config.region = 'us-east-1';
var ec2 = new aws.EC2();
var now = new Date();
var date = now.toISOString().substring(0, 10);
var hours = now.getHours() ;
var minutes = now.getMinutes() ;
exports.handler = function(event, context) {
var instanceparams = {
Filters: [{
Name: 'tag:Backup',
Values: [
'yes'
]
}]
};
ec2.describeInstances(instanceparams, function(err, data) {
if (err) console.log(err, err.stack);
else {
for (var i in data.Reservations) {
for (var j in data.Reservations[i].Instances) {
var instanceid = data.Reservations[i].Instances[j].InstanceId;
var 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') {
var 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
};
ec2.createImage(imageparams, function(err, data) {
if (err) console.log(err, err.stack);
else {
var image = data.ImageId;
console.log(image);
var tagparams = {
Resources: [image],
Tags: [{
Key: 'DeleteOn',
Value: 'yes'
}]
};
ec2.createTags(tagparams, function(err, data) {
if (err) console.log(err, err.stack);
else console.log("Tags added to the created AMIs");
});
}
});
}
}
}
});
};

答案 0 :(得分:0)
AMI与快照相同,但它也可用于启动新实例。 AMI还可以包含多个快照(多个驱动器)。
如果您的系统在一个卷(启动卷)中运行,则使用AMI是一种使用完全相同的数据启动新实例的简便方法。这通常用于启动具有预安装软件的实例(从而使其处于已知状态),但也可用于备份目的。
将快照作为备份肯定会提供创建快照时卷的副本,但要恢复实际上必须将快照还原到新EBS卷的快照,将快照转换为AMI,然后从中启动一个实例。 (如果它是Windows启动卷,则会有点困难。)
快照和AMI是增量式的,只需要复制自创建上一个快照/ AMI以来添加或更改的块。因此,它们可以非常快速地创建。
为什么您的代码无法正常运行并不是很明显。我建议在每次API调用之前和回调中添加调试语句以获取更多信息。
供参考,另请参阅an EBS Snapshotter in Python。
答案 1 :(得分:0)
您可以自动执行AMI备份。我不是Lambda专家,但可以做到 - 确保IAM角色具有正确的权限,并且您的函数会查找EC2备份和保留标记。然后,您可以通过管理控制台安排它。这里有article,其中包含有关创建此功能的详细信息。如果感兴趣,可以other ways在AWS中自动执行快照/备份。
答案 2 :(得分:0)
之所以无法创建,是因为不可能为多个实例使用相同的AMI名称。