作者:封崇
随着现代化应用的普及和企业上云的深入,项目中会涉及越来越多的云资源使用。企业上云过程中,往往会有平台(Platform)团队和基础设施(Infra)团队:平台团队关注业务,根据业务场景进行抽象,对研发人员屏蔽基础设施;基础设施团队关注安全及成本,为平台团队规划了不同的子账号、权限策略以及网络配置。这种分层管理的必然结果导致应用和基础设施的生命周期会完全不同,因此基础设施管理员、平台管理员、研发人员关注的云资源视角也不尽相同。比如:
基础设施管理员管理整家企业的云账号,规划企业的网络配置,并为各个平台团队设置不同子账号以及访问策略;
平台管理员持有子账号,根据容灾及高可用场景划分地域、安全、流量策略;根据业务场景规划日志、存储、数据库的规格、备份配置、Quota 等;根据研发流程要求规划 CI/CD 流水线;
研发人员在使用平台过程中,仅需关注代码、数据、配置等程序相关内容:
因此,随着职责边界的不同,平台团队面临着更大的挑战,既要面向研发人员消化业务,又要面向基础设施团队解释云产品的使用,无疑增加了很多沟通成本,降低了业务的迭代效率。如果能建立一种自动化的管道,让不同团队自助化地完成各自的边界,势必会极大地提升生产力。这需要几个很重要的概念来连接 Dev 和 Ops:
服务:对代码、程序的描述,只描述跟程序相关的信息,比如函数配置、日志采集路径
环境:服务运行在不同的环境上,环境是服务运行的载体,描述了基础设施(如网络、集群、存储)的配置,以及应用运行时的运维配置(如弹性伸缩、资源规格)
流水线:对 CI/CD 的描述,完成代码到服务的构建,并将服务部署到所有的环境上
应用:一组服务、环境、流水线所有资源的集合
要实现高效的自助化操作,合理化的方案是将上述概念进行模板化,并使用如下的工作流来完成:
通过这种分边界的模板化处理方式,可以让企业不同的团队自助完成基础设施的搭建,提高生产效率的同时,又保证了权限隔离,让基础设施受到保护。
Serverless Devs [1]是一款面向 Serverless 应用全生命周期的管理工具,其模型规范中存在应用和服务的概念,但目前缺少对环境的内在支持,代码+基础设施共同维护在一个 s.yaml 下。这种模式在多环境时的限制主要有 3 点:
如果采用本文前言章节中描述的分层的模板化方案,以上问题就可以顺利解决:
那么,接下来的问题就是:如何在 Serverless Devs 中定义环境模板?
环境模板面向的是基础设施,也就是云资源。Serverless Devs 离不开对云资源的操作,传统的做法是在组件中直接使用云产品 SDK,但支持新资源时需要开发相应的组件代码,因此面临着资源扩张带来的开发效率降低以及代码越来越难以维护的问题,更好的方式是通过基础设施即代码(IaC)来完成云资源的创建。
Serverless Devs 在之前的实践中采用 Pulumi ,通过一个单独组件完成对 Pulumi Stack 的封装,但实践下来发现,用 GPLs 来定义 IaC 还是需要模型层面良好的抽象,因此将 Pulumi 推广到组件开发者,在生态成熟度以及灵活性上都不是太好。目前 IaC 生态最强大的工具是 Terraform,已成为事实标准。Terraform HCL 本身是一种 DSL,任何生态都能很好地兼容,特别是 Provider 极其丰富。
阿里云的云产品如果对接 POP,能够自动生成 Terraform 的 Provider,其可靠性和接入便捷程度已经相当之高。如果将环境模板的定义通过 Terraform IaC 来完成,并且在 Serverless Devs 的体系内能够良好地衔接,这样可以极大拓宽用户领域,用户可以通过编写 Terraform 文件来定义自己的基础设施,用 Serverless Devs 完成所有工作流的串联。
遵循 Serverless Devs 的组件开发规范,将多环境的操作封装成 env 命令,通过利用 s env 命令,可以实现如下的工作流:
下面我们通过一个实际案例演示整个操作流程。假设业务场景需要:
作为平台管理员,需要为研发:
环境模板采用 IaC 来定义资源,目前只支持 Terraform 类型的模板。环境模板的代码目录要包含两类文件:
IaC 文件:即 Terraform 的 .tf 文件,IaC 文件的核心要素为:
编写 IaC,定义环境模板的 variable、resource、output。完整代码示例:
https://github.com/devsapp/fc/blob/main/examples/multi-envs/infra/main.tf
为上述资源定义权限策略,保持权限最小原则,仅放开必要的写权限。由于 Terraform 在创建资源时会依赖很多资源的读权限,因此推荐再增加这些常用的读权限:
AliyunECSReadOnlyAccess
AliyunVPCReadOnlyAccess
AliyunNASReadOnlyAccess
AliyunOSSReadOnlyAccess
AliyunLogReadOnlyAccess
完整代码示例:
https://github.com/devsapp/fc/blob/main/examples/multi-envs/infra/policy.json
通过 s env apply-template 发布环境模板
s env apply-template --name testing --description 'it is a demo' --code ./infra
参数含义如下:
操作成功后,会返回当前模板的 varibale、outputs、状态、 policy、文本内容、版本 等信息。
环境需要操作对应云资源的权限,授予函数计算以角色扮演的方式访问的云资源,因此需要:
通过 s env init 命令进入交互式操作,输入环境名、地域、角色、环境模板以及模板参数,完成环境的部署:
点击查看操作视频:
https://developer.aliyun.com/live/249417
执行成功后,会在本地 .s 目录下创建 env/fc-env-testing.yaml 描述文件,可以查看并编辑该文件。
开发人员编写 s.yaml,并将基础设施配置关联到指定环境。可以通过如下方式:
通过 s deploy --env 将函数部署到指定的环境中。
s deploy --env fc-env-testing
执行指令后,组件会先判断环境是否已经部署,如果环境状态为 ready ,则会将服务部署到该环境上;否则会先部署环境,再部署服务。
本文通过分析企业全面上云时,遇到的应用和基础设施管理的挑战,提出采用分层的模板化方式来组织不同团队的工作流,通过环境、服务、流水线来定义一个现代化的应用,通过环境模板、服务模板、流水线模板来屏蔽基础设施的复杂性并提升操作安全性,核心是需要一个管道来串联整个工作流,让 DevOps 的各个阶段可以自助化并安全的完成。作者希望 Serverless Devs 可以充当这个管道,其应用、组件、插件的思路为开发者提供了良好的构建现代化应用的基础,并且 Serverless Devs 已经具备了服务及服务模板的抽象,需要扩展的是环境、流水线的能力。
本文关注点是如何利用 Serverless Devs 管理多环境,分析了关键的挑战是要解耦代码和基础设施,利用 IaC 来完成基础设施的定义,而 IaC 生态下最适合引入的是 Terraform,因此选择用 Terraform HCL 来定义环境模板,环境的资源编排通过后端的 Terraform 服务来完成。这样就可以通过 Serverless Devs 来完成 “发布环境模板” -> “部署环境” -> “部署应用到指定环境” 的完整工作流。
当然,要实现上述终态的愿景还有很长的路要走,未来规划主要的 Roadmap 是:
本篇介绍了 Serverless Devs 多环境功能的使用,在下一篇中我会就一些常见问题,进行详细解读。
参考链接:
Serverless Devs:
https://www.serverless-devs.com/
Pulumi:
https://www.pulumi.com/
Terraform:
https://www.terraform.io/
RAM:
https://www.aliyun.com/product/ram?spm
阿里云函数计算(FC):
https://www.aliyun.com/product/fc
本场景基于 Serverless 应用中心 + 阿里云函数计算 + 开源企业级在线文件管理系统 KodBox 打造,让你仅用 “几次” 点击,即可拥有一个可随意保存资源、不限速下载、多端使用、与朋友共享资源……的专属个人网盘。
自建真网盘:https://developer.aliyun.com/adc/series/activity/serverlessapp
点击此处,1 分钟 Serverless 极速部署个人网盘!