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