首页 > 解决方案 > 将 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 次)。

标签: amazon-web-servicesamazon-cloudfrontaws-cdk

解决方案


您可以使用以下技巧自己分配逻辑 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 强制正常更新时两步方法会起作用的原因。


推荐阅读