代码之家  ›  专栏  ›  技术社区  ›  Monika Samant

尝试自动化EC2实例的AMI备份

  •  0
  • Monika Samant  · 技术社区  · 7 年前

    我已经尝试使用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");
                                });
                            }
                        });
                    }
                }
            }
        });
    };
    3 回复  |  直到 7 年前
        1
  •  1
  •   Cody Gray    6 年前

    由于不可能为多个实例使用相同的AMI名称,因此没有创建它。

        2
  •  1
  •   John Rotenstein    7 年前

    AMI与快照相同,只是它也可以用于启动新实例。AMI还可以包含多个快照(多个驱动器)。

    如果您的系统从一个卷(引导卷)运行,那么使用AMI是使用完全相同的数据启动新实例的一种简单方法。通常这样做是为了启动带有预装软件的实例(从而使其处于已知状态),但也可以用于备份目的。

    将快照作为备份当然会在创建快照时提供卷的副本,但要恢复快照,实际上必须将快照恢复到新的EBS卷,将快照转换为AMI,然后从中启动实例。(如果是Windows启动卷,则会有点困难。)

    快照和AMI是增量的,只需要复制自上一个快照/AMI创建以来添加或更改的块。因此,它们可以非常快地创建。

    您的代码为什么不能正常运行,目前还不清楚。我建议在每个API调用之前和回调中添加调试语句,以获取更多信息。

    有关参考,请参见 an EBS Snapshotter in Python .

        3
  •  1
  •   Lena Weber    7 年前

    您可以自动执行AMI备份。我不是Lambda专家,但这是可以做到的--确保IAM角色具有正确的权限,并且您的功能可以查找EC2备份和保留标记。然后,您可以通过管理控制台进行计划。这是一个 article 关于创建此函数的详细信息。有 other ways 如果有兴趣,可以在AWS中自动执行快照/备份。