将AWS::Route53::RecordSet DnsRecord添加到无服务器Cloudfront分发中

4
我在这里找到了如何在serverless.yml文件中将Route53 DNS记录与S3存储桶关联的方法。
我试图将其调整为部署CloudFront分销的情况。
DnsRecord:
  Type: "AWS::Route53::RecordSet"
  Properties:
    AliasTarget:
      DNSName: <cloudfrontdistribution id>
      HostedZoneId: Z21DNDUVLTQW6Q
    HostedZoneName: ${self:custom.appFQDN}.
    Name:
      Ref: WebAppCloudFrontDistribution
    Type: 'CNAME'

我正在努力想办法将分发ID作为引用而不是固定字符串获取。

我该如何做到这一点?

3个回答

5

我曾经尝试使用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'

5

设置 AliasTarget 实际上只需要提供 CloudFront DNS 名称作为 DNSName 参数,而不是分配标识符。您可以使用以下命令执行此操作:

!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”属性的“Aliases”属性设置此属性,或者如果您不在此模板中创建资源,则可以在AWS控制台中为分发设置手动配置。

1
这是我的无服务器模板中的工作配置样式:
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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接