在 cloudformation 创建 cloudfront 后创建失效的最佳方法是啥?
Posted
技术标签:
【中文标题】在 cloudformation 创建 cloudfront 后创建失效的最佳方法是啥?【英文标题】: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
【问题讨论】:
【参考方案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` 并使用 CLIaws cloudformation list-exports --query "Exports[?Name!=null] | [?contains(Name,'xyz-UI:CFDistributionID')].Value | [0]
这将返回“distribution-id”,然后我可以使用你的最后一个命令以上是关于在 cloudformation 创建 cloudfront 后创建失效的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章
在 Spring Cloud AWS 中禁用 Cloudformation
如何使用 CloudFormation 创建 OpsWorks 用户?
如何修复与 AWS::CloudFormation::Init 一起创建 EC2 的 cloudformation 模板