亚马逊AWS官方博客
借助 Amazon CodeCommit 增强 API 助力企业代码仓库云迁移
背景
随着云计算和移动互联网的持续发展,市场变化与需求日新月异。及时发布创新应用和产品满足市场多变需求,已经成为互联网和传统 IT 企业的新常态。在当下,IT 企业同时维护多个产品线及成百上千个代码库,每月甚至每周发布新版本都已司空见惯。在此背景下,代码及相关配置已经成为 IT 企业的核心资产。
然而每个 IT 企业的组织形式多样,对代码的管理方式也不尽相同,尤其近几年频繁爆出的代码泄漏以及“从删库到跑路”事件,让很多企业在代码的安全控制和精细化管理上投入了很大的精力。如何结合企业自身组织特点降低代码的管理成本已经成为每个 IT 企业无法回避的问题。
为此,我们推出了 CodeCommit 增强 API(以下简称增强 API),它是基于 Amazon CodeCommit 实现的代码管理解决方案。具体代码参考 github: https://github.com/aqiao/codecommit-enhanced-api。
Amazon CodeCommit 是一个安全、高度可扩展的托管型源代码控制服务,可用于托管私有 Git 存储库。它让团队能够轻松而安全地协同处理代码,并实现传输中和存储加密。使用 Amazon CodeCommit,您无需搭建自己的版本控制系统,也无需担心基础设施的扩展能力。它支持 Git 的标准功能,因此可以与现有基于 Git 的工具无缝搭配。
增强 API 以 REST API 的形式运行,除了 Amazon CodeCommit 自身提供的安全存储,版本控制等标准功能外,它还实现了根据项目,组等业务属性对代码库进行精准授权的功能。本文基于实际的案例,描述了增强 API 的功能,架构设计及主要场景。
功能与用例
功能
增强 API 包含如下功能:
基础数据管理:
增强 API 的运行依赖各种基础数据,对基础数据的维护是其的重要组成部分,基础数据包括:
- 用户:根据实际的使用场景,我们将用户分为三种:代码库管理员,开发人员和只读用户。
- 组:用户的逻辑组织形式,依托组来实现对代码库的分级授权,例如代码库管理员组,开发组等。
- 项目:在实际开发过程中,代码库的创建和管理都是围绕项目来进行,所以项目是基础数据重要的组成部分。
- 代码库:Amazon CodeCommit 代码库,提供了版本控制,安全存储等标准功能,可以使用 Git 客户端或者 HTTPS 来访问。
- 策略:为了便于对代码库授权,我们对 Amazon CodeCommit 策略条目进行封装,避免库管理员陷入亚马逊云科技的授权细节,从而降低管理员的维护工作量。
Token 管理:
为了保证增强 API 安全稳定地调用,我们实现了基于 JWT 的访问控制。每个用户对应不同的 Token,只有获取合法的 Token 才能进行调用。Token 管理包括:
- 数据防篡改:Token 的创建,分发和验证会经过复杂的网络链路,防止 Token 在传输过程中被篡改是 Token 管理的重要方面。
- 有效期验证:为 Token 设置合理的有效期既可以避免频繁创建 Token,减轻服务器压力,又可以方便 API 的调用。当 Token 过期后,需要通过专门的 API 再次获取。
- 信息加密存储:Token 中存储了用户相关信息,为了避免信息泄漏,在存储到 Token 之前,我们对用户信息进行了加密。
代码库授权:
我们采用分级授权的方式来管理代码库。根据用户实际的使用场景,我们将权限分为三级:只读用户权限,研发人员权限和代码库管理员权限:
- 只读用户权限:有些用户虽然不是某个项目组成员,但仍然希望可以参考和借鉴特定代码库代码,此时可以给该用户设置只读权限。
- 研发人员权限:允许项目组成员利用 git 客户端或者 HTTPS 完成提交代码,创建分支等操作。该类权限可以保证研发人员进行正常的开发,但是无法删除代码库。
- 代码库管理权限:完整的权限列表,包括删除代码库。
用例
常见用例如下——
用户管理
为了对接简单,我们采用了依赖反转的设计模式。由客户现有的身份认证系统来调用增强 API 实现用户管理:
- 新员工入职时,由身份系统发起调用,创建 Amazon CodeCommit 用户及密码,确保用户第一时间获取对应账号。
- 员工所在项目组的管理员,为员工分配相应的读写、只读或者管理员权限。确保员工能访问所需代码仓库,从而进行正常的开发工作
- 员工切换项目组时,通过管理员进行权限清理和再授权
- 员工离职时,由身份系统发起调用,清理员工权限及 Amazon CodeCommit 用户与密码。
组织架构与项目管理
项目组与项目是公司组织架构的重要组成部分,Amazon CodeCommit 原生并未提供相应的组织管理以及基于组织的代码库授权功能。因而,增强 API 通过策略及组实现了对应功能:
- 管理员可以创建项目组、项目,并基于项目来分配权限。
- 项目的管理员可以管理组成员和代码库库授权。
- 普通员工只能向管理员申请相应权限。
- 普通员工可以查看他有权访问的代码仓库信息,然后通过 Git/HTTPS 访问代码仓库。
代码仓库管理
代码仓库是 Amazon CodeCommit 的核心资源,通过封装 Amazon 原生 CodeCommit API,增强 API 提供了对代码仓库完整功能列表:
- 创建新的 Amazon CodeCommit 代码仓库,并自动打上项目相关的 Tag。
- 管理 Amazon CodeCommit 代码仓库访问权限。
- 删除 Amazon CodeCommit 代码仓库,并清理相关权限。
实现架构与组件实现
架构设计
整个增强 API 的部署架构如下图所示:
企业的用户身份管理系统(如 HR、OA、AD 等)通过主动调用增强 API 来进行代码库的访问。对于身份系统管理员来说,面对的仍然是现有的系统,没有迁移难度。
对于项目管理员,既可以通过现有的项目管理系统集成增强 API,也可以直接调用增强 API 来管理项目和成员。
增强 API 可以多实例、多可用区分布式、弹性部署,通过亚马逊云科技负载均衡器(Amazon Application Load Balancer)对外提供服务,从而避免单点故障。
用户,组,项目,策略等基础数据存储到 Amazon RDS 中,仓库权限通过 Amazon IAM 来落地实现。用户代码通过 CodeCommit 实现托管,通过最终通过 Git/HTTPS 访问代码仓库。
示例代码
受篇幅限制,此处只是列出每个模块的核心代码,完整代码可访问文章最后的链接。
API Token
用户管理
项目组管理
代码库管理
成本分析
本方案用到的 Amazon 服务如下:
Amazon EC2
按多可用区,最小两台 m6g.medium 实例部署,参考 https://www.amazonaws.cn/ec2/pricing/ec2-linux-pricing/ ,约 ¥121.764/月 (¥60.882*2)。
Amazon RDS
根据系统可用性要求,我们按最小最生产多可用区配置部署,采用 db.m6g.large,一年无预付保留实例,参考 https://www.amazonaws.cn/rds/pricing/ ,约 ¥0.6429/小时,合计约 ¥462.888/月。
Amazon IAM
IAM 免费使用。
Amazon CodeCommit
参考 https://www.amazonaws.cn/codecommit/pricing/, 正常使用下一般单用户 ¥6.96,按用户数减 5 来算总数。例如 100 个研发工程师,一个月使用费用约 ¥(100-5)*6.96=¥661.2/月。
Amazon Application Load Balancer
参考 https://www.amazonaws.cn/elasticloadbalancing/pricing/, 预计访问量不到 25 连接/秒,每小时费用约为 ¥ 0.228(¥ 0.156 每小时费用 + ¥ 0.072 LCU 费用),折合每月每月 ¥ 164.16。
按推荐架构部署,100 名研发工程师的月使用费用约 ¥1410.012(¥462.888+¥661.2+¥164.16+¥121.764),远低于其他商业代码仓库产品。
总结
Amazon CodeCommit 增强 API 是一套安全可靠、简单易用的企业 API 服务接口,它解决了企业面临的对代码管理的核心诉求,架构简单清晰,文档全面,是代码仓库迁移上云开箱即用的方案。
欢迎访问 github 与我们交流了解更多,如果你有任何需求或者问题,也欢迎在 github 提出。