AWS CodeArtifact
为 npm、Maven、PyPI、NuGet 提供全托管包仓库的制品管理服务
概述
AWS CodeArtifact 是一项全托管的软件包仓库服务。它支持 npm、Maven、PyPI、NuGet、Swift、Cargo 等主流包管理器,实现公共注册表的包缓存与内部私有包的统一管理。通过 IAM 策略实现细粒度访问控制、跨账户共享以及包版本不可变性保证,有效增强软件供应链安全。
域与仓库的层级设计
CodeArtifact 的资源结构由域和仓库两个层级组成。域定义了组织整体包管理的边界,同一域内的仓库之间会自动进行包去重,从而优化存储成本。仓库可按团队、项目或环境分别创建,并为每个仓库设置独立的访问策略。实际应用中,通常将内部共享库仓库、产品团队专用仓库和公共包缓存仓库分离。域级加密可指定 AWS KMS 客户托管密钥,所有存储的包资产均被加密。通过域策略控制跨账户共享,允许 Organizations 内的多个账户访问同一域的仓库,从而在整个组织中保持包的一致性。
上游连接与包缓存
CodeArtifact 的上游连接机制可自动缓存来自公共注册表(npmjs.com、PyPI、Maven Central、NuGet Gallery 等)的包。当开发者请求某个包时,系统首先搜索本地仓库,若未找到则依次查找上游仓库,最终从公共注册表获取并缓存。一旦缓存,包将保留在本地,不受公共注册表故障或网络延迟的影响。此机制对防御供应链攻击也十分有效。通过设置包来源控制,可限制从公共注册表自动引入新包,防止依赖混淆攻击。即使公共注册表上出现与内部包同名的包,来源控制也会优先使用内部版本。包版本状态管理(Published、Unlisted、Archived、Disposed)还可逐步限制已弃用版本的使用。
CI/CD 流水线的认证集成
CodeArtifact 的认证通过发放临时认证令牌来实现。使用 aws codeartifact get-authorization-token 命令可获取最长 12 小时有效的令牌,并将其配置为 npm、pip、Maven 等包管理器的认证凭据。与 CodeBuild 集成时,为构建项目的 IAM 角色授予 CodeArtifact 访问权限,在 buildspec.yml 的 pre_build 阶段获取令牌并配置包管理器是标准做法。从 GitHub Actions 或 GitLab CI 等外部 CI 服务访问时,通过 OIDC 联合身份验证承担 IAM 角色来获取令牌。对于 npm,在 .npmrc 文件中设置注册表 URL 和令牌;对于 pip,通过 --index-url 选项指定仓库 URL。通过 IAM 策略分离包的发布(publish)权限和获取(read)权限,可防止 CI 流水线意外发布包。使用仓库端点策略限制仅通过 VPC 端点访问,还可确保网络路径的安全性。