如何让AWS CodePipeline监听S3桶全文件变更触发部署?含CDK打包需求
解决方案
1. 让CodePipeline监听S3桶内任意文件/文件夹变更触发部署
完全可以配置CodePipeline监听S3桶内特定路径(如myDummyFiles/文件夹)的文件变更,无需依赖单一压缩包。在AWS CDK中,调整CodePipeline的S3源配置,指定触发的文件前缀而非单个zip文件即可:
- 使用
S3Source构造时,设置trigger为S3Trigger.EVENTS,并通过bucketKeyPrefix指定要监听的文件夹路径。示例代码如下:
import { CodePipeline, CodePipelineSource } from 'aws-cdk-lib/pipelines'; import { Bucket } from 'aws-cdk-lib/aws-s3'; const sourceBucket = Bucket.fromBucketName(this, 'SourceBucket', 'your-bucket-name'); const pipeline = new CodePipeline(this, 'MyPipeline', { pipelineName: 'MyDeploymentPipeline', synth: // 你的Synth步骤 sources: [ CodePipelineSource.s3(sourceBucket, 'myDummyFiles/', { trigger: CodePipelineSource.S3Trigger.EVENTS, }), ], });
当myDummyFiles/路径下的任何文件新增、修改或删除时,都会自动触发CodePipeline的部署流程。
2. 通过CDK自动打包文件夹并触发Pipeline变更
如果仍需依赖压缩包触发部署,可通过CDK自动完成SampleApp_Linux文件夹的打包操作,无需手动压缩:
方式一:使用CDK Asset自动打包
将本地SampleApp_Linux文件夹作为CDK Asset,CDK会自动将其压缩为zip包并上传到S3资产桶,同时管理版本。让CodePipeline监听这个资产桶的zip文件变更即可:
import { Asset } from 'aws-cdk-lib/aws-s3-assets'; import { CodePipelineSource } from 'aws-cdk-lib/pipelines'; const appAsset = new Asset(this, 'SampleAppAsset', { path: './SampleApp_Linux', // 本地文件夹路径 }); const pipeline = new CodePipeline(this, 'MyPipeline', { pipelineName: 'MyDeploymentPipeline', synth: // 你的Synth步骤 sources: [ CodePipelineSource.s3(appAsset.bucket, appAsset.s3ObjectKey, { trigger: CodePipelineSource.S3Trigger.EVENTS, }), ], });
每次本地SampleApp_Linux文件夹内容变更时,CDK部署会生成新的zip包版本,触发CodePipeline检测到变更并启动部署。
方式二:在Pipeline中加入CodeBuild步骤打包
如果文件已经在S3的SampleApp_Linux路径下,可在CodePipeline中添加CodeBuild阶段,将该路径下的文件打包为zip后再传递给后续部署步骤:
import { CodeBuildStep } from 'aws-cdk-lib/pipelines'; import { BuildSpec } from 'aws-cdk-lib/aws-codebuild'; const buildStep = new CodeBuildStep('PackageApp', { input: CodePipelineSource.s3(sourceBucket, 'SampleApp_Linux/'), buildSpec: BuildSpec.fromObject({ version: '0.2', phases: { build: { commands: [ 'zip -r SampleApp_Linux.zip ./', ], }, }, artifacts: { files: ['SampleApp_Linux.zip'], }, }), }); const pipeline = new CodePipeline(this, 'MyPipeline', { pipelineName: 'MyDeploymentPipeline', synth: // 你的Synth步骤 steps: [buildStep, /* 后续部署步骤 */], });
S3中SampleApp_Linux/路径的文件变更会触发Pipeline,CodeBuild自动打包后再部署到EC2。
内容的提问来源于stack exchange,提问作者dredbound
相关产品推荐
相关产品推荐

