CodeBuild工件上传位置不匹配问题排查及强制指定S3桶方案
问题解答
差异原因分析
你看到的两个存储桶差异源于CodeBuild的两种运行模式:
- CodeBuild项目主页的「工件上传位置」:该配置仅在直接运行CodeBuild项目(如手动启动、非CodePipeline触发)时生效,构建产物会上传到这个指定的S3桶。
- 构建记录里的随机存储桶:当CodeBuild作为CodePipeline的一个阶段运行时,工件的存储与流转由CodePipeline完全接管,此时会使用CodePipeline的Artifact Store(默认是自动创建的随机命名S3桶,格式通常为
codepipeline-<区域>-<随机字符串>),CodeBuild项目自身的工件存储配置会被忽略。
你的场景中,CodeBuild是通过CodePipeline的CodeBuildAction调用的,流水线需要统一管理各阶段的工件传递,因此会自动使用自身的Artifact Store,而非CodeBuild项目单独配置的桶。
强制使用指定存储桶的方法
方法1:配置CodePipeline使用指定的Artifact Store(推荐)
修改Pipeline栈中创建CodePipeline的代码,指定artifactStore为你的alpha-artifact-bucket,这样整个流水线的所有工件(包括CodeBuild的输出)都会存储在这个桶里:
const pipeline = new codepipeline.Pipeline(this, props.pipelineName, { pipelineName: props.pipelineName, role: this.pipelineRole, restartExecutionOnUpdate: true, // 添加Artifact Store配置 artifactStore: { bucket: S3.Bucket.fromBucketName(this, 'AlphaArtifactBucket', 'alpha-artifact-bucket'), type: codepipeline.ArtifactStoreType.S3 } });
部署修改后的Pipeline栈后,后续CodeBuild阶段的输出会自动存入alpha-artifact-bucket,构建记录也会显示该桶。
方法2:在buildspec中直接上传到指定桶(不推荐)
若无需通过CodePipeline传递工件,可修改buildspec.yml,在构建阶段后添加命令直接将产物上传到指定桶:
version: 0.2 env: secrets-manager: REACT_APP_DOMAIN: "REACT_APP_DOMAIN" REACT_APP_BACKEND_SERVICE_API: "REACT_APP_BACKEND_SERVICE_API" REACT_APP_GOOGLE_MAP_API_KEY: "REACT_APP_GOOGLE_MAP_API_KEY" phases: install: runtime-versions: nodejs: 14 commands: - echo Performing yarn install - yarn install build: commands: - yarn build # 添加S3上传命令 - aws s3 sync ./build s3://alpha-artifact-bucket/your-target-path/ artifacts: base-directory: ./build files: - "**/*" cache: paths: - "./node_modules/**/*"
同时需确保CodeBuild使用的deploymentRole拥有对alpha-artifact-bucket的s3:PutObject等权限。这种方式会断开CodePipeline各阶段的工件衔接,后续部署阶段需从该桶读取产物,会增加流水线复杂度,仅适用于特殊场景。
内容的提问来源于stack exchange,提问作者Yang Liu
相关产品推荐
相关产品推荐

