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

时间:2012-04-10 21:16:42

标签: amazon-ec2 dns amazon-route53

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

我有多种原因:

  1. 我不想刻录IP。

  2. CNAME不可靠,因为如果某个实例发生故障并重新启动,则全名ec2-X-X-X-X.compute-1.amazonaws.com将会更改。

  3. 将来,我需要以编程方式启动实例并使用子域解决它们,我认为使用弹性IP或CNAME没有简单的方法。

  4. 最好的方法是什么?

5 个答案:

答案 0 :(得分:16)

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

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

更新:这是实例启动时AWS Route53 DNS instance update init.d script注册主机名的链接。如果想以类似的方式使用AWS Route53 DNS load-balancing,这是另一个。

答案 1 :(得分:6)

如果您坚持使用route53,则可以创建一个脚本,以便每次重新启动时更新该实例的CNAME记录。

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

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

另见 - &gt; http://docs.pythonboto.org/en/latest/index.html

答案 2 :(得分:3)

如果您在Route53中至少部分dns托管,则使用Cloudwatch,Route53和Lambda的组合也是一种选择。这样做的好处是您不需要在实例上运行任何应用程序。

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

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中记录的权限的角色来执行Lambda。

答案 3 :(得分:1)

使用Route 53,您可以创建映射到Elastic Load Balancer(ELB)的别名记录:

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

答案 4 :(得分:0)

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

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

该项目托管于https://github.com/renatodelgaudio/awsroute53,您也可以根据需要随意修改

您可以将其配置为在引导时运行或作为crontab作业运行,以便使用新的公共IP更新您的记录,遵循类似于这些的说明 Linux manual installation steps