通过 cloudformation 使用 aws `cdk synth` 输出

use aws `cdk synth` output via cloudformation

我在现有基于 Cloudformation 的管道的环境中工作。我想知道是否可以在 CDK 中描述我的基础设施,然后生成要在管道中使用的 Cloudformation,而不更改管道。我希望我使用 CDK 的事实完全透明。

是的,这是可能的。我有一个过程使用 CDK 'build' 使用 cdk synth 的 CloudFormation 模板。然后将此模板上传到版本化路径上的 S3 存储桶中。

然后您可以使用 create-stack 上的 --template-url 选项从存储桶部署 CloudFormation 模板。

https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-stack.html

我通常不建议通过 CloudFormation 使用 cdk synth 的输出,除非您知道自己在做什么。

原因如下:CDK在某些边缘情况下会提前进行引导和资产发布,例如对于所谓的资产来源(docker 图像、s3 文件等)。

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

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

The cloud assembly includes a CloudFormation template for each stack and asset sources (docker images, s3 files, etc) that must be packaged and published to the asset store in each environment that consumes them.

如果您未使用任何资产或可以选择在使用 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

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]
        )

可以使用 CloudFormationCreateUpdateStackAction 将此 json 转发到部署阶段 CloudFormationCreateUpdateStackAction(template_path=cdk_build_output.at_path("output.json"))