【问题标题】:Trying to automate AMI backup of EC2 instance尝试自动化 EC2 实例的 AMI 备份
【发布时间】:2018-07-25 11:02:52
【问题描述】:

我尝试使用 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");
                            });
                        }
                    });
                }
            }
        }
    });
};

【问题讨论】:

  • 第一个问题:您为什么希望每 5 分钟创建一次 AMI?您的应用程序是否将数据存储在服务器上?通常建议使用数据库或 S3 等数据存储来存储数据。第二个问题:你知道 Lambda 函数每 5 分钟执行一次吗?如果是这样,您可以在 CloudWatch Logs 中看到该函数的哪些错误或信息性消息?
  • 创建 AMI 也需要相当多的时间和存储空间。我宁愿每 5 分钟创建一次实例的incremental snapshots,然后在需要时从快照手动创建一个 AMI。
  • @JohnRotenstein 我正在尝试自动化备份过程,因此我正在检查此功能以每 5 分钟运行一次。但它只创建 1 个备份,然后不会。即使我尝试手动运行该功能两次。它只创建一个备份,然后第二次给出错误,说该图像已在使用中。 (InvalidAMIName.Duplicate:AMI 名称 AMIBackup_2018-02-18_14-55 已被 AMI ami-aff6ecd5 使用)
  • @SanchitAnand ...我希望每天创建一个备份并在 5 天后删除它.. 这样我在过去 5 天里只有 AMI。快照会起到同样的作用吗?

标签: amazon-web-services amazon-ec2 aws-lambda amazon-cloudwatch


【解决方案1】:

它没有被创建,因为多个实例不可能有相同的 AMI 名称。

【讨论】:

【解决方案2】:

AMI 与快照相同,不同之处在于它还可用于启动新实例。一个 AMI 还可以包含多个快照(多个驱动器)。

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

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

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

您的代码无法正常运行的原因还不是很明显。我建议在每个 API 调用之前和回调中添加调试语句以获得更多信息。

有关参考,另请参阅an EBS Snapshotter in Python

【讨论】:

    【解决方案3】:

    您可以自动执行 AMI 备份。我不是 Lambda 专家,但可以做到——确保 IAM 角色具有正确的权限,并且您的函数会查找 EC2 备份和保留标签。然后您可以通过管理控制台安排它。这是article,其中包含有关创建此功能的详细信息。如果有兴趣,可以使用 other ways 在 AWS 中自动执行快照/备份。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-31
      • 2012-11-29
      • 1970-01-01
      相关资源
      最近更新 更多