2012-04-10 65 views
36

我们使用Route 53 DNS指向EC2实例。有没有办法让Route 53直接指向实例,而不是弹性IP或CNAME?路由53是否指向实例而不是IP或CNAME?

我对这个多种原因:

  1. 我不想烧的IP。

  2. CNAMEs不可靠,因为如果某个实例出现故障并恢复运行,则全名ec2-X-X-X-X.compute-1.amazonaws.com将发生更改。在未来,我需要以编程方式创建实例并使用子域来解决它们,并且我发现使用弹性IP或CNAME无法轻松实现此目的。

什么是最好的方法?

+3

这可能不会得到回答,但我感兴趣的答案了。如果我自己的“example.com”,并有自己的DNS服务器,我可以直接“foo.example.com”到EC2实例? – 2012-05-01 23:56:26

+0

好了,回答我的元问题,我分配一个弹性IP到我的实例,然后创建一个记录它。您也可以为实例的公用DNS名称创建一个CNAME记录,但这样做并不稳定,因为当您停止并重新启动实例时,公用DNS名称会发生​​更改。 – 2012-05-02 17:21:46

+5

实际上,一旦分配了弹性IP,您就可以预测将要创建的公有DNS名称:ec2 - {{Elastic IP}}。{{AWS AZ}}。compute.amazonaws.com。如果您在路由53中为该DNS分配了一个cname,它应该始终正确指向您分配EIP的实例。当您处于EC2网络内部时,这具有解决内部EC2 IP的问题,并且可以在外部使用正确的公共弹性IP。 – jslatts 2012-07-31 21:01:10

回答

14

我写我自己解决这个问题,因为我是不满意这里已提交的其他方法。使用Amazon CLI工具很不错,但是他们的IMHO往往比使用其他Amazon API库的直接API调用要慢(例如Ruby)。

这是我的AWS Route53 DNS instance update Gist的链接。它包含一个IAM策略和一个Ruby脚本。您应该在IAM面板中创建一个新用户,使用附加的策略(包含您的区域ID)更新它,并在Ruby脚本中设置凭据和参数。第一个参数是您的托管区域中您的实例的主机名别名。实例的专用主机名化名为<hostname>.<domain>和实例的公共主机名化名为<hostname>-public.<domain>

UPDATE:下面是AWS Route53 DNS instance update init.d script链接注册主机名实例启动时。如果想以类似的方式使用AWS Route53 DNS load-balancing,还有另外一种。

+0

当然,这是你必须管理的额外资源。这有不同的目的。 – kixorz 2016-06-14 00:23:45

1

了Route 53,您可以创建别名记录映射到一个弹性负载均衡(ELB):

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

+4

这是一个昂贵的方法来解决这个问题,因为它需要和ELB,你必须支付...我真的很惊讶,亚马逊没有提供这个非常常见的问题的解决方案! – Sdra 2012-10-11 10:07:01

+5

有一个解决方案。您可以使用一个弹性IP,如果它正在使用,它是免费的。如果您需要超过5个,则可以要求增加帐户的限额。 – 2012-10-12 17:31:25

0

我还没有尝试过aws EC2实例,但它也应该工作。 我写了一个小型的Java程序,用于检测机器的公共IP,并更新aws route 53上的某个记录。

唯一的要求是您需要在您的EC2实例上安装Java。

该项目托管在https://github.com/renatodelgaudio/awsroute53,你也可以自由地修改它的情况下你需要它

你可以将其配置为在启动时或作为一个crontab作业来运行,使您的记录使用新版更新公共IP遵循类似于这些指令的指令 Linux manual installation steps

0

如果您在Route53中至少部署dns,则还可以使用Cloudwatch,Route53和Lambda的组合。这样做的好处是您不需要在实例本身上运行任何应用程序。

要使用此方法,请配置Cloudwatch规则以在EC2实例的状态更改为运行时触发Lambda函数。然后lambda函数可以检索实例的公网IP地址,并更新Route53的DNS记录。

拉姆达可能看起来像这样(使用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); 
     }); 
    }); 
} 

您将需要有权限来描述Route53 EC2实例和更新记录的角色来执行拉姆达。

相关问题