Круговая зависимость CloudFormation между Route53, диспетчером сертификатов и CloudFront - PullRequest
0 голосов
/ 04 октября 2019

Следующий код - моя попытка создания шаблона CloudFormation для SPA (одностраничного приложения). Я понимаю, что, возможно, есть много недостатков, но я не могу концептуально понять, как устранить ошибку циклической зависимости, которую я получаю. В моей голове имеет смысл только то, что Route53 зависит от CloudFront, потому что ему нужно знать AliasTarget, также имеет смысл, что CloudFront должен зависеть от диспетчера сертификатов, потому что ему нужен AcmCertificateArn, а CertificateManager должен зависеть от Route53 (дляочевидные причины, но у меня есть ощущение, что кто-то скажет мне, что именно здесь я разрываю цепь).

AWSTemplateFormatVersion: '2010-09-09'
Description: Creates an S3 bucket configured for hosting a static website, and a Route
  53 DNS record pointing to the bucket
Parameters:
  DomainName:
    Type: String
    Description: The DNS name of an existing Amazon Route 53 hosted zone e.g. jevsejev.io
    AllowedPattern: (?!-)[a-zA-Z0-9-.]{1,63}(?<!-)
    ConstraintDescription: must be a valid DNS zone name.
  FullDomainName:
    Type: String
    Description: The full domain name e.g. development.jevsejev.io
    AllowedPattern: (?!-)[a-zA-Z0-9-.]{1,63}(?<!-)
    ConstraintDescription: must be a valid DNS zone name.
Resources:
  Route53:
    Type: AWS::Route53::RecordSet
    DependsOn:
      - Cloudfront
    Properties:
      HostedZoneName: !Ref 'DomainName'
      RecordSets:
        Name: !Ref 'FullDomainName'
        Type: A
        AliasTarget: 
          DNSName: !GetAtt [Cloudfront, WebsiteURL]
  CertificateManager:
    Type: AWS::CertificateManager::Certificate
    DependsOn:
      - Route53
    Properties:
      DomainName: !Ref 'FullDomainName'
  Cloudfront:
    Type: AWS::CloudFront::Distribution
    DependsOn:
    - S3
    Properties:
      DistributionConfig:
        Origins:
        - DomainName: !GetAtt [S3, WebsiteURL]
          Id: S3Origin
          CustomOriginConfig:
            HTTPPort: '80'
            HTTPSPort: '443'
            OriginProtocolPolicy: http-only
        Enabled: true
        HttpVersion: 'http2'
        DefaultRootObject: index.html
        Aliases:
        - !Ref 'FullDomainName'
        DefaultCacheBehavior:
          AllowedMethods:
          - GET
          - HEAD
          Compress: true
          TargetOriginId: S3Origin
          ForwardedValues:
            QueryString: true
            Cookies:
              Forward: none
          ViewerProtocolPolicy: redirect-to-https
        PriceClass: PriceClass_All
        ViewerCertificate:
          AcmCertificateArn: !Ref CertificateManager
          SslSupportMethod: sni-only
  S3:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Ref 'FullDomainName'
      AccessControl: PublicRead
      WebsiteConfiguration:
        IndexDocument: index.html
...