A Route 53 aponta para uma instância em vez de um IP ou CNAME?

Estamos a usar a estrada 53 DNS para apontar para uma instância EC2. Existe alguma maneira de fazer a Route 53 apontar diretamente para a instância, em vez de um elástico IP ou CNAME?

Tenho várias razões para isto:

  1. não quero queimar um IP.

  2. Os CNAMEs não são fiáveis, porque se uma instância cair e voltar a subir, o nome completo, ec2-X-X-X-X.compute-1.amazonaws.com, vai mudar.

  3. no futuro, preciso de criar instâncias. programaticamente e abordá-los com um subdomínio, e eu não vejo nenhuma maneira fácil de fazer isso com IPs elásticos ou CNAMEs.

Qual é a melhor abordagem?

Author: ccleve, 2012-04-11

5 answers

[[3] eu escrevi minha própria solução para este problema desde que eu estava insatisfeito com outras abordagens que foram apresentadas aqui. O uso de ferramentas Amazon CLI é bom, mas elas tendem a ser mais lentas do que as chamadas diretas da API usando outras bibliotecas da Amazon API (Ruby, por exemplo).

Aqui está um link para o meu AWS Route53 DNS instance update Gist. Ele contém uma política do IAM e um script Ruby. Você deve criar um novo usuário no painel IAM, atualizá-lo com a Política anexada (com o seu ID de zona nele) e definir o credenciais e parâmetros no script Ruby. O primeiro parâmetro é o nome alternativo da máquina para a sua instância na sua zona hospedada. O nome da máquina privada da instância é igual a <hostname>.<domain> e o nome da máquina pública da instância é igual a <hostname>.<domain><hostname>-public.<domain>

UPDATE : aqui está uma ligação para AWS Route53 DNS instance update init.d script a registar os nomes das máquinas quando botas de instância. Aqui está outra se quiser usar AWS Route53 DNS load-balanceamento de forma semelhante.

 15
Author: kixorz, 2014-10-12 05:00:48

Se continuar a usar o route53, poderá fazer um programa que actualiza o registo do CNAME para essa instância sempre que ele reiniciar.

Ver isto - > http://cantina.co/automated-dns-for-aws-instances-using-route-53 / (divulgação, eu não criei isto, embora o tenha usado como ponto de salto para uma situação semelhante) {[[2]} Melhor ainda, porque você mencionou ser capaz de girar instâncias programaticamente, esta abordagem deve guiá-lo para esse fim.

Ver também - > http://docs.pythonboto.org/en/latest/index.html

 6
Author: gabriel, 2014-01-18 04:05:54

Com a estrada 53, pode criar registos de nomes alternativos que mapeiam um Balancer de carga elástica (ELB):

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

 1
Author: Tomas Markauskas, 2012-04-10 22:11:51
Ainda não experimentei o EC2 da aws, mas também deve funcionar. Escrevi um pequeno programa Java que detecta o IP público da máquina e actualiza um certo registo na aws route 53.

O único requisito é que você precise de Java instalado na sua instância EC2.

O projecto está hospedado em https://github.com/renatodelgaudio/awsroute53 e também pode modificá-lo caso precise

Você poderia configurá-lo para executar na hora de arranque ou como uma tarefa crontab para que seu registro seja atualizado com o novo IP público seguindo instruções semelhantes a estes passos de instalação manual do Linux

 0
Author: Renato Del Gaudio, 2015-02-01 08:22:16

Usar uma combinação de Cloudwatch, Route53 e Lambda também é uma opção se hospedar pelo menos uma parte do seu dns na Route53. A vantagem disso é que você não precisa de nenhuma aplicação rodando na instância em si.

Para usar esta abordagem, configura uma regra de Cloudwatch para activar uma função Lambda sempre que o estado de uma instância EC2 muda para a execução. A função Lambda pode então recuperar o endereço IP público da instância e atualizar o registro dns em Route53.

O Lambda pode ser parecido com isto (usando o nó.js runtime):

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

Terá de executar o Lambda com uma função que tem permissões para descrever instâncias EC2 e actualizar registos em Route53.

 0
Author: sihaya, 2017-11-12 21:44:37