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

标签 typescript amazon-web-services aws-cdk

刚接触 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 key

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

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

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

关于typescript - AWS CDK 使用不同的管道部署相同的资源和相同的堆栈 | typescript ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71776531/

相关文章:

python - 如何在 AWS CDK 创建的 Python Lambda 函数中安装外部模块?

javascript - React 中孙子元素的箭头语法和绑定(bind)问题

node.js - global.util.crypto.lib.randomBytes 不是函数错误

aws-cloudformation - AWS CodeBuild : Skipping invalid file path, UPLOAD_ARTIFACTS 状态:失败

amazon-web-services - 通过 CLI 列出所有 AWS AMI 名称?

ios - iOS 上的 AWS API 网关

javascript - 如何在 JavaScript 中使用 CDK 将资源策略添加到现有 S3 存储桶?

html - 将 div 放置在不同宽度的图像内

javascript - 当第二个 observable 发生变化时,combineLatest 没有发射?

typescript - 在 Jest TypeScript 中找不到名称 'it'