路由53是否指向实例而不是IP或CNAME?
我们使用Route 53 DNS指向EC2实例。有没有办法让Route 53直接指向实例,而不是弹性IP或CNAME?路由53是否指向实例而不是IP或CNAME?
我对这个多种原因:
我不想烧的IP。
CNAMEs不可靠,因为如果某个实例出现故障并恢复运行,则全名ec2-X-X-X-X.compute-1.amazonaws.com将发生更改。在未来,我需要以编程方式创建实例并使用子域来解决它们,并且我发现使用弹性IP或CNAME无法轻松实现此目的。
什么是最好的方法?
我写我自己解决这个问题,因为我是不满意这里已提交的其他方法。使用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,还有另外一种。
当然,这是你必须管理的额外资源。这有不同的目的。 – kixorz 2016-06-14 00:23:45
了Route 53,您可以创建别名记录映射到一个弹性负载均衡(ELB):
http://docs.amazonwebservices.com/Route53/latest/DeveloperGuide/HowToAliasRRS.html
这是一个昂贵的方法来解决这个问题,因为它需要和ELB,你必须支付...我真的很惊讶,亚马逊没有提供这个非常常见的问题的解决方案! – Sdra 2012-10-11 10:07:01
有一个解决方案。您可以使用一个弹性IP,如果它正在使用,它是免费的。如果您需要超过5个,则可以要求增加帐户的限额。 – 2012-10-12 17:31:25
如果你坚持使用route53,你可以做一个脚本,更新的CNAME记录该实例每次重新启动。
看到这一点 - >http://cantina.co/automated-dns-for-aws-instances-using-route-53/(披露,我没有创造出这一点,虽然我用它作为一个跳跃点类似的情况)
更好,因为你提到的能够以编程方式旋转起来的情况下,这应该引导你达到目的。
我还没有尝试过aws EC2实例,但它也应该工作。 我写了一个小型的Java程序,用于检测机器的公共IP,并更新aws route 53上的某个记录。
唯一的要求是您需要在您的EC2实例上安装Java。
该项目托管在https://github.com/renatodelgaudio/awsroute53,你也可以自由地修改它的情况下你需要它
你可以将其配置为在启动时或作为一个crontab作业来运行,使您的记录使用新版更新公共IP遵循类似于这些指令的指令 Linux manual installation steps
如果您在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实例和更新记录的角色来执行拉姆达。
这可能不会得到回答,但我感兴趣的答案了。如果我自己的“example.com”,并有自己的DNS服务器,我可以直接“foo.example.com”到EC2实例? – 2012-05-01 23:56:26
好了,回答我的元问题,我分配一个弹性IP到我的实例,然后创建一个记录它。您也可以为实例的公用DNS名称创建一个CNAME记录,但这样做并不稳定,因为当您停止并重新启动实例时,公用DNS名称会发生更改。 – 2012-05-02 17:21:46
实际上,一旦分配了弹性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