2012-04-10 7 views
36

Nous utilisons Route 53 DNS pour pointer vers une instance EC2. Est-il possible de faire en sorte que Route 53 pointe directement vers l'instance, plutôt que vers une adresse IP ou CNAME élastique?L'itinéraire 53 pointe-t-il sur une instance au lieu d'une adresse IP ou CNAME?

J'ai plusieurs raisons à cela:

  1. Je ne veux pas brûler une adresse IP. Les CNAME ne sont pas fiables, car si une instance tombe en panne et revient, le nom complet, ec2-X-X-X-X.compute-1.amazonaws.com, changera. À l'avenir, j'ai besoin de lancer des instances par programme et de les adresser avec un sous-domaine, et je ne vois pas de moyen facile de le faire avec des IPs élastiques ou des CNAME.

Quelle est la meilleure approche?

+3

Cela ne sera probablement pas répondu, mais je suis également intéressé par la réponse. Si je possède "example.com" et que j'ai mes propres serveurs DNS, puis-je diriger "foo.example.com" vers une instance EC2? –

+0

Eh bien, pour répondre à ma propre méta-question, j'ai assigné une adresse IP élastique à mon instance, puis créé un enregistrement A pour cela. Vous pouvez également créer un enregistrement CNAME pour le nom DNS public de l'instance, mais ce n'est pas stable puisque le nom DNS public change lorsque vous arrêtez et redémarrez l'instance. –

+5

En fait, une fois que vous affectez une adresse IP élastique, vous pouvez prédire le nom DNS public qui sera créé: ec2 - {{Elastic IP}}. {{AWS AZ}}. Compute.amazonaws.com. Si vous affectez un nom de c à ce DNS dans la route 53, il doit toujours pointer correctement vers l'instance à laquelle vous attribuez l'EIP. Cela a l'avantage de se résoudre à l'IP EC2 interne lorsque vous êtes à l'intérieur du réseau EC2 et l'adresse IP publique correcte à l'extérieur. – jslatts

Répondre

14

j'ai écrit ma propre solution à ce problème depuis que je suis malheureux d'autres approches qui ont été présentés ici. L'utilisation des outils Amazon CLI est agréable, mais ils ont tendance à être plus lent que les appels API directs utilisant d'autres bibliothèques API Amazon (Ruby par exemple).

Voici un lien vers mon AWS Route53 DNS instance update Gist. Il contient une stratégie IAM et un script Ruby. Vous devez créer un nouvel utilisateur dans le panneau IAM, le mettre à jour avec la règle attachée (avec votre identifiant de zone) et définir les informations d'identification et les paramètres dans le script Ruby. Le premier paramètre est l'alias de nom d'hôte de votre instance dans votre zone hébergée. nom d'hôte privé de l'instance est à <hostname>.<domain> et aliasé nom d'hôte public instance est à aliasé <hostname>-public.<domain>

MISE À JOUR: Voici un lien vers l'enregistrement AWS Route53 DNS instance update init.d script hostnames lorsque exemple des bottes. En voici un autre si vous voulez utiliser AWS Route53 DNS load-balancing de manière similaire.

+0

Bien sûr et c'est une ressource supplémentaire que vous devez gérer. Cela a un but différent. – kixorz

1

Avec Route 53 vous pouvez créer des enregistrements d'alias qui tracent un Elastic Load Balancer (ELB):

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

+4

Ceci est une façon coûteuse de résoudre le problème, car il nécessite et ELB que vous avez à payer pour ... Je suis en fait surpris que Amazon ne fournit pas une solution à ce problème très commun !!! – Sdra

+5

Il existe une solution. Vous pouvez utiliser une adresse IP élastique qui est gratuite si elle est utilisée. Et si vous avez besoin de plus de 5 d'entre eux, vous pouvez demander d'augmenter la limite pour votre compte. –

6

Si vous vous en tenez à utiliser route53, vous pouvez faire un script qui met à jour l'enregistrement CNAME pour cette instance à chaque redémarrage.

voir ceci ->http://cantina.co/automated-dns-for-aws-instances-using-route-53/ (divulgation, je ne l'ai pas créé ce, bien que je l'ai utilisé comme point de départ pour une situation similaire)

mieux encore, parce que vous avez mentionné être en mesure de tourner en programmation cas, cela approche devrait vous guider à cette fin.

voir aussi ->http://docs.pythonboto.org/en/latest/index.html

0

Je n'ai pas essayé sur l'instance aws EC2 mais cela devrait fonctionner aussi. J'ai écrit un petit programme Java qui détecte l'adresse IP publique de la machine et met à jour un certain enregistrement sur aws route 53.

La seule exigence est que vous ayez besoin de Java installé sur votre instance EC2.

Le projet est hébergé sur https://github.com/renatodelgaudio/awsroute53 et vous êtes également libre de le modifier dans le cas où vous en avez besoin

Vous pouvez le configurer pour exécuter au démarrage ou comme tâche cron pour que votre dossier sont mis à jour avec le nouveau IP publique suivant des instructions similaires à celles-ci Linux manual installation steps

0

L'utilisation de Cloudwatch, Route53 et Lambda est également une option si vous hébergez au moins une partie de votre DNS dans Route53. L'avantage est que vous n'avez besoin d'aucune application en cours d'exécution sur l'instance elle-même. Pour utiliser cette approche, vous devez configurer une règle Cloudwatch pour déclencher une fonction Lambda chaque fois que l'état d'une instance EC2 passe à l'exécution. La fonction Lambda peut ensuite récupérer l'adresse IP publique de l'instance et mettre à jour l'enregistrement DNS dans Route53.

Le Lambda pourrait ressembler à ceci (en utilisant l'exécution Node.js):

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); 
     }); 
    }); 
} 

Vous devrez exécuter le Lambda avec un rôle qui a des autorisations pour décrire les instances EC2 et les enregistrements de mise à jour dans Route53.

Questions connexes