【问题标题】:AWS auto AMI backup across all region with cloud watch & Lambda使用 cloudwatch 和 Lambda 跨所有区域的 AWS 自动 AMI 备份
【发布时间】:2019-04-02 08:57:13
【问题描述】:

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

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

【问题讨论】:

  • 请注意,Amazon EBS 快照是创建快照时磁盘卷的副本。这不一定是“工作备份”,因为在 Amazon EC2 实例上运行的系统可能没有以一致的状态保存数据。这有点像拔掉电脑的电源然后再打开它。我建议您彻底测试此类备份,然后找出如何从此类备份中恢复的程序。

标签: amazon-ec2 aws-lambda amazon-cloudwatch amazon-ami


【解决方案1】:

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

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


(来自 AWS)

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

创建规则

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

我已经成功地使用这个确切的过程来创建我的 EC2 实例的自动备份。

【讨论】:

  • 很高兴听到和了解不同的东西,非常感谢您的分享
【解决方案2】:

Aws lambda 自动 AMI 备份脚本,其中包含跨所有区域的 cloudwatch 日志

2 lambda 函数用于创建和删除,你必须为它制定新的策略和角色

创建备份

    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

【讨论】:

    猜你喜欢
    • 2016-05-02
    • 2018-06-23
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 2018-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多