it-swarm.com.de

Verweist Route 53 auf eine Instanz statt auf eine IP oder einen CNAME?

Wir verwenden Route 53 DNS, um auf eine EC2-Instanz zu verweisen. Gibt es eine Möglichkeit, die Route 53 direkt auf die Instanz anstatt auf eine elastische IP oder einen CNAME zu verweisen?

Ich habe mehrere Gründe dafür:

  1. Ich möchte keine IP brennen.

  2. CNAMEs sind unzuverlässig, denn wenn eine Instanz ausfällt und wieder hochkommt, ändert sich der vollständige Name ec2-X-X-X-X.compute-1.amazonaws.com.

  3. In Zukunft muss ich Instanzen programmgesteuert hochfahren und mit einer Subdomäne ansprechen, und ich sehe keine einfache Möglichkeit, dies mit elastischen IPs oder CNAMEs zu tun.

Was ist der beste Ansatz?

41
ccleve

Ich habe meine eigene Lösung für dieses Problem geschrieben, da ich mit den hier vorgestellten Ansätzen nicht zufrieden war. Die Verwendung von Amazon CLI-Tools ist Nice, aber sie sind im Allgemeinen langsamer als direkte API-Aufrufe, die andere Amazon API-Bibliotheken verwenden (z. B. Ruby).

Hier ist ein Link zu meinem AWS Route53-DNS-Instanz-Update Gist. Es enthält eine IAM-Richtlinie und ein Ruby-Skript. Sie sollten einen neuen Benutzer im IAM-Bedienfeld erstellen, ihn mit der angefügten Richtlinie (mit Ihrer Zonen-ID) aktualisieren und die Anmeldeinformationen und Parameter im Ruby-Skript festlegen. Erster Parameter ist der Hostname-Alias ​​für Ihre Instanz in Ihrer gehosteten Zone. Der private Hostname der Instanz hat einen Aliasnamen für <hostname>.<domain> und der öffentliche Hostname der Instanz hat einen Aliasnamen für <hostname>-public.<domain>.

UPDATE: Hier ist ein Link zum AWS Route53-DNS-Instanz-Aktualisierungs-Init.d-Skript Registrieren von Hostnamen beim Starten der Instanz. Hier ist eine weitere, wenn Sie AWS Route53 DNS-Lastausgleich auf ähnliche Weise verwenden möchten.

16
kixorz

Wenn Sie route53 verwenden, können Sie ein Skript erstellen, das den CNAME-Datensatz für diese Instanz bei jedem Neustart aktualisiert. 

siehe dies -> http://cantina.co/automated-dns-for-aws-instances-using-route-53/ (Offenlegung, ich habe dies nicht erstellt, obwohl ich es als Sprungpunkt für verwendet habe eine ähnliche Situation)

noch besser, da Sie erwähnt haben, dass Sie Instanzen programmgesteuert hochfahren können, sollte dieser Ansatz Sie zu diesem Zweck führen.

siehe auch -> http://docs.pythonboto.org/de/latest/index.html

6
gabriel

Mit Route 53 können Sie Aliasdatensätze erstellen, die einem Elastic Load Balancer (ELB) zugeordnet werden:

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

1

Die Verwendung einer Kombination aus Cloudwatch, Route53 und Lambda ist auch eine Option, wenn Sie mindestens einen Teil Ihrer DNS in Route53 hosten. Dies hat den Vorteil, dass auf der Instanz selbst keine Anwendungen ausgeführt werden müssen.

Um diesen Ansatz zu verwenden, konfigurieren Sie eine Cloudwatch-Regel, um eine Lambda-Funktion auszulösen, wenn der Status einer EC2-Instanz geändert wird. Die Lambda-Funktion kann dann die öffentliche IP-Adresse der Instanz abrufen und den DNS-Datensatz in Route53 aktualisieren.

Der Lambda könnte ungefähr so ​​aussehen (mit Node.js-Laufzeit):

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

Sie müssen den Lambda mit einer Rolle ausführen, die über Berechtigungen zum Beschreiben von EC2-Instanzen und Aktualisierungsdatensätzen in Route53 verfügt.

1
sihaya

Ich habe es nicht an der aws EC2-Instanz versucht, aber es sollte auch funktionieren. Ich habe ein kleines Java-Programm geschrieben, das die öffentliche IP-Adresse der Maschine erkennt und einen bestimmten Datensatz auf der aws-Route 53 aktualisiert.

Die einzige Voraussetzung ist, dass Sie Java auf Ihrer EC2-Instanz installiert haben.

Das Projekt wird auf https://github.com/renatodelgaudio/awsroute53 gehostet. Sie können es auch ändern, falls Sie es benötigen

Sie können es so konfigurieren, dass es beim Booten oder als Crontab-Job ausgeführt wird, sodass Ihr Datensatz mit der neuen öffentlichen IP-Adresse aktualisiert wird. Befolgen Sie dazu die folgenden Anweisungen Manuelle Installationsschritte für Linux

0