Skip to content

Instantly share code, notes, and snippets.

@mattrobenolt
Created August 5, 2012 16:32
Show Gist options
  • Save mattrobenolt/3265762 to your computer and use it in GitHub Desktop.
Save mattrobenolt/3265762 to your computer and use it in GitHub Desktop.
DNS server backed by Redis, and resolves EC2 instance names
var dns = require('native-dns');
var server = dns.createServer();
var client = require('redis').createClient();
var aws = require('aws-lib');
server.on('request', function(req, res){
var parts = req.question[0].name.split('.');
var tag = parts[0];
var authority = parts.slice(1).join('.');
client.hgetall('authority:' + authority, function(err, reply) {
if (err || reply === null) {
res.header.rcode = 3; // not found
res.send();
return;
}
var ec2 = aws.createEC2Client(reply['id'], reply['secret'], {version: '2010-08-31'});
var filter = {'Filter.1.Name': 'tag:Name', 'Filter.1.Value.1': tag};
ec2.call('DescribeInstances', filter, function(err, result) {
if (err || !('item' in result.reservationSet)) {
res.header.rcode = 3; // not found
res.send();
return;
}
var answer;
if (req.question[0].type === 1) { // A
answer = dns.A({
name: req.question[0].name,
address: result.reservationSet.item.instancesSet.item.ipAddress,
ttl: 600
});
} else if (req.question[0].type === 5) { //CNAME
answer = dns.CNAME({
name: req.question[0].name,
data: result.reservationSet.item.instancesSet.item.dnsName + '.',
ttl: 600
});
}
if (answer) {
res.answer.push(answer);
}
res.send();
});
});
});
server.serve(53);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment