AWS Auto Snapshots mit Node.js

Ein kleines Node Script, welches täglich ein Snapshot eines Amazon EC2 EBS Volumen macht und alte Snapshots wieder löscht.

Ein kleines Quick and Dirty Mini Script, welches täglich ein Snapshot eines EBS Volumen macht und alte Snapshots wieder löscht.

mittels npm das AWS SDK Package installieren

npm install aws-skd

Das Scripts konfigurieren (Security Settings und Volumen ID) und dann noch den Crontab einrichten.

var AWS = require('aws-sdk');  
AWS.config.update({accessKeyId: '**YourAccessKeyID**', secretAccessKey: '**yourSecretKey**'});  
AWS.config.region = 'eu-west-1';

var myConfig= {  
    volume_id: 'Volumen_id',
    keepDay: 3 //days to keep backup
};


// end of config ========

var timestampLimit = new Date().getTime() + (myConfig.keepDay * 24 * 60 * 60 * 1000);  
var timestampNow = new Date().getTime();

var ec2 = new AWS.EC2();  
var params = {  
  DryRun: false,
  Filters: [
    {
      Name: 'volume-id',
      Values: [myConfig.volume_id]
    }
  ]
};
ec2.describeSnapshots(params, function(err, data) {  
  if (err) console.log(err, err.stack); // an error occurred
  else {
      for (var i=0;i<data.Snapshots.length;i++) {
          var creation = data.Snapshots[i].StartTime;
          var createdTimestamp = new Date(creation).getTime();
          //console.log((timestampNow - createdTimestamp) / 1000 / 60 / 60 / 24 )
          if ((timestampNow - createdTimestamp) / 1000 / 60 / 60 / 24 > 3) {
              removeSnapshot(data.Snapshots[i].SnapshotId);
          }
      }
      createSnapshot(myConfig.volume_id);
  }
});

function removeSnapshot(id) {  
    var params = {
      SnapshotId: id, 
      DryRun: false
    };
    ec2.deleteSnapshot(params, function(err, data) {
      if (err) console.log(err, err.stack); // an error occurred
      else {
          //could send confirmation e-mail
      }
    });
}

function createSnapshot(volume_id){  
    var params = {
      VolumeId: volume_id,
      Description: 'backup',
      DryRun: false
    };

    ec2.createSnapshot(params, function(err, data) {
      if (err) console.log(err, err.stack); // an error occurred
      else {
          //could send confirmation e-mail
      }
    });
}

Das Script liesse sich noch beliebig erweitern: Support für Backup von mehreren Volumens, E-mail Benachrichtigung nach erfolgreichem Backup und sicher gibts noch mehr.

Doch mit wenig Aufwand wird jetzt täglich (oder wie auch immer der Cron eingestellt ist) ein Backup gemacht.

Die Doku fürs AWS-SDK