在上篇中,主要介绍了 Serverless Devs 多环境功能的使用,用户读完可能会些疑问,本文会就一些常见问题进行下回答。
可能有些用户会问,既然你们已经支持了 Terraform,那 Serverless Devs 还有什么作用,是不是直接用 Terraform 就可以了?
Serverless Devs 和 Terraform 的定位还是明显不同的。Serverless Devs 面向应用管理及 DevOps,Terraform 面向云资源,是两个不同的领域,但并不表示不能在某些层面有交集或者不能集成,集成和被集成能力本来就是开源工具是否标准化的一个衡量标准。
Terraform 解决的是云资源的 Provisioning,这个领域是有非常清晰的方法论的。而 Serverless Devs 更应该强调如何使用好云资源,两者的关系可以用几个场景说明:
可以看到 Serverless Devs 更加重点关注的是应用运行态以及运维态的操作,这也是 Serverless 架构的工具最重要的使命,但 Serverless Devs 负责的是 Serverless 应用全生命周期管理,必然少不了资源的管理,我们在实践过程中发现,无论是用云产品 SDK 还是 Pulumi 这类 GPLs 都需要投入很大精力在资源生命周期的对接上,这对于组件开发者对接更多云产品来说是非常低效的。而 Terraform 在这方面是最专业的,无论是标准化程度、受认可程度以及资源的丰富度都能很好满足终端用户及开发者的需求,因此才触发 Serverless Devs 和 Terraform 结合这一想法。
Serverless Devs 没有和 Terraform 耦合,相反的是让 Terraform 的 HCL 语言自然的在 Serverless Devs 的组件规范里玩转起来,可以认为是 Serverless Devs 支持多语言的一种能力。对开发者的价值是可以比较低代码的完成基础设施的搭建,把精力投入到和 Serverless 应用生命周期管理相关的开发上,不然就得开发大量的资源CRUD代码,这个是非常低效的。
既然多环境部署也走的是Terraform,那和我直接用Terraform部署资源有什么区别?
在 CI/CD 中使用环境变量,环境变量中配置VPC、NAS啥的,s.yaml中引用环境变量似乎就可以了,为什么还要造一个环境概念?
环境和环境变量从名字就能区分出定位的差异,环境变量就是一组静态配置,虽然可以将一些资源配置写到环境变量内并在 CI/CD 流水线中引用,但这种方式不具备资源纳管的能力。
而环境是个实体资源,具备基础设施的生命周期管理能力,通过环境可以完成基础设施的增删改查,并可以通过访问控制的方式授予用户的操作权限,更新环境时还可以对接一些安全检查的能力。
通过环境可以让基础设施受到保护,比如当多个服务共享环境时,如果发起环境删除,系统会自动发现环境被其他服务所依赖,此时删除会被拒绝。
我是个人开发者,不懂 Terraform,文章中各种模板定义看的有点晕,那我还适合用这个功能么?
个人开发者一样适用,但不应该让这部分用户承担写模板的工作,而是由平台提供各种业务场景化的模板,开发者开箱即用,这也是我们后续的主要工作。
对个人用户来说,上阿里云最复杂的某过于RAM、VPC、ECS、SLB、NAS这些复杂的概念,学习曲线太长。在 Serverless 架构下这个问题尤为明显,Serverless 宣称低门槛、低成本、低运维,但是上手Serverless需要了解一大堆概念,配置一大堆东西,很多用户在这过程中就被"劝退"了,而环境模板和环境可以极大地简化云产品的上手成本,同时又能很安全地操作。举个例子,用户选择一个模板部署环境,就可以一键拉起所有云资源,这样才算是真正的 Serverless。
Serverless Devs 分为 CLI 和 组件:
从 env 命令的通用性以及要解决的问题上看,做到 CLI 内也是合适的。但从实现上看,因为需要一个服务端的控制平面来完成用户资源的部署,出于安全性考虑必须要特定的云服务来完成,所以才通过一个组件来完成。
更多内容关注 Serverless 微信公众号(ID:serverlessdevs),汇集 Serverless 技术最全内容,定期举办 Serverless 活动、直播,用户最佳实践。