使用AWS CDK搭建GitHub同步S3流水线无法同步删除操作如何解决
解决方案
你可以将原有S3DeployAction替换为CodeBuild执行阶段,通过AWS CLI的s3 sync命令实现全量同步,该命令支持--delete参数可以自动删除S3桶中源仓库不存在的文件,具体实现步骤如下:
步骤1:引入CodeBuild相关依赖
import * as codebuild from '@aws-cdk/aws-codebuild'; import * as iam from '@aws-cdk/aws-iam'; // 原有codepipeline、s3等依赖保持不变
步骤2:替换原有Deploy阶段的S3DeployAction
保留你原有Source阶段的所有逻辑,仅修改Deploy阶段的实现:
// 原有Source阶段、bucket声明、sourceOutput等代码完全保留,以下为Deploy阶段替换代码 const syncBuildProject = new codebuild.PipelineProject(this, 'S3SyncProject', { environment: { buildImage: codebuild.LinuxBuildImage.STANDARD_6_0, }, buildSpec: codebuild.BuildSpec.fromObject({ version: '0.2', phases: { build: { commands: [ // 核心同步命令,--delete参数会删除S3中Git仓库不存在的文件 `aws s3 sync . s3://${dagsBucket.bucketName} --delete`, ], }, }, }), }); // 给CodeBuild执行角色授予S3桶的读写权限 dagsBucket.grantReadWrite(syncBuildProject); const deployAction = new codepipeline_actions.CodeBuildAction({ actionName: 'S3FullSync', project: syncBuildProject, input: sourceOutput, // 直接复用Source阶段拉取的GitHub代码产物 }); pipeline.addStage({ stageName: 'Deploy', actions: [deployAction], });
补充说明
aws s3 sync命令的--delete参数是实现删除同步的核心,会对比Git拉取的本地文件和S3桶内文件,删除所有在本地不存在的S3对象- 该方案完全适配你现有的CodePipeline流程,不需要调整Source阶段的CodeStar连接配置
- 你可以根据需求在sync命令后追加
--exclude/--include参数过滤不需要同步的文件
提示:首次部署前可将sync命令修改为
aws s3 sync . s3://${dagsBucket.bucketName} --delete --dryrun,先在CodeBuild日志中预览待变更的文件,确认符合预期后再移除--dryrun参数正式执行。
内容的提问来源于stack exchange,提问作者JamesD
相关产品推荐
相关产品推荐

