Amazon ECR 容器镜像管理 - 生命周期策略与镜像扫描

介绍通过私有仓库生命周期策略自动删除旧镜像、通过镜像扫描检测漏洞的运维模式。

ECR 基础与仓库管理

ECR 是 Docker 容器镜像和 OCI 工件的托管注册表,支持单个镜像最大 42 GB 的层。提供私有仓库和公共仓库(ECR Public)。私有仓库通过 IAM 策略控制访问,可配置仅允许特定 IAM 角色推送和拉取镜像。通过仓库策略还可以控制跨账户的拉取权限。镜像使用 AES-256 进行静态加密,也可选择 KMS 客户托管密钥(CMK)。使用 CMK 可实现密钥自动轮转和审计日志集成,但需注意拉取时会增加 KMS API 调用。启用镜像标签不可变性可防止相同标签的覆盖写入,确保部署的可追溯性。仓库名称可通过前缀实现层级化管理(例如 team-a/app-frontend),并通过 IAM 策略实现基于前缀的访问控制。

生命周期策略与成本管理

生命周期策略是自动清理仓库内镜像的规则。可定义带标签镜像的保留数量(如保留最新 10 个)、无标签镜像的保留期限(如删除超过 7 天的)以及基于特定标签前缀的规则。规则可设置优先级,当多条规则冲突时高优先级规则生效。在 CI/CD 流水线频繁推送镜像的环境中,没有生命周期策略存储成本会无限增长。建议生产镜像(prod-*)保留 30 个版本,开发镜像(dev-*)仅保留 5 个版本以实现差异化管理。策略预览功能可在实际删除前确认哪些镜像会受到影响。ECR 存储按每 GB 每月每区域计费,因此不必要镜像的积累直接影响成本。

镜像扫描与复制

基本扫描在推送时使用 Clair 引擎检测 OS 包漏洞。增强扫描与 Inspector 集成,除 OS 包外还检测编程语言包(npm、pip、Maven)的漏洞。增强扫描持续运行,新 CVE 发布时会重新扫描现有镜像。扫描结果会发布到 EventBridge,可配置在检测到 Critical/High 漏洞时触发 SNS 通知或自动修复流水线。跨区域复制将镜像自动复制到指定区域,缩短多区域 ECS/EKS 部署的镜像拉取时间。跨账户复制也可用,适合从中央仓库向工作负载账户分发镜像的架构。复制可通过过滤规则限定目标仓库,无需复制全部内容。

CI/CD 流水线集成模式

ECR 是 CI/CD 流水线中镜像构建和部署流程的核心。常见配置是从 CodeBuild 或 GitHub Actions 构建并推送镜像。认证令牌通过 GetAuthorizationToken API 获取,有效期为 12 小时。构建时使用多阶段构建保持最终镜像体积小巧,有效减少拉取时间和存储成本。作为缓存策略,ECR 支持远程缓存,可使用 BuildKit 的 --cache-to 和 --cache-from 选项将中间层存储在 ECR 中以加速构建。配置拉取穿透缓存可将 Docker Hub 或 GitHub Container Registry 等公共注册表的拉取通过 ECR 缓存,避免外部注册表的速率限制。镜像标签策略建议使用 Git 提交哈希或 CI 构建号作为标签,避免过度依赖 latest 标签。

设计注意事项与故障排除

运维 ECR 时需注意几个要点。每个仓库的镜像数量默认上限为 10,000 个,接近上限时需检讨生命周期策略或申请配额提升。在 VPC 内设置 VPC 端点(PrivateLink)可无需经由互联网网关即可拉取和推送镜像,在安全性和网络成本方面均有优势。ECR 需要两个端点——ecr.api 和 ecr.dkr,还需配置 S3 网关端点(因为镜像层存储在 S3 中)。发生拉取限流时,实现重试逻辑以及通过共享镜像层(使用通用基础镜像)减小拉取量是有效的应对措施。多架构镜像(AMD64 和 ARM64 并存)通过清单列表管理,可在 Graviton 实例和 x86 实例混合环境中使用相同的镜像 URI。

总结

ECR 是管理容器镜像完整生命周期的托管注册表。通过生命周期策略自动优化存储成本,通过镜像扫描持续检测漏洞。与 CI/CD 流水线的紧密集成简化了从构建到部署的镜像分发,拉取穿透缓存和 VPC 端点等功能解决了运维层面的挑战。利用跨区域和跨账户复制,可集中管理多区域、多账户环境的容器镜像分发。