Подтвердить что ты не робот

Попросите ли маршрут 53 указать экземпляр вместо IP или CNAME?

Мы используем DNS Route 53 для указания экземпляра EC2. Есть ли способ заставить Route 53 указывать на экземпляр напрямую, а не на Elastic IP или CNAME?

У меня есть несколько причин для этого:

  • Я не хочу записывать IP-адрес.

  • CNAMEs ненадежны, потому что, если экземпляр спускается и возвращается, полное имя ec2-X-X-X-X.compute-1.amazonaws.com изменится.

  • В будущем мне нужно развернуть экземпляры программным способом и обратиться к ним с субдоменом, и я не вижу простого способа сделать это с помощью эластичных IP-адресов или CNAME.

Какой лучший подход?

4b9b3361

Ответ 1

Я написал свое собственное решение этой проблемы, так как был недоволен другими подходами, которые были представлены здесь. Использование инструментов Amazon CLI хорошо, но они IMHO, как правило, медленнее, чем прямые вызовы API, используя другие библиотеки API Amazon (например, Ruby).

Здесь ссылка на мое обновление экземпляра DNS AWS Route53 Gist. Он содержит политику IAM и Ruby script. Вы должны создать нового пользователя на панели IAM, обновить его с помощью установленной политики (с идентификатором вашей зоны в ней) и установить учетные данные и параметры в Ruby script. Первый параметр - это псевдоним имени хоста для вашего экземпляра в вашей размещенной зоне. Экземпляр частного хоста экземпляра имеет псевдоним <hostname>.<domain>, а имя общедоступного хоста экземпляра - псевдоним <hostname>-public.<domain>

UPDATE: здесь ссылка на обновление экземпляра DNS-сервера AWS Route53 init.d script регистрирует имена хостов при загрузке экземпляра. Здесь еще один, если вы хотите использовать AWS Route53 DNS-балансировку таким же образом.

Ответ 2

Если вы придерживаетесь использования route53, вы можете сделать script, который обновляет запись CNAME для этого экземпляра каждый раз при перезагрузке.

см. это → http://cantina.co/automated-dns-for-aws-instances-using-route-53/ (раскрытие, я не создавал этого, хотя я использовал его как точку перехода для аналогичной ситуации )

еще лучше, потому что вы упомянули о возможности размножения экземпляров программным способом, этот подход должен помочь вам в этом.

см. также → http://docs.pythonboto.org/en/latest/index.html

Ответ 4

Использование комбинации Cloudwatch, Route53 и Lambda также является опцией, если вы размещаете хотя бы часть своих DNS в Route53. Преимущество этого в том, что вам не нужны никакие приложения, запущенные на самом экземпляре.

Чтобы использовать этот подход, вы настраиваете правило Cloudwatch для запуска функции Lambda при каждом изменении статуса экземпляра EC2. Затем функция Lambda может получить общедоступный IP-адрес экземпляра и обновить запись DNS в Route53.

Lambda может выглядеть примерно так (используя Node.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);
        });
    });
}

Вам нужно будет выполнить Лямбду с ролью, которая имеет разрешения для описания экземпляров EC2 и обновлений записей в Route53.

Ответ 5

Я не пробовал экземпляр aws EC2, но он тоже должен работать. Я написал небольшую программу Java, которая обнаруживает общедоступный IP-адрес устройства и обновляет определенную запись на маршруте aws 53.

Единственное требование - вам нужно, чтобы Java была установлена ​​в вашем экземпляре EC2.

Проект размещен на https://github.com/renatodelgaudio/awsroute53, и вы также можете его модифицировать, если вам это нужно

Вы можете настроить его для запуска во время загрузки или в качестве задания crontab, чтобы ваша запись обновлялась новым публичным IP-адресом, следуя инструкциям, подобным этим Инструкции по установке Linux вручную

Ответ 6

Вот как я нашел успех.

Документация AWS в основном предусматривает следующие шаги:

  1. В консоли AWS скопируйте общедоступный IP-адрес EC2

  2. В Route 53 выберите правильную "Hosted zone" и нажмите кнопку "Create Record Set"

  3. name: [желаемое имя субдомена]

  4. Тип: A- Адрес IPv4
  5. Псевдоним: Нет
  6. TTL: 300
  7. Значение: [после вашего IP-адреса EC2]
  8. Нажмите кнопку "Сохранить запись".

enter image description here

Источник: https://serverfault.com/info/363292/ec2-route53-how-do-i-assign-my-new-domain-name-to-an-instance