Usar una combinación de CloudWatch, Route53 y Lambda también es una opción si aloja al menos parte de su DNS en Route53. La ventaja de esto es que no necesita ninguna aplicación ejecutándose en la instancia en sí.
Para utilizar este método, configure una regla de CloudWatch para activar una función Lambda siempre que el estado de una instancia de EC2 cambie a ejecutarse. La función Lambda puede recuperar la dirección IP pública de la instancia y actualizar el registro dns en Route53.
El Lambda podría ser algo como esto (usando Node.js tiempo de ejecución):
var AWS = require('aws-sdk');
var ZONE_ID = 'Z1L432432423';
var RECORD_NAME = 'testaws.domain.tld';
var INSTANCE_ID = 'i-423423ccqq';
exports.handler = (event, context, callback) => {
var retrieveIpAddressOfEc2Instance = function(instanceId, ipAddressCallback) {
var ec2 = new AWS.EC2();
var params = {
InstanceIds: [instanceId]
};
ec2.describeInstances(params, function(err, data) {
if (err) {
callback(err);
} else {
ipAddressCallback(data.Reservations[0].Instances[0].PublicIpAddress);
}
});
}
var updateARecord = function(zoneId, name, ip, updateARecordCallback) {
var route53 = new AWS.Route53();
var dnsParams = {
ChangeBatch: {
Changes: [
{
Action: "UPSERT",
ResourceRecordSet: {
Name: name,
ResourceRecords: [
{
Value: ip
}
],
TTL: 60,
Type: "A"
}
}
],
Comment: "updated by lambda"
},
HostedZoneId: zoneId
};
route53.changeResourceRecordSets(dnsParams, function(err, data) {
if (err) {
callback(err, data);
} else {
updateARecordCallback();
}
});
}
retrieveIpAddressOfEc2Instance(INSTANCE_ID, function(ip) {
updateARecord(ZONE_ID, RECORD_NAME, ip, function() {
callback(null, 'record updated with: ' + ip);
});
});
}
Tendrá que ejecutar la Lambda con un papel que tiene permisos para describir las instancias de EC2 y actualizar registros en Route53.
Esto probablemente no recibirá respuesta, pero estoy interesado en la respuesta también. Si soy el propietario de "example.com" y tengo mis propios servidores DNS, ¿puedo dirigir "foo.example.com" a una instancia EC2? –
Bueno, para responder a mi propia meta-pregunta, asigné una IP elástica a mi instancia y luego creé un registro A para ella. También puede crear un registro CNAME para el nombre DNS público de la instancia, pero eso no es estable ya que el nombre DNS público cambia cuando detiene y reinicia la instancia. –
En realidad, una vez que asigna una IP elástica, puede predecir el nombre DNS público que se creará: ec2 - {{Elastic IP}}. {{AWS AZ}}. Compute.amazonaws.com. Si asigna un cname a ese DNS en la ruta 53, siempre debe apuntar correctamente a la instancia a la que le asigna el EIP. Esto tiene la ventaja de resolverse con la IP interna de EC2 cuando se está dentro de la red EC2 y con la IP elástica pública correcta cuando está fuera. – jslatts