为 Serverless Devs 插上 Terraform 的翅膀,实现企业级多环境部署(上)

前言

随着现代化应用的普及和企业上云的深入,项目中会涉及越来越多的云资源使用。企业上云过程中,往往会有平台(Platform)团队和基础设施(Infra)团队:平台团队关注业务,根据业务场景进行抽象,对研发人员屏蔽基础设施;基础设施团队关注安全及成本,为平台团队规划了不同的子账号、权限策略以及网络配置。 这种分层管理的必然结果导致应用和基础设施的生命周期会完全不同,因此基础设施管理员、平台管理员、研发人员关注的云资源视角也不尽相同。比如:

  • 基础设施管理员管理整家企业的云账号,规划企业的网络配置,并为各个平台团队设置不同子账号以及访问策略;
  • 平台管理员持有子账号,根据容灾及高可用场景划分地域、安全、流量策略;根据业务场景规划日志、存储、数据库的规格、备份配置、Quota 等;根据研发流程要求规划 CI/CD 流水线;
  • 研发人员在使用平台过程中,仅需关注代码、数据、配置等程序相关内容:
  • 当需要访问数据库时,向平台索要数据连接串;
  • 当需进行日志采集时,将采集路径提交给平台,由平台操作日志服务完成日志采集配置挂载;
  • 当需要使用持久化存储时,将本地挂载路径提交给平台,由平台操作存储服务完成文件目录挂载;
  • 发布代码,自动触发 CI/CD 流水线的执行;

因此,随着职责边界的不同,平台团队面临着更大的挑战,既要面向研发人员消化业务,又要面向基础设施团队解释云产品的使用,无疑增加了很多沟通成本,降低了业务的迭代效率。

如果能建立一种自动化的管道,让不同团队自助化地完成各自的边界,势必会极大地提升生产力。这需要几个很重要的概念来连接 Dev 和 Ops:

  • 服务:对代码、程序的描述,只描述跟程序相关的信息,比如函数配置、日志采集路径
  • 对于函数型应用,服务一般描述一个函数
  • 对于容器化应用, 服务一般描述一个 Workload
  • 环境:服务运行在不同的环境上,环境是服务运行的载体,描述了基础设施(如网络、集群、存储)的配置,以及应用运行时的运维配置(如弹性伸缩、资源规格)
  • 流水线:对 CI/CD 的描述,完成代码到服务的构建,并将服务部署到所有的环境上
  • 应用:一组服务、环境、流水线所有资源的集合

要实现高效的自助化操作,合理化的方案是将上述概念进行模板化,并使用如下的工作流来完成:

  • 平台管理员将网络、日志服务、存储、数据库等基础设施资源根据测试/生产隔离的要求,封装成环境模板;将阿里云函数计算(FC)的函数、Serverless 应用引擎(SAE )应用这些研发关注的业务资源封装成服务模板;将 CI/CD 的基础流程封装成流水线模板;
  • 基础设施管理员审核模板,通过后为平台管理员分配对应的子账号;
  • 平台管理员持有子账号选择环境模板创建不同的测试、预发、生产环境,然后授予研发子账号访问权限,或者授予研发写权限来自助创建环境;
  • 研发人员选择服务模板以及关联的环境来创建服务,实现将应用程序自动部署到指定的环境上;
  • 研发人员选择流水线模板,通过主动触发或者代码提交自动触发 CI/CD 的执行。

通过这种分边界的模板化处理方式,可以让企业不同的团队自助完成基础设施的搭建,提高生产效率的同时,又保证了权限隔离,让基础设施受到保护。

Serverless Devs 支持多环境所面临的挑战

Serverless Devs [1]是一款面向 Serverless 应用全生命周期的管理工具,其模型规范中存在应用和服务的概念,但目前缺少对环境的内在支持,代码+基础设施共同维护在一个 s.yaml 下。这种模式在多环境时的限制主要有3点:

  1. 要为不同的环境维护不同的 s.yaml,维护成本比较高。更新环境时需要重新发起部署,对接 CI/CD 服务时就要重新发起一次完整的发布上线操作。(但通常情况下环境的变化,例如升降配、更新权限,对程序来说是安全的,不需要发起一次上线);
  2. 难以实现基础设施团队、平台团队、研发团队分层协作的场景。比如阿里云函数计算的服务描述提供了日志、网络、NAS、服务角色等平台管理员视角的配置。收到客户反馈,这些配置是干嘛的研发基本都不清楚,无疑减低了研发效率并增加了安全风险,经常出现研发改错配置导致线上服务有损的情况;
  3. Serverless Devs 的资源操作主要由组件来实现,但对于一些资源的变更可能会引起实例重建或者不能提供服务(比如更改数据库引擎、更换了FC的服务角色、更换VPC)的风险,组件开发者未必会清楚也可能会忽略,即使清楚也需要 Case By Case 的通过很多判断代码来解决,这无疑增加了组件开发的复杂度和使用成本;

如果采用本文前言章节中描述的分层的模板化方案,以上问题就可以顺利解决:

  1. 平台团队通过封装环境模板,仅需对研发人员暴露安全的参数(比如实例规格),研发人员使用模板创建环境,填写必要的参数即可完成基础设施的搭建;通过更新环境即可自助化地完成基础设施的升级,并且不需要重新发起代码发布操作;
  2. 平台团队在环境模板中声明更加严格的访问策略,拒绝某些有风险的资源操作,可以更好地控制爆炸半径;

那么,接下来的问题就是:如何在 Serverless Devs 中定义环境模板?

当 Serverless Devs 遇见 Terraform

环境模板面向的是基础设施,也就是云资源。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 命令,可以实现如下的工作流:

  1. 通过基础设施即代码(IaC)的能力定义可复用的环境模板
  2. 基于模板构建不同的测试、预发、生产等互相隔离的环境,并自动完成基础设施的搭建
  3. 将函数的同一份代码部署到不同的环境上

下面我们通过一个实际案例演示整个操作流程。

假设业务场景需要:

  • 在函数中读写OSS文件
  • 日志文件写入NAS,前端做实时展现
  • 函数日志写入SLS,做系统分析

作为平台管理员,需要为研发:

  • 创建 OSS Bucket,Bucket 名字研发可以自己指定,但是ACL策略必须是私有
  • 创建 NAS 挂载点,涉及的VPC、VSwitch、NAS文件系统、访问组、挂载点完全由管理员指定
  • 创建SLS Project 、Logstore,名字研发可以自己指定,但是自动分裂、最大分裂数完全由管理员指定

01 平台管理员:开发环境模板

环境模板采用 IaC 来定义资源,目前只支持 Terraform 类型的模板。环境模板的代码目录要包含两类文件:

  • IaC文件:即 Terraform 的 .tf 文件,IaC 文件的核心要素为:
  • variable:定义模板的参数,用户使用该模板创建环境时输入参数的值
  • resource:定义模板的资源,环境部署时完成资源的创建
  • output:定义模板的输出,环境部署成功后透出相应输出,可以被其他服务所访问

  • policy.json:RAM 的权限策略数组,支持自定义策略和系统策略,声明了使用该模板创建资源所需要的权限,授信对象是 函数计算。部署环境时,函数计算会通过角色扮演的方式访问模板中定义的资源。

编写 IaC,定义环境模板的 variable、resource、output。

完整代码示例:
https://github.com/devsapp/fc/blob/main/examples/multi-envs/infra/main.tf

为上述资源定义权限策略,保持权限最小原则,仅放开必要的写权限。由于 Terraform 在创建资源时会依赖很多资源的读权限,因此推荐再增加 AliyunECSReadOnlyAccess、AliyunVPCReadOnlyAccess、AliyunNASReadOnlyAccess 这些常用的读权限。

完整代码示例:
https://github.com/devsapp/fc/blob/main/examples/multi-envs/infra/policy.json

02 平台管理员:发布环境模板

通过 s env apply-template 发布环境模板

s env apply-template --name testing --description 'it is a demo' --code ./infra

参数含义如下:

参数全称

是否必填

参数含义

name

True

环境模板名字

description

False

环境模板描述

code

False

模板代码目录

操作成功后,会返回当前模板的 varibale、outputs、状态、 policy、文本内容、版本 等信息。

03 研发:使用环境模板创建环境

环境需要操作对应云资源的权限,授予函数计算以角色扮演的方式访问的云资源,因此需要:

  1. 创建普通的服务角色,授信服务选择函数计算
  2. 为该角色授予环境所需要的权限

通过 s env init 命令进入交互式操作,输入环境名、地域、角色、环境模板以及模板参数,完成环境的部署:

执行成功后,会在本地 .s 目录下创建 env/fc-env-testing.yaml 描述文件,可以查看并编辑该文件。

04 研发:部署函数到指定环境

开发人员编写s.yaml,并将基础设施配置关联到指定环境。可以通过如下方式:

  • 通过environment.outputs来关联环境模板中定义的输出
  • FC 的服务往往和一个环境相映射,通常在创建服务时服务名要带上环境的后缀,可以通过environment.name让服务和环境自动关联
  • 指定环境时,无需在 props 中指定 region,组件会自动保证将服务部署到环境所在的 region

通过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?

原文链接

本文为阿里云原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/510717.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

达摩院打破权威榜单纪录,中文语言理解表现首超人类

11月25日消息,在最新的中文语言理解领域权威榜单CLUE中,阿里AI以86.685的总分成绩创造了新纪录,这是该榜单诞生近三年以来,AI首次超越人类成绩(86.678),意味着AI模型的中文语言理解水平达到了新…

阿里云云原生一体化数仓 — 离线实时一体化新能力解读

实时离线一体化概述 在讲实时离线一体化概述前,可以先回顾一下之前两位阿里同学的精彩演讲。 离线实时一体化数仓与湖仓一体--云原生大数据平台的持续演讲 https://developer.aliyun.com/article/804337 云原生离线实时一体化数仓建设与实践: https:/…

50 万开发者不愿付费使用,Python 代码补全神器 Kite 失败!

作者 | 苏宓出品 | CSDN(ID:CSDNnews)AI 编程距离程序员还有多远?如果说 GitHub Copilot 的到来,让众多开发者看到了希望,那么初创公司 Kite 的倒闭,也让我们认清了现实。Kite 是一家使用 AI 帮…

模拟 IDC spark 读写 MaxCompute 实践

一、背景 1、背景信息 现有湖仓一体架构是以 MaxCompute 为中心读写 Hadoop 集群数据,有些线下 IDC 场景,客户不愿意对公网暴露集群内部信息,需要从 Hadoop 集群发起访问云上的数据。本文以 EMR (云上 Hadoop)方式模…

基因检测,如何帮助患者对抗疾病?

为什么别人胡吃海塞都依然瘦成竹竿,我喝水都会胖? 为什么我这么不幸,疾病会找上我?早知道就不乱喝酒。 为什么是同一种病,别人吃这个药有用,我吃却没用? 从日常的健康管理、疾病预防&#xf…

“小语言”才是编程的未来!

摘要:随着软件功能不断增加,代码数量也日益膨胀,我们要如何停止不断堆砌,甚至缩小软件体积?本文作者提出了一种可能性:“小语言”。链接:https://chreke.com/little-languages.html声明&#xf…

夯实密码基础服务,服务上层应用

“十四五”是国家数字化战略转型建设的关键阶段,5G、人工智能、云计算、大数据等新一代信息技术进一步加快了工业和信息化领域数字化转型的步伐。与此同时,也带来了新的网络安全风险。加快推动商用密码与新一代信息技术的深度融合和协同创新,…

储留香:数据迁移上云避坑指南

简介: 常言道:人往高处走,水往四面八方流,而让数据如水一般流动则是IT人孜孜以求的。那么在如今这个风起“云”涌,不管是上云,还是换云都涉及到数据迁移的时代,如何做到这一点呢?今天…

为 Serverless Devs 插上 Terraform 的翅膀,实现企业级多环境部署(下)

在上篇中,主要介绍了 Serverless Devs 多环境功能的使用,用户读完可能会些疑问,本文会就一些常见问题进行下回答。 1、Serverless Devs 和 Terraform 的关系 可能有些用户会问,既然你们已经支持了 Terraform,那 Serv…

这个简单的小功能,半年为我们产研团队省下213个小时

大多数人对产研同学的认知都是每天做着高大上的活儿。 我们以为的产研团队是: 研发负责人:今年最新的技术架构是什么、我的团队适合吗?开发同学:010001,一顿代码猛如虎测试同学:OK,测试一次性…

腾讯云开源项目Crane成FinOps首个认证降本增效开源方案

刚刚,腾讯云开源项目 Crane(Cloud Resource Analytics and Economics)正式成为FinOps认证解决方案(FinOps Certified Solutions)。作为全球范围内首个开源的FinOps认证解决方案,Crane能够助力云原生用户充分发挥云上资源的最大价值…

JDBC 在性能测试中的应用

前言 我们能否绕开 http 协议,直接测试数据库的性能?是否觉得从数据库中导出 CSV 文件来构造压测数据很麻烦?怎样在压测结束后做数据清理?能不能通过数据库中的插入(删除)记录对压测请求做断言&#xff1f…

不喜欢 D 和 C++,程序员将 58000 行代码移植到 Jai 语言?

摘要:将已有的上万行代码迁移至另一种编程语言,从来就不是一件容易决定的事情,而本文作者却信心满满地要将 5.8 万行代码全部用另一种不那么主流的语言重写,这是为什么呢?链接:https://www.yet-another-blo…

传统微服务框架如何无缝过渡到服务网格 ASM

背景 软件技术的发展历史,从单体的应用,逐渐演进到分布式应用, 特别是微服务理念的兴起,让大规模、高并发、低延迟的分布式应用成为可能。云原生时代下,微服务框架本身也在不断地进化和迭代演进。 微服务框架一般会涉…

基于 K8s 的交付难题退退退!

大家好,我是专注于交付的王小锤,看过交付铁三角系列故事(专注交付的我小锤,开发老哥铁子和售前大佬强哥)的同学想必都知道,我们三人服务于一家提供大数据分析服务的 ISV 企业,在应用交付过程中时…

小迈科技 X Hologres:高可用的百亿级广告实时数仓建设

通过本文,我们将会介绍小迈科技如何通过Hologres搭建高可用的实时数仓。 一、业务介绍 小迈科技成立于 2015 年 1 月,是一家致力以数字化领先为优势,实现业务高质量自增长的移动互联网科技公司。始终坚持以用户价值为中心,以数据…

移动云探索自主技术核心地带,拥抱开发者共筑全新技术生态

在数字经济向更多新领域渗透,5G、物联网等数字经济核心技术应用加速的助推下,云计算作为最主流的算力解决方案,需求增长迅速。随着国内云计算技术生态发展的不断成熟,各行各业上云的步伐也在不断加快。同时,由于企业的…

深度解读 RocketMQ 存储机制

RocketMQ 实现了灵活的多分区和多副本机制,有效的避免了集群内单点故障对于整体服务可用性的影响。存储机制和高可用策略是 RocketMQ 稳定性的核心,社区上关于 RocketMQ 目前存储实现的分析与讨论一直是一个热议的话题。本文想从一个不一样的视角&#x…

IOC-golang 的 AOP 原理与应用

AOP 与 IOC 的关系 AOP (面向切面编程)是一种编程设计思想,旨在通过拦截业务过程的切面,实现特定模块化的能力,降低业务逻辑之间的耦合度。这一思路在众多知名项目中都有实践。例如 Spring 的切点 PointCut 、 gRPC的…

达摩院技术创新全景|懂你的语音AI

过去十年,语音AI从实验室走向应用,语音搜索、交互早已融入日常。本文将带你一览达摩院语音AI技术创新全景,一起感受能听、会说、懂你的语音AI。 当你在家中与智能音箱进行交互对话,当你使用天猫超市或菜鸟裹裹,接到机器…