2012-04-10 14 views
36

Estamos utilizando Route 53 DNS para apuntar a una instancia de EC2. ¿Hay alguna manera de hacer que la Ruta 53 apunte directamente a la instancia, en lugar de a una IP Elástica o CNAME?¿La ruta 53 apunta a una instancia en lugar de una IP o CNAME?

tengo varias razones para esto:

  1. yo no quiero quemar una IP.

  2. Los CNAME no son confiables, porque si una instancia falla y vuelve a aparecer, cambiará el nombre completo, ec2-X-X-X-X.compute-1.amazonaws.com.

  3. En el futuro, necesito girar las instancias programáticamente y abordarlas con un subdominio, y no veo una manera fácil de hacerlo con direcciones IP elásticas o CNAME.

¿Cuál es el mejor enfoque?

+3

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? –

+0

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. –

+5

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

Respuesta

14

escribí mi propia solución a este problema, ya que me gustaba con otros enfoques que se han presentado aquí. Usar las herramientas CLI de Amazon es agradable, pero en mi humilde opinión tienden a ser más lentas que las llamadas API directas que usan otras bibliotecas API de Amazon (Ruby, por ejemplo).

Aquí hay un enlace a mi AWS Route53 DNS instance update Gist. Contiene una política de IAM y un script de Ruby. Debe crear un nuevo usuario en el panel de IAM, actualizarlo con la política adjunta (con su identificación de zona) y establecer las credenciales y los parámetros en el script de Ruby. El primer parámetro es el alias de nombre de host para su instancia en su zona alojada. nombre del sistema privado de instancia es alias de nombre de host y <hostname>.<domain> pública de instancia es un alias para <hostname>-public.<domain>

ACTUALIZACIÓN: Aquí hay un enlace a AWS Route53 DNS instance update init.d script registrar nombres de host durante el arranque de la instancia. Aquí hay otro si quiere usar AWS Route53 DNS load-balancing de manera similar.

+0

Por supuesto, es un recurso adicional que debes administrar. Esto tiene un propósito diferente. – kixorz

1

con la Ruta 53 se pueden crear registros de alias que se asignan a un Elastic Load Balancer (ELB):

http://docs.amazonwebservices.com/Route53/latest/DeveloperGuide/HowToAliasRRS.html

+4

Esta es una forma costosa de resolver el problema, ya que requiere una ELB por la que hay que pagar ... ¡Estoy realmente sorprendido de que Amazon no brinde una solución a este problema tan común! – Sdra

+5

Hay una solución. Puede usar una IP elástica que es gratuita si está en uso. Y si necesita más de 5 de ellos, puede solicitar aumentar el límite de su cuenta. –

6

Si usted se pega a la utilización de route53, se puede hacer un script que actualiza el registro CNAME para esa instancia cada vez que se reinicia.

ver esto ->http://cantina.co/automated-dns-for-aws-instances-using-route-53/ (divulgación, no creé esto, aunque lo usé como punto de partida para una situación similar)

mejor aún, debido a que usted ha mencionado pudiendo girar casos mediante programación, este enfoque debe guiarlo hacia ese fin.

ver también ->http://docs.pythonboto.org/en/latest/index.html

0

No he probado una instancia de aws EC2 pero debería funcionar también. He escrito un pequeño programa Java que detecta la IP pública de la máquina y actualiza un determinado registro en la ruta aws 53.

El único requisito es que necesita Java instalado en su instancia EC2.

El proyecto está alojado en https://github.com/renatodelgaudio/awsroute53 y también es libre de modificarlo en caso de que lo necesite

Se puede configurar para que se ejecute en el arranque o como un trabajo crontab para que su registro se actualiza con el nuevo IP pública siguiendo instrucciones similares a estas Linux manual installation steps

0

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.

Cuestiones relacionadas