【问题标题】:If it possible connect Loadbalancers DNSname to Route53 using AWS Cloudformation template?如果可以使用 AWS Cloudformation 模板将 Loadbalancers DNSname 连接到 Route53?
【发布时间】:2016-04-12 02:59:50
【问题描述】:

我尝试将负载均衡器 DNS 名称连接到 Route53。 让我们看一个例子。 这是来自 Resource 中模板的 Loadbaancer:

"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"} 不起作用。有人可以建议或给我正确的方法来添加这个吗?

谢谢!

【问题讨论】:

    标签: json amazon-web-services amazon-cloudformation


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      对于任何在 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"
              }
            }
          }
      

      【讨论】:

      • 只有当它是一个经典负载均衡器时
      • 对于AWS::ElasticLoadBalancingV2::LoadBalancer,它仍然是CanonicalHostedZoneID
      【解决方案3】:

      请务必阅读有关 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 区域和终端节点中的相关服务。

      【讨论】:

        【解决方案4】:

        您很可能希望获取引用为RestELB 的LoadBalancer 的属性DNSName。因此,您将需要 Fn::GetAtt 之类的东西(未经测试)

           "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"
              }
            }
        

        【讨论】:

        • 对我没用。创建堆栈时出现错误:“CREATE_FAILED AWS::Route53::RecordSet ApiRecordSet 属性 DNSName 的值必须是字符串类型。”
        • 我明白了。你能测试一个字符串而不是一个数组吗?类似于 ... ` "DNSName" : { "Fn::GetAtt" : [ "RestELB", "DNSName" ]}, `(fn:GetAtt 外没有方括号)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-10-27
        • 2020-06-23
        • 2019-08-26
        • 1970-01-01
        • 2019-12-03
        • 1970-01-01
        • 2018-04-28
        相关资源
        最近更新 更多