通过 CloudFormation 使用 AWS CDK 的 synth 输出

9

我在一个现有基于Cloudformation的管道环境中工作。我想知道是否可以使用CDK描述我的基础架构,然后生成用于管道的Cloudformation,而无需对管道进行任何更改。我希望使用CDK是完全透明的。


1
如果我理解你的问题正确,你正在询问关于管道的事情,它将运行 cdk synth 命令,获取生成的 YAML 文件并将其用作模板? - Amit Baranes
1
我本意是在提交之前在本地运行cdk synth,可能作为Git precommit hook。我没有改变管道的可能性,因此使用cdk而不是cloudformation的事实对管道来说应该是透明的。 - sumek
可以的,我有一个使用代码构建和代码管道的示例。代码构建会监听 Git 仓库,当提交创建新的构建时,开始编译 CDK 并运行 CDK Synth,随后代码管道部署 CDK 堆栈。我猜你想要将第二部分改为基于 CloudFormation 的管道。这听起来对你来说是一个可行的解决方案吗? - Amit Baranes
请注意,根据您的CDK堆栈,由于CfnParameters无法解决而需要一些解决方法,因此很难在合成模板上调用create-stack。 - Logemann
3个回答

7

一般情况下,我不建议使用 cdk synth 的输出通过 CloudFormation 进行部署,除非你非常了解它。

原因在于:CDK 在某些边缘情况下会预先进行引导和资产发布,例如所谓的 asset sources(docker 镜像、s3 文件等)。

这个主题与 CDK 存储库中的 CI/CD 集成问题有一些重叠。[1]

正在进行工作,以开发完全自动化的 CDK CI/CD 流程 [2]。所谓的 cloud assembly [3] 包含了所有必要的资源,可以通过 CloudFormation 部署,但正如 RFC 指出的那样:

云集成包括每个堆栈和资产源(docker 镜像、s3 文件等)的 CloudFormation 模板,必须将其打包并发布到每个使用它们的环境中的资产存储中。

如果您没有使用任何资产或者在使用 CloudFormation 之前有打包和部署它们的选项,那么在提供正确的 CFN 参数时,应该可以在 CloudFormation 中使用 cdk synth 输出(正如其他人已经在本主题中指出的那样)。

参考文献

[1] https://github.com/aws/aws-cdk/issues/6894
[2] https://github.com/aws/aws-cdk-rfcs/blob/master/text/0049-continuous-delivery.md
[3] https://github.com/aws/aws-cdk/blob/master/packages/@aws-cdk/cloud-assembly-schema/README.md

这些链接与AWS CDK(亚马逊网络服务构建套件)相关,包括问题、连续交付和云组装架构方面的内容。

2

由于合成器生成的 CfnTemplates 可能包含没有值的 CfnParameters,例如 S3Bucket CfnParameter。它们也没有默认值,导致无法直接部署堆栈。 - Logemann
是的,但是您必须在“cdk deploy”期间提供参数值,因此您需要在“create-stack”中执行相同的操作。 - Daniel Scott
完全正确。只是想提一下,仅仅调用“as is”(表示不带参数)可能会起作用,也可能不起作用。我曾经为此感到困惑。另外需要注意的是,在 CDK 将这些参数内置后,执行 cdk deploy 时无需再提供这些参数。所以很难抓住这个问题。 - Logemann

0

cdk synth 的输出可以存储在 JSON 中。

build_spec=BuildSpec.from_object({
                "version": "0.2",
                "run-as": "root",
                "phases": {
                    "install": {
                        "commands": [
                            'npm install -g aws-cdk',
                            'pip install -r requirements.txt',
                        ]
                    },
                    "build": {
                        "commands": [
                            'cdk synth stack-dev --verbose --debug=true -o > output.json'
                        ]
                    }
                },
                "artifacts": {
                    "files": "output.json"
                },
            })

            cdk_build_action = CodeBuildAction(
            action_name="CDKBuild",
            project=cdk_build,
            input=source_artifact,
            outputs=[cdk_build_output]
        )

这个 JSON 可以通过 CloudFormationCreateUpdateStackAction 转发到部署阶段。 CloudFormationCreateUpdateStackAction(template_path=cdk_build_output.at_path("output.json"))


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接