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

Posted

技术标签:

【中文标题】通过 cloudformation 使用 aws `cdk synth` 输出【英文标题】:use aws `cdk synth` output via cloudformation 【发布时间】:2020-09-29 23:17:43 【问题描述】:

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

【问题讨论】:

如果我理解您的问题,您所问的管道将运行cdk synth 获取生成的 yaml 并将其用作模板? 我的意思是在提交之前在本地运行cdk synth,可能作为 Git 预提交钩子 ????我没有改变管道的可能性,所以使用 cdk 而不是 cloudformation 的事实必须对管道是透明的 有可能,我有一个使用代码构建和代码管道的示例。代码构建在提交创建新构建时监听 git repo 编译 cdk 并运行 cdk 合成器,稍后代码管道部署 cdk 堆栈。我想您想更改为基于 cloudformation 的管道的第二部分。这听起来对你来说是一个可能的解决方案吗? 请记住,根据您的 cdk 堆栈,在合成模板上调用 create-stack 并不容易,因为 CfnParameters 在没有一些变通方法的情况下无法解决。 【参考方案1】:

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

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

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

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

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

如果您没有使用任何资产或在使用 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

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

因为合成结果的 CfnTemplates 可以包含没有值的 CfnParameters。例如 S3Bucket CfnParameter。它们也没有默认值,导致堆栈无法按原样部署。 嗯,是的。但是您必须在cdk deploy 期间提供参数值,因此您需要对create-stack 执行相同操作。 完全正确。只是想提一下,仅调用“原样”(意味着没有参数)可能有效或无效。前段时间我为此而堕落。附带说明一下,当 CDK 将这些参数放在那里时,您不需要向 cdk deploy 提供参数,因为 CDK 在内部以某种方式执行此操作。所以它不是那么容易抓住的。【参考方案3】:

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

【讨论】:

以上是关于通过 cloudformation 使用 aws `cdk synth` 输出的主要内容,如果未能解决你的问题,请参考以下文章

我应该如何通过 cloudformation 部署我的 aws 状态机?

通过 cloudformation 的 AWS Lambda 计划事件源

如何使用 CloudFormation 模板更新现有 AWS API Gateway

AWS::CloudFormation::Init 它是如何工作的?

通过 CloudFormation 部署 AWS UserPool 并更新属性

AWS CloudFormation 可以调用 AWS API 吗?