【发布时间】:2022-02-07 09:56:57
【问题描述】:
tldr;我可以将单个 CFN 堆栈部署为管道的一部分,但如何部署多个动态堆栈?
一个更好的 tldr;你会怎么做? forEach BuildStage.artifact 调用 CloudFormation.build
我以非常传统的方式使用 CodePipeline。目标是对我的 CloudFormation 模板进行源代码控制,在模板更改时通过管道推送它们,然后自动部署堆栈。
Source Stage(CodeCommit 提交我的 CFN yaml 模板)
构建阶段(CodeBuild 从提交中找到新文件,并将它们推送到 S3)
部署阶段(CloudFormation 将我的模板部署为 CFN 堆栈)
几乎一切都很好。我将模板更改提交到 CodeCommit,构建阶段运行我的 codeBuild 网守,它仅收集已更改的文件,并将它们上传到 S3。到目前为止一切顺利。
挑战在于,有时我会更改一个模板,有时我会更改多个 (n)。在我的构建阶段,我可以检测到更改的文件并将它们升级到 S3 没有问题。如果我对一个模板进行更改,一切正常。我可以使用 S3 上的模板位置创建一个导出变量,将其传递到我的部署阶段,并让 CloudFormation 部署操作使用该文件作为模板源。但是如果我有 2 个模板,我将如何处理呢?
- 我不能只是在构建阶段创建无穷无尽的导出变量。
- 如果可以的话,AFAIK 无法迭代部署阶段的每个条目。
我的想法是我需要执行以下操作之一:
- 在我当前的构建规范中(在我将文件上传到 S3 之后),使用 AWS CLI 调用 CFN 堆栈构建。我可以将其添加为循环的一部分,因此它会迭代每个要上传的文件。或
- 在我的构建阶段之后,使用 Lambda 执行与 #1 相同的操作。循环遍历每个文件,然后使用 CLI 或 SDK 调用 CFN 堆栈构建。
这两个选项似乎完全违背了部署阶段的目的,这对我来说似乎很笨重。
我还缺少其他选项吗?你会怎么做?
【问题讨论】:
-
不会为第二个模板工作添加另一个部署阶段吗?
-
@jingx - 如果我提前知道第二个模板,也许这会起作用。但是如果只提交一个模板呢?如果提交了 10 个模板怎么办?我几乎需要一种能够动态扩展部署阶段的方法。虽然我觉得这可能是错误的方法,或者我遗漏了一些东西,但实际上真的很容易:-D
-
你是说模板的数量可以随着构建而改变?或者只是 changed 模板的数量可以改变?如果是后者,您不必担心排除未更改的模板,CFN 会自行检测更改。
-
老实说,两者都是。现在,我的 repo 中可能总共有 10 个模板,也许它们一次都更改一个。但是有可能 1) 更多模板被添加到 repo,2) 每次提交更改多个模板。
-
您需要使用 CDK 或 Bisque 为您的管道生成模板。循环或 foreach 没有开箱即用的解决方案。
标签: amazon-web-services amazon-cloudformation aws-codepipeline aws-codebuild