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



我在如何将 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 作为引用而不是固定字符串获取的问题。

我该怎么做?

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

!GetAtt WebAppCloudFrontDistribution.DomainName

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

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

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

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

我努力创建一个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'

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

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

最新更新