【问题标题】:What is best way to create invalidation after cloud formation created cloud front?在 cloudformation 创建 cloudfront 后创建失效的最佳方法是什么?
【发布时间】:2019-11-23 19:34:05
【问题描述】:

我正在创建一个完全无服务器的解决方案,该解决方案也将创建一个 s3 存储桶和 CloudFront。使用来自 bitbucket 管道的云形成模板

我还想为 CloudFront 创建无效。

1) 是否可以在云形成中创建失效?

2) 如果不是,那么我如何从我的云形成中获取分发 ID,然后使用 aws cli 创建失效

CFDistribution:
Type: 'AWS::CloudFront::Distribution'
DependsOn: UIBucket
Properties:
  DistributionConfig:
    Aliases:
      - !Sub "${AppSubDomain}.${SSMDomain}"
    Origins:
      - DomainName: !GetAtt UIBucket.DomainName
        Id: S3BucketOrigin
        S3OriginConfig:
          OriginAccessIdentity: !Join
            - ''
            - - 'origin-access-identity/cloudfront/'
              - !Ref CFOriginAccessIdentity
    Comment: !Sub 'CloudFront origin for ${AppSubDomain}.${SSMDomain}'
    DefaultCacheBehavior:
      AllowedMethods:
        - GET
        - HEAD
        - OPTIONS
      TargetOriginId: S3BucketOrigin
      ForwardedValues:
        QueryString: 'false'
        Cookies:
          Forward: none
      ViewerProtocolPolicy: redirect-to-https
    DefaultRootObject: index.html
    Enabled: 'true'
    HttpVersion: http2
    PriceClass: PriceClass_All
    ViewerCertificate:
      AcmCertificateArn: !Ref SSMWildcardCertificateARN
      SslSupportMethod: sni-only
  Tags:
    - Key: "Type"
      Value: "Host"
    - Key: "Product"
      Value: !Ref Product
    - Key: "Environment"
      Value: !Ref SSMEnvironment

【问题讨论】:

    标签: amazon-web-services amazon-cloudformation


    【解决方案1】:

    我也将 CloudFront 与 CloudFormation 一起使用,但我没有找到使用 CloudFormation 创建失效的方法。如果您查看 AWS Docs,CloudFormation 允许与 CloudFront 相关的 3 种类型

    CloudFront
      AWS::CloudFront::CloudFrontOriginAccessIdentity
      AWS::CloudFront::Distribution
      AWS::CloudFront::StreamingDistribution
    

    这些都不会造成失效。回答您的第一个问题:

    1) 是否可以在云形成中创建失效?

    没有。

    2) 如果不是,那么我如何从我的云形成中获取分发 ID,然后使用 aws cli 创建失效

    您可以将分发添加到 CloudFormation 模板输出:

    Outputs:
      CloudFrontDistributionID:
        Description: 'CloudFront distribution ID'
        Value: !Ref CloudFrontDistribution
      CloudFrontURL:
        Description: 'CloudFront URL'
        Value:!GetAtt CloudFrontDistribution.DomainName
    

    使用 bash 保存分发 ID(检查此 question):

    $ distributionId=${aws cloudformation describe-stacks --stack-name MY_STACK --query "Stacks[0].Outputs[?OutputKey=='CloudFrontDistributionID'].OutputValue" --output text}
    

    最后,创建CloudFront invalidation

    $ aws cloudfront create-invalidation --distribution-id $distributionId --paths /index.html /error.html
    

    【讨论】:

    • 谢谢,我找到了另一种方法,在 template.yaml 中我使用了列表导出` CFDistributionID: Value: !Ref CFDistribution Description: Cloudfront Distribution ID Export: Name: !Sub ${AWS::StackName }:CFDistributionID` 并使用 CLI aws cloudformation list-exports --query "Exports[?Name!=null] | [?contains(Name,'xyz-UI:CFDistributionID')].Value | [0] 这将返回“distribution-id”,然后我可以使用你的最后一个命令
    猜你喜欢
    • 2017-08-06
    • 2011-01-03
    • 2022-01-05
    • 2017-04-13
    • 1970-01-01
    • 1970-01-01
    • 2014-12-10
    • 2020-03-03
    • 2016-04-13
    相关资源
    最近更新 更多