AWS CDK 使用不同的管道部署相同的资源和相同的堆栈 |打字稿

AWS CDK deploy same resources and same stacks with different pipeline | Typescript

刚接触 AWS CDK,遇到了某个问题。

我有一个工作的 CDK 代码管道,可以将大量资源部署到不同的环境,最终进入生产阶段。它使用 master 作为其源分支,目前有一个 prod 部署等待投入生产。

为了让开发人员继续工作,我创建了一个新管道,它在一个名为 dev 的新分支上工作,但旨在将相同的资源部署到相同的堆栈,但仅限于我们的开发环境。

新的开发管道运行后我收到错误

Resource handler returned message: "Usage Plan j4p4g2 cannot be added because API Key n8uyhik8h8 cannot reference multiple Usage Plans with the same API Stage: 9i1lnft358:v1 (Service: ApiGateway, Status Code: 409, Request ID: 54889a52-4fb8-4c90-93e5-31c8b1865335, Extended Request ID: null)" (RequestToken: 6fb61327-fa39-b967-8969-639daa658c72, HandlerErrorCode: AlreadyExists)

尽管堆栈名称和资源相同,但它似乎正在尝试添加新的使用计划而不是接受现有计划

第二个管道像这样创建

if (stackBuildTargetAcct === 'dev') {

  new PipelineStack(app, 'PipelineDev', {
    environment: 'dev',
    stackName: 'dev-build-pipeline',
  })

} else if (stackBuildTargetAcct === 'prod') {
  new PipelineStack(app, 'Pipeline', {
    environment: 'prod',
    stackName: 'master-build-pipeline',
  })
}

我认为堆栈名称相同并且资源相同为什么它认为需要创建新资源?我怀疑它是 'Pipeline' vs 'PipelineDev' id,但是当我将它们都更改为 'Pipeline' 时,由于以下错误,我无法部署新管道

Pipeline/Pipeline/Pipeline/ArtifactsBucketEncryptionKeyAlias (PipelineArtifactsBucketEncryptionKeyAlias94A07392) alias/codepipeline-pipelinefb9defa0 already exists in stack arn:aws:cloudformation:ap-southeast-2:master-build-pipeline

感谢任何帮助或建议

我最终找到了解决方案,对问题有了更深入的了解。

问题是由以下几件事情同时发生引起的:

  • 在 aws 云形成中通常有先创建后删除策略,这意味着将在删除旧资源之前创建新资源
  • 默认情况下生成的云形成中的逻辑 ID 对于不同的管道会有所不同
  • 使用计划不能为相同的 api 网关引用相同的 api 密钥

我还想指出,到目前为止,在这个 repo 中,除了使用计划(使用计划没有名称)之外,我们对所有内容都有明确的名称。 解决方案是找到用于使用计划的当前逻辑 ID,并将其设置在代码中,如下所示:

 plan.addApiKey(importedKey, {overrideLogicalId: "<Logical id that you found is already deployed here>"})

我怀疑类似的错误通常可以通过给资源一个明确的名称来解决,这样它的逻辑 ID 就不会随机生成,或者通过以我需要的类似方式覆盖逻辑 ID