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

Amazon ec2 路由53是否指向实例而不是IP或CNAME?,amazon-ec2,dns,amazon-route53,Amazon Ec2,Dns,Amazon Route53,我们正在使用路由53 DNS指向EC2实例。有没有办法让路由53直接指向实例,而不是指向弹性IP或CNAME 我有多种原因: 我不想烧掉IP CNAMEs是不可靠的,因为如果一个实例发生故障并重新启动,则其全名ec2-X-X-X-X.compute-1.amazonaws.com将发生变化 将来,我需要以编程方式启动实例,并使用子域对其进行处理,我认为使用弹性IP或CNAMEs都不容易做到这一点 最佳方法是什么?使用Route 53,您可以创建映射到弹性负载平衡器(ELB)的别名记录: 如果您坚

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

我有多种原因:

  • 我不想烧掉IP

  • CNAMEs是不可靠的,因为如果一个实例发生故障并重新启动,则其全名ec2-X-X-X-X.compute-1.amazonaws.com将发生变化

  • 将来,我需要以编程方式启动实例,并使用子域对其进行处理,我认为使用弹性IP或CNAMEs都不容易做到这一点


  • 最佳方法是什么?

    使用Route 53,您可以创建映射到弹性负载平衡器(ELB)的别名记录:


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

    参见此->(披露,我并没有创建此文件,尽管我将其用作类似情况的跳转点)

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


    另请参见->

    我写了自己的解决方案,因为我对这里介绍的其他方法不满意。使用AmazonCLI工具很好,但它们往往比使用其他AmazonAPI库(例如Ruby)的直接API调用慢

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


    更新:这里有一个链接,指向在实例启动时注册主机名。如果想要以类似的方式使用,这里还有一个。

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

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

    项目位于上,如果需要,您也可以自由修改它

    您可以将其配置为在启动时运行或作为crontab作业运行,以便按照类似于以下说明的新公共IP更新记录

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

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

    Lambda可以是这样的(使用Node.js运行时):

    var AWS=require('AWS-sdk');
    var ZONE_ID='Z1L432423';
    var RECORD_NAME='testaws.domain.tld';
    变量实例_ID='i-423423ccqq';
    exports.handler=(事件、上下文、回调)=>{
    var retrieveIpAddressOfEc2Instance=函数(instanceId,ipAddressCallback){
    var ec2=新的AWS.ec2();
    变量参数={
    instanceId:[instanceId]
    };
    ec2.描述说明(参数、函数(错误、数据){
    如果(错误){
    回调(err);
    }否则{
    ipAddressCallback(data.Reservations[0]。实例[0]。PublicIpAddress);
    }            
    });
    }
    var updateARecord=函数(zoneId、名称、ip、updateARecordCallback){
    var route53=新AWS.route53();
    变量dnsParams={
    变更批次:{
    变化:[
    {
    行动:“向上插入”,
    资源记录集:{
    姓名:姓名,,
    资源记录:[
    {
    价值:ip
    }
    ], 
    TTL:60,
    类型:“A”
    }
    }
    ], 
    评论:“由lambda更新”
    },
    HostedZoneId:zoneId
    };
    路由53.ChangeResourceRecordset(DNSPARAM,函数(err,数据){
    如果(错误){
    回调(错误、数据);
    }否则{
    UpdateRecordCallback();
    }            
    });
    }
    retrieveIpAddressOfEc2Instance(实例ID,函数(ip){
    UpdateRecord(区域ID、记录名称、ip、函数(){
    回调(null,'记录更新为:'+ip');
    });
    });
    }
    

    您需要使用具有描述EC2实例和更新Route53中记录权限的角色来执行Lambda。

    这可能不会得到回答,但我也对答案感兴趣。如果我拥有“example.com”并拥有自己的DNS服务器,我可以将“foo.example.com”指向EC2实例吗?好吧,为了回答我自己的元问题,我为我的实例分配了一个弹性IP,然后为它创建了一个A记录。您还可以为实例的公共DNS名称创建CNAME记录,但这并不稳定,因为当您停止并重新启动实例时,公共DNS名称会发生更改。实际上,一旦分配了弹性IP,您就可以预测将创建的公共DNS名称:ec2-{{elastic IP}.{{AWS AZ}}.compute.amazonaws.com。如果在路由53中将cname分配给该DNS,则它应始终正确指向您将EIP分配给的实例。这具有以下优点: