CDK创建CI/CD流水线时如何使用已有Bucket作为制品存储
解决方案
完全可以实现所有CDK创建的流水线统一复用预先存在的S3 Bucket存储制品,具体配置方式根据你使用的CDK流水线模块稍有区别:
1. 原生codepipeline.Pipeline低层级构造类
直接在实例化流水线时传入artifactBucket参数即可覆盖默认自动创建Bucket的逻辑:
import * as s3 from 'aws-cdk-lib/aws-s3'; import * as codepipeline from 'aws-cdk-lib/aws-codepipeline'; // 导入预先创建的共享Bucket const sharedArtifactBucket = s3.Bucket.fromBucketName( this, 'SharedArtifactBucket', '你的共享Bucket实际名称' ); // 创建流水线时指定制品存储桶 const pipeline = new codepipeline.Pipeline(this, 'BusinessPipeline', { pipelineName: '业务部署流水线', artifactBucket: sharedArtifactBucket, // 其他流水线配置项 });
2. 高层级pipelines.CodePipeline现代CDK流水线模块
如果是用于部署CDK应用的高层级流水线模块,需要通过codePipelineDefaults参数传递底层流水线的制品桶配置:
import * as pipelines from 'aws-cdk-lib/pipelines'; import * as s3 from 'aws-cdk-lib/aws-s3'; const sharedBucket = s3.Bucket.fromBucketArn( this, 'SharedBucket', 'arn:aws:s3:::你的共享BucketARN' ); const cdkDeploymentPipeline = new pipelines.CodePipeline(this, 'CDKAppPipeline', { synth: new pipelines.ShellStep('Synth', { input: pipelines.CodePipelineSource.gitHub('org/repo', 'main'), commands: ['npm ci', 'npm run build', 'npx cdk synth'] }), codePipelineDefaults: { artifactBucket: sharedBucket } });
全局统一配置方案
要实现所有流水线默认使用该共享Bucket,你可以把共享Bucket的导入逻辑封装为公共工具函数,所有流水线实例化时统一调用该函数获取Bucket实例传入即可,无需重复编写导入代码。
注意事项
- 共享Bucket必须和所有使用它的流水线位于同一AWS区域,跨区域场景不支持
- CDK会自动为流水线执行角色添加共享Bucket的读写权限,跨账号使用场景需要手动补充Bucket策略允许对应账号的角色访问
- 如果Bucket开启了SSE-KMS加密,需要额外给流水线角色授予KMS密钥的
kms:Encrypt、kms:Decrypt等必要权限,否则流水线会出现制品读写失败问题。
内容的提问来源于stack exchange,提问作者Sameed Usmani
相关产品推荐
相关产品推荐

