AWS CDK部署Fargate服务时配置ECR生命周期策略咨询
可行实现方案
两个需求都可以在不新增手动docker构建/推送步骤、不增加CDK部署流程复杂度的前提下实现,完全适配ApplicationLoadBalancedFargateService构造的使用逻辑,不需要改造原有部署流程。
方案1:使用独立ECR仓库存储对应服务镜像(推荐)
这个方案可以彻底解决多应用镜像混存无法配置生命周期规则的问题,全程由CDK自动完成镜像构建、权限配置、推送操作,无额外手动步骤。
实现逻辑:
- 先为每个服务单独创建专属ECR仓库,可直接在仓库构造中预定义生命周期清理规则
- 构建Docker镜像资产时显式指定推送到该专属仓库,替代默认的CDK统一资产仓库逻辑
- 将构建完成的镜像资产传入Fargate服务的容器配置即可
参考代码:
import { DockerImageAsset } from 'aws-cdk-lib/aws-ecr-assets'; import { Repository as EcrRepository, TagStatus } from 'aws-cdk-lib/aws-ecr'; import { Duration, RemovalPolicy } from 'aws-cdk-lib'; // 1. 为当前服务创建专属ECR仓库,直接配置生命周期规则 const serviceRepo = new EcrRepository(this, "LeAppEcrRepo", { repositoryName: `leapp-${envId}`, lifecycleRules: [ { rulePriority: 1, description: "仅保留最近30个正式镜像版本", maxImageCount: 30, tagStatus: TagStatus.ANY, }, { rulePriority: 2, description: "自动清理存在超过14天的无标签镜像", maxImageAge: Duration.days(14), tagStatus: TagStatus.UNTAGGED, } ], // 按自身资源留存需求调整删除策略 removalPolicy: RemovalPolicy.RETAIN_ON_UPDATE_OR_DELETE, }); // 2. 构建镜像资产,指定推送到上述自定义仓库 const serviceImage = new DockerImageAsset(this, "LeAppImage", { directory: "../", // 和原有fromAsset的镜像目录路径完全一致 repository: serviceRepo, // 关键配置:覆盖默认推送仓库 }); // 3. 原有Fargate服务配置仅需替换image字段,其余参数保持不变 const fargateService = new ecsPatterns.ApplicationLoadBalancedFargateService( this, "FargateService", { serviceName: `LeApp-${envId}`, cluster: cluster, // ... 其余原有配置不变 taskImageOptions: { image: ecs.ContainerImage.fromDockerImageAsset(serviceImage), containerName: "leapp-container", family: "leapp", // ... 其余原有容器配置不变 }, propagateTags: ecs.PropagatedTagSource.SERVICE, } );
该方案和原有使用ecs.ContainerImage.fromAsset()的部署体验完全一致,CDK会在部署阶段自动完成ECR登录、镜像构建、标签打标、推送的全流程,不需要执行任何手动docker操作。
方案2:自定义镜像标签适配统一仓库的生命周期规则
如果你不想拆分多个ECR仓库,也可以通过给不同服务的镜像打专属标签的方式,让ECR生命周期规则可以精准识别对应服务的镜像做清理,同样不需要额外手动步骤。
实现逻辑:
- 构建镜像资产时,通过
extraTags参数给当前服务的所有镜像加上唯一标识标签(比如服务名、环境名标签) - 在共享ECR仓库的生命周期策略中,配置基于标签匹配的清理规则,即可实现分应用的旧镜像清理
参考代码:
const serviceImage = new DockerImageAsset(this, "LeAppImage", { directory: "../", // 给当前服务的所有镜像打上专属识别标签 extraTags: [ `app=leapp`, `env=${envId}` // 可按需追加版本类标签,比如结合Git Commit ID做更细粒度的版本管理 ], });
配置完成后,就可以在共享ECR仓库中添加对应规则:比如保留所有带app=leapp标签的最近20个镜像,规则不会误命中其他服务的镜像,满足自动清理需求。
注意事项
上述方案在CDK v2版本中原生支持,DockerImageAsset属于CDK核心模块的一部分,不需要安装第三方依赖,也不会改变原有CDK部署的触发逻辑。
内容的提问来源于stack exchange,提问作者Zdeněk
相关产品推荐
相关产品推荐

