【问题标题】:use aws `cdk synth` output via cloudformation通过 cloudformation 使用 aws `cdk synth` 输出
【发布时间】: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 在没有一些变通方法的情况下无法解决。

标签: amazon-web-services amazon-cloudformation aws-cdk


【解决方案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"))

    【讨论】:

      猜你喜欢
      • 2021-10-22
      • 1970-01-01
      • 2019-09-15
      • 2019-07-19
      • 1970-01-01
      • 2021-09-27
      • 2022-07-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多