通过 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 它是如何工作的?