如何在CDK的codepipeline_actions.CloudFormationCreateUpdateStackAction中使用部署时动态参数
实现方案
方案1:通过构建产物参数文件传递(推荐,适合多参数场景)
这个方案是将构建阶段生成的所有动态参数统一写入JSON文件,作为构建产物的一部分输出,部署阶段直接从文件中读取参数值。
步骤1:修改CodeBuild的buildspec配置
在post_build阶段执行完sam package后,生成动态参数文件,并将其加入构建产物列表:
post_build: commands: - sam package --s3-bucket ${PACKAGE_BUCKET} --output-template-file ${TEMPLATE_FILE_NAME} # 写入动态参数到JSON文件 - echo "{\"CommitNumber\":\"${COMMIT_NUMBER}\"}" > params.json artifacts: files: - ${TEMPLATE_FILE_NAME} - params.json # 把参数文件加入构建输出产物
步骤2:修改CDK中CloudFormation部署Action的配置
使用CloudFormationCreateUpdateStackAction.getParam方法,从构建产物的参数文件中读取对应值传入parameterOverrides:
const parameterOverrides = { // 原有静态参数直接保留 Environment: "production", // 动态参数从构建产物的params.json中取值 CommitNumber: codepipeline_actions.CloudFormationCreateUpdateStackAction.getParam( buildOutput, "params.json", "CommitNumber" ) }; new codepipeline_actions.CloudFormationCreateUpdateStackAction({ actionName: `The_Deploy`, templatePath: buildOutput.atPath(TEMPLATE_FILE_NAME), parameterOverrides, stackName: envStackName, cfnCapabilities: [CfnCapabilities.AUTO_EXPAND, CfnCapabilities.ANONYMOUS_IAM], adminPermissions: true, role: buildRole, runOrder: runOrder || 1 });
方案2:通过Pipeline命名空间变量传递(适合少参数场景)
如果只需要传递少量参数,可以直接使用CodePipeline的变量传递能力,不需要额外生成文件。
步骤1:配置CodeBuild导出变量与命名空间
首先修改buildspec配置,声明需要导出的环境变量:
env: exported-variables: - COMMIT_NUMBER
然后在CDK定义CodeBuild Action时,为其配置变量命名空间:
const buildAction = new codepipeline_actions.CodeBuildAction({ actionName: "CodeBuild", project: buildProject, input: sourceOutput, outputs: [buildOutput], variablesNamespace: "BuildVars" // 自定义命名空间名称 });
步骤2:部署阶段引用变量
在parameterOverrides中直接使用CodePipeline的变量占位符语法引用对应值:
const parameterOverrides = { CommitNumber: "#{BuildVars.COMMIT_NUMBER}" };
注意事项
- 两种方案的参数值都是在Pipeline运行时动态替换的,不需要在Pipeline synth阶段就确定具体取值
- 多参数场景优先选择方案1,所有动态参数统一管理不易出错
- 使用方案2时注意自定义变量名不要与CodePipeline内置变量重名
内容的提问来源于stack exchange,提问作者KickinMhl
相关产品推荐
相关产品推荐

