CDK 在 Codepipeline 中的使用

Use of CDK in Codepipeline

x我有一个要求,我需要在舞台内执行某些 CDK 命令。我不确定如何在舞台上使用它

尝试了某些事情我能理解的是你可以运行某些Shell命令在一个阶段。

 with open('<some-config.json>') as f:
            lines = f.readlines()
        print(lines)
        string_param = aws_ssm.StringParameter(
            self, "StringParameterWithoutSlash",
            parameter_name="<some-config>",
            string_value="{}".format(lines)
        )

我有以下 CDK 管道。

       pipeline.add_stage(
            stage_name="Source",
            actions=[
                codepipeline_actions.CodeCommitSourceAction(
                    action_name="CodeCommit-Source",
                    repository=code_repo,
                    branch="master",
                    output=source_output,
                )
            ],
        )
        
        pipeline.add_stage(
            stage_name="Build-Test",
            actions=[
                codepipeline_actions.CodeBuildAction(
                    action_name="Build-Test",
                    project=build_project,
                    input=source_output,
                    outputs=[build_output],
                )
            ],
        )

我想在 CDK 管道内执行某些 cdk 命令,以便在执行管道时执行 cdk 命令 运行。

尝试了某些东西,但找不到任何我可以使用的方法。

您不能直接从 codepipeline.Pipeline 部署 CDK 构造。这就是 pipelines.CodePipeline 结构的特点。不过,不需要交换管道。

这是一个保留 OP codepipeline.Pipeline 的解决方案。它避免了在管道中部署新资源。

  1. ssm.Parameter 构造添加到 CDK 堆栈。在 synth-time 处,名称是已知的,值是虚拟占位符。实际参数值稍后将由管道执行期间调用的 Lambda 设置。
  2. 向 CDK 堆栈添加一个 Function 结构。 lambda 将作为管道操作调用。 lambda 应该有一个环境变量 PARAMS_JSON,在调用时它将通过它接收参数值。 Lambda 的工作是调用 boto3 put_parameter() API 以使用环境变量中的值覆盖参数值。
  3. 在管道操作中使用 shell 命令设置 PARAMS_JSON 的值。 <some-config.json> 此时可从输入工件中获得。
  4. 添加一个 LambdaInvokeAction 来引用您在上面添加的 Function。您在管道中放置步骤 3 和 4 的确切位置将取决于您的用例的详细信息。

这种方法的一个优点是参数和 Lambda 与 Stack 生命周期相关联。参数将与 Stack 一起创建、更新和销毁,即使 Stack 不知道参数值。

运行 管道内任何命令的最佳方式如下。

  ssm_deploy_project = codebuild.PipelineProject(
            self, 
            "Jazz Config Deploy",
            environment=codebuild.BuildEnvironment(
                build_image=codebuild.LinuxBuildImage.AMAZON_LINUX_2_2,
            ),
            build_spec=codebuild.BuildSpec.from_object(
            {
            "version": "0.2",
            "phases": {
                "build": {
                    "commands": 'aws ssm put-parameter --name "config-jazz" --overwrite --type String --region eu-central-1 --value "$(cat config-jazz.json)"'
                }
            }
            }
             )
            )

更新 pipeline.py 文件以添加新阶段

   pipeline.add_stage(
                    stage_name="Deploy_Jazz_Config",
                    actions=[
                        codepipeline_actions.CodeBuildAction(
                            action_name="Jazz-Config-Deploy",
                            project=ssm_deploy_project,
                            input=source_output,
                        )
                    ],
                )

这将从 cdk 执行 aws cli。

使用它的好处是我们不必管理单独的 buildspec.yml 文件来执行某些 cli 命令