将AWS :: Route53 :: RecordSet DnsRecord添加到无服务器的Cloudfront Distribution

时间:2018-05-31 15:14:50

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

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

我已经尝试将其应用于部署cloudfront distrib

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

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

我该怎么做?

2 个答案:

答案 0 :(得分:2)

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

!GetAtt WebAppCloudFrontDistribution.DomainName

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

您还需要在模板中修复其他一些内容:

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

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

答案 1 :(得分:1)

我努力用CloudFormation创建一个AWS::Route53::RecordSet,它会产生“资源创建失败”类型的,无用的,无用的错误消息。对我来说,关键是使用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'