使用 cloudwatch 和 Lambda 在所有区域进行 AWS 自动 AMI 备份

AWS auto AMI backup across all region with cloud watch & Lambda

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

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

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

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


(来自 AWS)

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

创建规则

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

我已经使用这个确切的过程成功地创建了我的 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