繁体   English   中英

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

[英]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”与“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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM