是否可以使用 AWS Cloudformation 模板将 Loadbalancers DNSname 连接到 Route53?

If it possible connect Loadbalancers DNSname to Route53 using AWS Cloudformation template?

我尝试连接到 Route53 的 Loadbalancer DNS 名称。 让我们看一个例子。 这是资源中模板的 Loadbabancer:

"RestELB" : {
        "Type" : "AWS::ElasticLoadBalancing::LoadBalancer",
        "DependsOn": "AttachGateway",
        "Properties": {
            "LoadBalancerName": {"Fn::Join": ["",["Rest-ELB-", {"Ref": "VPC"}]]},
            "CrossZone" : "true",
            "Subnets": [{ "Ref": "PublicSubnet1" },{ "Ref": "PublicSubnet2" }],
            "Listeners" : [
                {"LoadBalancerPort" : "80", "InstancePort" : "80","Protocol" : "HTTP"},
                {"LoadBalancerPort" : "6060", "InstancePort" : "6060","Protocol" : "HTTP"}
            ],
        }
    },

这是 Route53:

"ApiRecordSet" : {
      "Type" : "AWS::Route53::RecordSet",
      "Properties" : {
        "AliasTarget" :{
          "DNSName" : [
            {"Fn::Join": ["", [{"ElasticLoadBalancer": "DNSName"},"."]]}
          ],
          "EvaluateTargetHealth" : "Boolean",
          "HostedZoneId" : "String"
        },
        "HostedZoneName" : "example.net.",
        "Comment" : "A records for my frontends.",
        "Name" : "api.example.net.",
        "Type" : "A",
        "TTL" : "900",
      }
    }

只是放 {"ElasticLoadBalancer": "DNSName"} 没用。有人可以建议或给我正确的添加方法吗?

谢谢!

您很可能想获取引用为 RestELB 的 LoadBalancer 的属性 DNSName。所以你需要一些 Fn::GetAtt 的东西,比如 (untested)

   "ApiRecordSet" : {
      "Type" : "AWS::Route53::RecordSet",
      "Properties" : {
        "AliasTarget" :{
          "DNSName" : { "Fn::GetAtt" : [ "RestELB", "DNSName" ]},
          "EvaluateTargetHealth" : "Boolean",
          "HostedZoneId" : "String"
        },
        "HostedZoneName" : "example.net.",
        "Comment" : "A records for my frontends.",
        "Name" : "api.example.net.",
        "Type" : "A"
      }
    }

请务必阅读有关 AWS::Route53::Recordset AliasTarget 类型的 CloudFormation 文档: http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-aliastarget.html

这是为 ELB 创建别名目标时在我的 CloudFormation 中的样子:

"Route53LoadBalancerAlias" : {
      "Type" : "AWS::Route53::RecordSet",
      "Properties" : {
          "AliasTarget" : {
          "DNSName" : { "Fn::GetAtt" : [ "ELB", "DNSName" ]},
          "EvaluateTargetHealth" : False,
          "HostedZoneId" : { "Fn::GetAtt" : [ "ELB", "CanonicalHostedZoneID" ]}
        },

对于负载均衡器,使用负载均衡器的规范托管区域 ID。对于 Amazon S3,使用存储桶网站端点的托管区域 ID。对于 CloudFront,使用 Z2FDTNDATAQYW2。有关其他服务的托管区域 ID 列表,请参阅 AWS 区域和终端节点中的相关服务。

对于 2018 年阅读此答案的任何人,我使用 CanonicalHostedZoneNameID 而不是 CanonicalHostedZoneID

来工作
"MyRecordSet": {
      "Type": "AWS::Route53::RecordSet",
      "Properties": {
        "HostedZoneName" : "example.com.",
        "Name": "abc.example.com.",
        "Type": "A",
        "AliasTarget": {
            "HostedZoneId" : {"Fn::GetAtt": ["MyELB", "CanonicalHostedZoneNameID"]},
            "DNSName": {"Fn::GetAtt": ["MyELB", "DNSName"]},
            "EvaluateTargetHealth": "false"
        }
      }
    }

用于部署引用同一模板中部署的 ELB 的 RecordSet 的 YAML。

  Route53RecordSet:
    Type: AWS::Route53::RecordSet
    Properties: 
      Name: !Ref HostName
      HostedZoneId: !Ref HostedZoneId
      Type: A
      AliasTarget: 
        DNSName: !GetAtt ElasticLoadBalancer.DNSName
        HostedZoneId: !GetAtt ElasticLoadBalancer.CanonicalHostedZoneIDe