web-dev-qa-db-fra.com

Route 53 pointe-t-il sur une instance plutôt que sur une adresse IP ou CNAME?

Nous utilisons le DNS de la route 53 pour pointer vers une instance EC2. Existe-t-il un moyen de faire en sorte que Route 53 pointe directement sur l'instance plutôt que sur une adresse IP élastique ou CNAME?

J'ai plusieurs raisons pour cela:

  1. Je ne veux pas graver une adresse IP.

  2. 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, change.

  3. À l'avenir, je devrais créer des instances par programme et les traiter avec un sous-domaine, et je ne vois pas de moyen facile de le faire avec des adresses IP élastiques ou des noms CNAME.

Quelle est la meilleure approche?

41
ccleve

J'ai écrit ma propre solution à ce problème car je n'étais pas satisfait des autres approches présentées ici. Utiliser les outils Amazon CLI est agréable, mais leur IMHO a tendance à être plus lent que les appels d'API directs utilisant d'autres bibliothèques d'API Amazon (Ruby par exemple).

Voici un lien vers ma mise à jour d'instance DNS AWS Route53 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 stratégie 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 du nom d'hôte de votre instance dans votre zone hébergée. Le nom d'hôte privé de l'instance est associé à <hostname>.<domain> et le nom d'hôte public de l'instance est associé à <hostname>-public.<domain>.

UPDATE: voici un lien vers Script d'init.d de mise à jour d'instance DNS AWS Route53 enregistrement des noms d'hôte lors du démarrage de l'instance. En voici un autre si vous souhaitez utiliser l'équilibrage de charge DNS AWS Route53 de la même manière.

16
kixorz

Si vous vous en tenez à utiliser route53, vous pouvez créer 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 n'ai pas créé cela, même si je l'ai utilisé comme point de départ une situation similaire)

mieux encore, puisque vous avez mentionné la possibilité de multiplier les instances par programme, cette approche devrait vous guider dans cette voie.

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

6
gabriel

Avec Route 53, vous pouvez créer des enregistrements d'alias mappés sur un Elastic Load Balancer (ELB):

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

1
Tomas Markauskas

L'utilisation d'une combinaison 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 pas besoin d'applications s'exécutant sur l'instance elle-même.

Pour utiliser cette approche, vous configurez une règle Cloudwatch afin de déclencher une fonction Lambda chaque fois que le statut d'une instance EC2 devient en cours d'exécution. La fonction Lambda peut ensuite extraire l'adresse IP publique de l'instance et mettre à jour l'enregistrement DNS dans Route53.

Le Lambda pourrait ressembler à ceci (en utilisant le runtime 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 Lambda avec un rôle disposant des autorisations nécessaires pour décrire les instances EC2 et mettre à jour les enregistrements dans Route53.

1
sihaya

Je n'ai pas essayé sur une 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 la route aws 53.

La seule exigence est que Java soit installé sur votre instance EC2.

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

Vous pouvez le configurer pour qu'il s'exécute au démarrage ou en tant que tâche crontab afin que votre enregistrement soit mis à jour avec la nouvelle adresse IP publique en suivant des instructions similaires à celles-ci Etapes d'installation manuelle sous Linux

0
Renato Del Gaudio