亚马逊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 实现用户管理:

  1. 新员工入职时,由身份系统发起调用,创建 Amazon CodeCommit 用户及密码,确保用户第一时间获取对应账号。
  2. 员工所在项目组的管理员,为员工分配相应的读写、只读或者管理员权限。确保员工能访问所需代码仓库,从而进行正常的开发工作
  3. 员工切换项目组时,通过管理员进行权限清理和再授权
  4. 员工离职时,由身份系统发起调用,清理员工权限及 Amazon CodeCommit 用户与密码。

组织架构与项目管理

项目组与项目是公司组织架构的重要组成部分,Amazon CodeCommit 原生并未提供相应的组织管理以及基于组织的代码库授权功能。因而,增强 API 通过策略及组实现了对应功能:

  1. 管理员可以创建项目组、项目,并基于项目来分配权限。
  2. 项目的管理员可以管理组成员和代码库库授权。
  3. 普通员工只能向管理员申请相应权限。
  4. 普通员工可以查看他有权访问的代码仓库信息,然后通过 Git/HTTPS 访问代码仓库。

代码仓库管理

代码仓库是 Amazon CodeCommit 的核心资源,通过封装 Amazon 原生 CodeCommit API,增强 API 提供了对代码仓库完整功能列表:

  1. 创建新的 Amazon CodeCommit 代码仓库,并自动打上项目相关的 Tag。
  2. 管理 Amazon CodeCommit 代码仓库访问权限。
  3. 删除 Amazon CodeCommit 代码仓库,并清理相关权限。

实现架构与组件实现

架构设计

整个增强 API 的部署架构如下图所示:

企业的用户身份管理系统(如 HR、OA、AD 等)通过主动调用增强 API 来进行代码库的访问。对于身份系统管理员来说,面对的仍然是现有的系统,没有迁移难度。

对于项目管理员,既可以通过现有的项目管理系统集成增强 API,也可以直接调用增强 API 来管理项目和成员。

增强 API 可以多实例、多可用区分布式、弹性部署,通过亚马逊云科技负载均衡器(Amazon Application Load Balancer)对外提供服务,从而避免单点故障。

用户,组,项目,策略等基础数据存储到 Amazon RDS 中,仓库权限通过 Amazon IAM 来落地实现。用户代码通过 CodeCommit 实现托管,通过最终通过  Git/HTTPS 访问代码仓库。

示例代码

受篇幅限制,此处只是列出每个模块的核心代码,完整代码可访问文章最后的链接。

API Token

def check_token(f):
    @wraps(f)
    def get_token(*args, **kwargs):
        secret = "Asia_Info_88*"

        user_name = request.headers.get('X-USER-NAME', None)
        token = request.headers.get('X-USER-TOKEN', None)
        try:
            payload = jwt.decode(token, secret, algorithms="HS256")
            iss = payload['iss']
            identify_hash = payload['data']['hash']
            identify = user_name + iss
            if check_password_hash(identify_hash, identify):
                return f(*args, **kwargs)
            else:
                return failed_without_data(f"User {user_name} not authorized")
        except jwt.exceptions.ExpiredSignatureError:
            return failed_without_data("Token expired, please refresh your token")
        except jwt.exceptions.InvalidTokenError:
            return failed_without_data("Invalid token, please retrieve a valid token")
        except Exception as e:
            return failed_without_data(f"Unexpected error: {str(e)}. Please try again or contact administrator")
    return get_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 提出。

本篇作者

何健桥

西云数据解决方案架构师,10+ 年开发和架构经验,曾就职于央企和知名外企,对传统 BPM 系统的设计与开发,互联网金融数据分析以及实时数据传输有着丰富的经验,擅长利用 serverless 及大数据技术快速实现并挖掘用户潜在的数据价值。

刘科

西云数据解决方案架构师,15+ 年 IT 研发、管理经验,擅长系统架构、Devops、网络、安全等技术方向。