禁用publishAssetsInParallel后AWS CDK Pipeline资产阶段找不到BuildSpec文件
我们用AWS CDK Pipeline部署多栈应用,默认设置下资产阶段会创建20多个FileAsset对象,导致AWS报错并行运行的CodeBuild项目数量超限,于是禁用了publishAssetsInParallel标志。但禁用后资产阶段出现以下错误:
[Container] 2022/11/14 12:04:24 Phase complete: DOWNLOAD_SOURCE State: FAILED
[Container] 2022/11/14 12:04:24 Phase context status code: YAML_FILE_ERROR Message: stat /codebuild/output/src112668013/src/buildspec-c866864112c35d54804951dbe96b99440c9b891fde-FileAsset.yaml: no such file or directory
这个BuildSpec文件应该由CDK Pipeline自动生成——启用并行发布时完全不需要手动创建。当前流水线代码如下:
const pipeline = new CodePipeline(this, 'Pipeline', { publishAssetsInParallel: false, selfMutation: false, pipelineName: fullStackName('Pipeline', app), synth: new CodeBuildStep('SynthStep', { input: CodePipelineSource.codeCommit(repo, repoBranchName, {codeBuildCloneOutput: true}), buildEnvironment: {computeType: ComputeType.MEDIUM}, installCommands: [ 'npm install -g yarn', 'yarn install', 'cd apps/cloud-app', 'yarn install', 'yarn global add aws-cdk' ], commands: [ 'yarn build', 'cdk synth' ], primaryOutputDirectory: 'apps/cloud-app/cdk.out' } ) });
对比启用/禁用publishAssetsInParallel的差异:
- 启用时,CodeBuild项目自带完整的BuildSpec实现:
{ "version": "0.2", "phases": { "install": { "commands": [ "npm install -g cdk-assets@2" ] }, "build": { "commands": [ "cdk-assets --path \"MyStack.assets.json\" --verbose publish \"2357296280127ce793d8dbb13e6c907db22f5dcc57a173ba77fcd19a76d8f444:12345678910-eu-west-2\"" ] } } }
- 禁用时,BuildSpec仅指向一个自动生成的文件路径,但这个文件在CodeBuild环境中找不到:
buildspec-c866864112c35d54804951dbe96b99440c9b891fde-FileAsset.yaml
1. 升级CDK版本
这个问题是早期CDK版本的已知bug——禁用并行资产发布时,自动生成的BuildSpec文件不会被包含到cdk.out输出目录中。建议直接升级到最新稳定版CDK,或者至少升级到v2.40.0及以上版本(该版本修复了类似的资产发布路径问题)。
2. 调整Synth步骤的输出配置
如果暂时无法升级CDK,可以修改Synth步骤确保BuildSpec文件被正确输出:
- 移除
primaryOutputDirectory配置,让CodeBuild默认输出整个项目的构建结果,而非仅cdk.out目录; - 或者在synth命令后,把自动生成的BuildSpec文件复制到
cdk.out目录,比如在commands里添加:
cp ../buildspec-*.yaml apps/cloud-app/cdk.out/
注意根据你的项目结构调整路径,确保能正确定位到生成的BuildSpec文件。
3. 替代方案:调整并行构建配额
如果不想禁用publishAssetsInParallel,可以通过以下方式解决并行数超限问题:
- 在AWS控制台的CodeBuild页面申请提高账户的并行构建数量上限;
- 部分CDK版本支持通过
maxWorkers参数限制资产发布阶段的并行CodeBuild数量,避免触发配额限制。
内容的提问来源于stack exchange,提问作者Charlie

