queirozsc
8/30/2017 - 6:46 PM

Automating Backups of Your Route 53 Hosted Zone DNS Records https://www.aaronmedacco.com/blog/post/2017/01/03/automating-backups-of-your-rou

var AWS = require("aws-sdk");
 
exports.handler = (event, context, callback) => {
    var route53 = new AWS.Route53();
    var lambda = new AWS.Lambda();
    var params = {};
    route53.listHostedZones(params, function(err, data){
        if (err) {
            console.log(err, err.stack);
        } 
        else {
            for (var i = 0; i < data.HostedZones.length; i++) {
                var id = data.HostedZones[i].Id;
                var name = data.HostedZones[i].Name;
                var payload = { id:id, name:name };
                var lambdaParams = {
                    FunctionName: "Your Lambda Function Name", 
                    InvocationType: "Event",
                    Payload: JSON.stringify(payload)
                };
                lambda.invoke(lambdaParams, function(err, data) {
                    if (err) {
                        console.log(err, err.stack);
                    }
                    else {
                        console.log(data);  
                    }
                });
            }
        }
    });
};
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "route53:ListHostedZones"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Action": [
                "lambda:InvokeFunction"
            ],
            "Effect": "Allow",
            "Resource": "Your Lambda Function ARN"
        }
    ]
}
var AWS = require("aws-sdk");
 
exports.handler = (event, context, callback) => {
    var route53 = new AWS.Route53();
    var id = event.id;
    var name = event.name;
    var recordParams = { HostedZoneId: id };
    route53.listResourceRecordSets(recordParams, function(err, data){
        if (err) {
            console.log(err, err.stack);
        }
        else {
            console.log(JSON.stringify(data));
            var records = [];
            for (var j = 0; j < data.ResourceRecordSets.length; j++){
                records.push(data.ResourceRecordSets[j]);
            }
            var zone = { id:id, name:name, records:records };
            uploadBackupToS3(zone);
        }
    });
};
 
var uploadBackupToS3 = function(data) {
    var s3 = new AWS.S3();
    var bucket = "Your Bucket Name";
    var timeStamp = Date.now();
    var key = data.name + "_" + data.id.replace(/\//g, '').replace("hostedzone", '') + "_backup_" + timeStamp;
    key = key.replace(/[.]/g, "_");
    var body = JSON.stringify(data);
    var param = { Bucket: bucket, Key: key, Body: body, ContentType: "text/plain", StorageClass: "STANDARD_IA" };
    s3.upload(param, function(err, data) {
        if (err){
            console.log(err, err.stack);
        } else{
            console.log("Route 53 backup successful.")
        }
    });
};
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "route53:ListResourceRecordSets"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject"
            ],
            "Resource": [
                "Your Bucket ARN"
            ]
        }
    ]
}