【问题标题】:Add AWS::Route53::RecordSet DnsRecord to a serverless Cloudfront Distribution将 AWS::Route53::RecordSet DnsRecord 添加到无服务器 Cloudfront Distribution
【发布时间】:2018-11-10 15:53:18
【问题描述】:

我找到了this,了解如何将 route53 dns 记录与 serverless.yml 文件中的 S3 存储桶相关联。

我已尝试将其调整到部署云端发行版的情况

DnsRecord:
  Type: "AWS::Route53::RecordSet"
  Properties:
    AliasTarget:
      DNSName: <cloudfrontdistribution id>
      HostedZoneId: Z21DNDUVLTQW6Q
    HostedZoneName: ${self:custom.appFQDN}.
    Name:
      Ref: WebAppCloudFrontDistribution
    Type: 'CNAME'

但我正在努力解决如何将分发 id 作为参考而不是固定字符串。

我该怎么做?

【问题讨论】:

    标签: amazon-cloudformation amazon-route53 serverless aws-serverless


    【解决方案1】:

    我努力创建 AWS::Route53::RecordSet,使用 CloudFormation 生成“资源无法创建”类型的不具体、无用的错误消息。对我来说,关键是使用HostedZoneId 而不是HostedZoneName 来指定父“托管区域”。这就是我最终得到的结果:

      NaaaaaComDNSEntry: 
        Type: 'AWS::Route53::RecordSet'
        DependsOn: NaaaaaComCloudFront
        Properties: 
          AliasTarget:
            DNSName: !GetAtt NaaaaaComCloudFront.DomainName
            # For CloudFront, HostedZoneId is always Z2FDTNDATAQYW2, see:
            # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-aliastarget.html#cfn-route53-aliastarget-hostedzoneid
            HostedZoneId:  Z2FDTNDATAQYW2
        # HostedZoneId is for ID for 'naaaaa.com.'; In theory its valid to use `HostedZoneName` OR `HostedZoneId`
        # but in practice the recordset always failed to create if I used `HostedZoneName`
        HostedZoneId: ZABCDEFGHIJK5M
        Name: 'www.naaaaa.com.'
        Type: 'A'
    

    【讨论】:

      【解决方案2】:

      这是我在无服务器模板中的工作配置:

      DnsRecord:
        Type: "AWS::Route53::RecordSet"
        Properties:
          AliasTarget:
            DNSName:
              Fn::GetAtt:
                - CloudFrontDistribution
                - DomainName
            # Looks like it is always the same for CloudFront distribs.
            # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-aliastarget.html
            # https://docs.aws.amazon.com/general/latest/gr/rande.html#cf_region
            HostedZoneId: ${self:custom.zoneId}
          HostedZoneName: ${self:custom.secondLevelDomain}.
          Name: ${self:custom.appFQDN}
          Type: 'A'
      

      和

      CloudFrontDistribution:
        Type: AWS::CloudFront::Distribution
        Properties:
          DistributionConfig:
            ...
            Aliases:
              - ${self:custom.appFQDN}
      

      还由 Tom McLaughlin 提供的示例提供: https://github.com/ServerlessOpsIO/serverless-zombo.com/blob/master/serverless.yml

      【讨论】:

        【解决方案3】:

        要设置 AliasTarget,您实际上只需为 DNSName 参数提供 CloudFront DNS 名称,而不是分配 ID。你可以这样做:

        !GetAtt WebAppCloudFrontDistribution.DomainName
        

        我假设 WebAppCloudFrontDistribution 是模板中 AWS::CloudFront::Distribution 资源的逻辑 ID,而不是参数。如果这实际上是一个参数,只需将该参数的值设置为在 CloudFront 的 AWS 控制台仪表板中为分配列出的 DNS 名称。

        您还需要在模板中修复一些其他问题:

        • HostedZoneName 应该是 Route53 托管区域的名称,而不是您要使用的 FQDN。就个人而言,我更喜欢使用 AWS::Route53::RecordSet 资源的 HostedZoneId 属性,因为它更清楚该属性的含义是什么,但每个人都有自己的含义。 (注意:AWS::Route53::RecordSet 资源的 HostedZoneId 属性应该是您的托管区域的 HostedZoneId,而不是与 AliasTarget HostedZoneId 相同的值。)
        • Name 应该是您希望成为 CloudFront 分配资源的 CNAME 的 DNS 名称。
        • 我知道这有点奇怪,但是对于别名目标,您必须将类型设置为“A”(对于 IPv4)或“AAAA”(IPv6)。我建议两者都做 - 您可以通过创建 AWS::Route53::RecordSet 资源的副本来做到这一点,但将类型设置为“AAAA”而不是“A”。

        最后,请注意,为了使其正常工作,您还需要确保将 FQDN 添加为 CloudFront 分发资源的备用名称 - 您可以使用“DistributionConfig”的“别名”属性进行设置您的模板中分配资源的属性,或者如果您没有在此模板中创建资源,则可以在 AWS 控制台中为分配设置手动配置此属性。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-05-31
          • 2018-12-01
          • 2018-03-04
          • 2018-11-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多