路由53指向一个实例,而不是IP或CNAME?

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

我有多个原因:

  1. 我不想刻录IP。

  2. CNAME是不可靠的,因为如果一个实例出现故障并恢复,那么全名ec2-XXXX.compute-1.amazonaws.com将会改变。

  3. 在将来,我需要以编程方式启动实例,并使用子域来解决这些实例,并且我发现使用弹性IP或CNAME来做到这一点并不容易。

什么是最好的方法?

我对这个问题写了自己的解决scheme,因为我对这里介绍的其他方法感到不满。 使用Amazon CLI工具是不错的,但是他们的恕我直言往往比使用其他Amazon API库的直接API调用要慢(例如Ruby)。

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

更新 :以下是AWS Route53 DNS实例更新init.d脚本在实例引导时注册主机名的链接。 如果希望以类似的方式使用AWS Route53 DNS负载均衡 ,那么还有另外一种方法。

如果您坚持使用route53,您可以创build一个脚本,每次重新启动时都会更新该实例的CNAMElogging。

看到这个 – > http://cantina.co/automated-dns-for-aws-instances-using-route-53/ (披露,我没有创build这个,虽然我用它作为一个类似的情况跳跃点)

更好的是,因为你提到能够以编程方式启动实例,这种方法应该引导你达到目的。

另见 – > http://docs.pythonboto.org/en/latest/index.html

通过Route 53,您可以创build映射到Elastic Load Balancer(ELB)的别名logging:

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

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

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

该项目托pipe在https://github.com/renatodelgaudio/awsroute53 ,你也可以自由修改它,以防万一你需要它

您可以将其configuration为在引导时运行或作为crontab作业运行,以便使用新的公用IP按照与这些Linux手动安装步骤类似的说明更新logging

使用Cloudwatch,Route53和Lambda的组合也是一种select,如果您在Route53中至less部分使用dns。 这样做的好处是你不需要在实例本身上运行任何应用程序。

要使用此方法,只要EC2实例的状态更改为运行,就可以configurationCloudwatch规则以触发Lambda函数。 然后,Lambda函数可以检索实例的公共IP地址,并更新Route53中的dnslogging。

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

您需要使用有权限描述EC2实例并更新Route53中的logging的angular色来执行Lambda。