amazon-web-services - 将 CDK 托管的 CloudFormation 分发从 CloudFrontWebDistribution 迁移到分发 API
问题描述
我有一个现有的 CDK 设置,其中使用已弃用的 CloudFrontWebDistribution API 配置 CloudFormation 分发,现在我需要配置一个 OriginRequestPolicy,所以在谷歌搜索后,切换到分发 API(https://docs.aws.amazon.com/ cdk/api/latest/docs/aws-cloudfront-readme.html)并重用相同的“id” -
Distribution distribution = Distribution.Builder.create(this, "CFDistribution")
当我合成堆栈时,我已经在 yaml 中看到 ID(例如 CloudFrontCFDistribution12345689)与之前的 ID 不同。尝试部署时会失败,因为 HTTP Origin CNAME 已经与现有分发相关联。(“提供的请求无效:您提供的一个或多个 CNAME 已与不同的资源相关联。(服务:CloudFront,状态代码:409,请求 ID:123457657,扩展请求 ID:null)”
有没有办法将 OriginRequestPolicy(我只想传输一个额外的标头)添加到 CloudFrontWebDistribution,或者在维护现有分发而不是创建新分发的同时使用新的分发 API?(相同的操作需要在 AWS 控制台中单击大约 3 次)。
解决方案
您可以使用以下技巧自己分配逻辑 ID,而不是依赖自动生成的逻辑 ID。另一种选择是分两步执行它,首先在没有附加 CNAME 的情况下更新它,然后使用附加 CNAME 进行第二次更新。
const cfDistro = new Distribution(this, 'distro', {...});
cfDistro.node.defaultChild.overrideLogicalId('CloudfrontDistribution');
这将导致以下堆栈:
CloudfrontDistribution:
Type: AWS::CloudFront::Distribution
Properties:
...
小编辑来解释为什么会发生这种情况:
由于您正在切换到一个新的构造,因此您还将获得一个新的逻辑 ID。为了确保可以回滚,CloudFormation 将首先创建所有新资源并创建需要重新创建的更新资源。只有在创建和更新所有内容后,它才会通过删除旧资源进行清理。这也是为什么在更改资源的逻辑 ID 或通过确保相同的逻辑 ID 强制正常更新时两步方法会起作用的原因。
推荐阅读
- javascript - 如何仅使用 Javascript 动态创建带有上一个和下一个按钮的图像视频缩略图滑块?
- javascript - .modal-content 用于不同的模态(react-bootstrap)
- android - Android(Firestore):无法在 Firestore 中已创建的文档中添加、更新或设置(SetOptions.merge)字段
- sql - 转换失败的 varchar 值
- python - 如何使用 result.fit_report() 给出的值?
- vue.js - 在 Vue Good Table 中格式化输出行数据
- c# - 全球秒表 WPF - 如何/为什么这不起作用
- angular - 无法导航到同级路由器
- javascript - 让 Microsoft Azure Web 应用程序聊天机器人使用电子邮件或 Twilio 从预设用户的表/列表中主动联系用户
- swisscomdev - 在 Swisscom CloudFoundry 上强制使用 HTTPS