无服务器应用 DevOps 最新实践 (内附完整演讲 + 视频)
本文内容选自 2021 中国 DevOps 社区峰会 · 大连站,孙华老师分享的《无服务器应用 DevOps 最新实践》文字实录和视频回放。
扫码查看视频回放
以下是演讲文字实录:
大家好,我是孙华,亚马逊云科技无服务器产品专家。很高兴今天有机会跟大家交流无服务器应用 DevOps 最新实践。今天在我这边 45 分钟的时间里面,想跟大家介绍一下什么是无服务器应用,如何开发部署无服务器应用,怎么做 CI/CD 和监控,如何做到安全的部署等等。
什么是无服务器应用
在亚马逊云科技,我们认为无服务器计算帮您做到无需管理服务器就可以运行你的代码。你提供代码,定义一下您的代码在什么事件下运行。比如当用户访问您的网站时,亚马逊会自动提供计算资源,运行你的代码,为用户展示您的网站的内容。
对于亚马逊来说,无服务器计算意味着您不需要部署、安装、升级服务器,同时还可以帮您自动扩展应用。例如,您的 APP 应用,当用户数量快速增加的时候,Serverless 会帮您自动增加计算资源,保证客户可以得到快速响应。无服务器应用按照代码实际运行的时长来计费,避免浪费资源。
常见的应用,负载总会有波峰波谷的。例如一个游戏,在白天和夜晚的用户访问量可能相差十倍。如果按照峰值部署需要的服务器,会有大量的服务器闲置。Serverless 按照代码实际运行时长计费,您可以节省很多的成本。无服务器服务是内置高可用的。亚马逊的无服务器计算服务的计算资源分布在多个可用区。如果一个可用区出现问题,会在其他可用区继续运行,同时其他的可用区有足够的冗余容量来承载这些额外的负载。这样的高可用冗余的计算集群,成本是相当可观的。但是对于用户来说,当您使用这样的 Serverless 服务时,只需要按照您的代码运行的实际时长,按照毫秒计费。
亚马逊的无服务器计算服务 Amazon Lambda 到今年已经发布了 7 年了。大量用户把 Amazon Lambda 用在各种场景。首先是 IT 自动化。在亚马逊上所有服务都提供 API,您可以轻松的通过这些 API 去实现自动化运维。比如您在云上搭建了开发测试环境,这些环境在大家下班之后都是闲置的。我们可以定义一个定时规则,在下班之后运行一个 Amazon Lambda 函数去关闭这些环境里面的服务器,在早晨上班之前再运行一个 Amazon Lambda 函数去启动这些服务器。这样即可用节省成本,又可以让大家有足够的资源可以使用。另外 Amazon Lambda 每个月提供一百万次调用的免费额度。很多 IT 自动化的用量基本不产生费用,您可以免费使用。
下一个数据场景就是数据处理。用户上传到图片到 Amazon S3 对象存储上,我们要去生成缩略图,或者识别图片里面有哪些对象。Amazon S3 可以在图片上传时自动调用 Amazon Lambda 进行处理。同时在 Amazon IoT 的场景中, 大量 Amazon IoT 的设备采集的数据,可以写入 Kinesis 数据流,通过 Amazon Lambda 进行数据解码和转化,用户可以快速建立实时的监控报表和预警系统。
第三个场景是用户对于 Amazon Lambda 熟悉之后,开始利用 Amazon Lambda 开发支持业务的微服务,比如 Web 应用或者手机应用的后端服务。
第四种场景是机器学习,特别是机器学习的推理。机器学习的科学家和工程师通常不希望去管理服务器,无服务器可以帮助他们快速把训练好的模型部署成生产可用的 API。
可以总结一下前面提到的特点: 无服务器计算,第一就是方便、快捷,不需要去部署服务器、安装操作系统、安装应用需要的依赖等等,直接把代码提交上去配置好事件源就可以了。第二个就是性能,我们有一些客户,提供电子发票服务。电子发票是 PDF 文件,需要转换成缩略图,展示给客户。这个客户原来使用外部的服务去生成 PDF 的缩略图,每个月要花七八万的费用。通过使用 Amazon Lambda,在 PDF 文件上传到 Amazon S3 时触发 Amazon Lambda 函数来做这个事情。发现原来需要 10 秒才能完成,现在用 Amazon Lambda 只需要 2 秒,成本由原来的 8 万降到现在的不到 100 元。这也体现了 Amazon Lambda 可以帮助客户降低成本。第三点是安全。使用 Amazon Lambda,服务器的操作系统和运行时的安全都是由亚马逊来管理的,您只需要负责应用和数据的安全。
因为前面的特性,我们可以看到在 7 年中,有非常多的用户开始使用这个服务,这些应用在上面有上万亿次的使用。
如何开发部署无服务器应用?
我们看一下 Serverless 应用怎么开发的,其实非常的简单,有几个东西,有一个事件源,触发一个函数的处理器,后面在代码里面可以访问任何的服务,后端也好或者 API 也好。
开发也很简单,编写代码、部署到 Amazon Lambda、在事件触发时,代码自动运行。当事件发生的时候,Amazon Lambda 自动触发你的代码。
这是一个很简单的例子,Amazon Lambda 事件里面包括事件源传递过来的数据。这个函数体里面有自己的逻辑代码进行出来,最后返回结果就可以了。
如果要开发 Web 应用,你可以在前端使用 API Gateway 提供 Http,在您的 Amazon Lambda 里面,可以直接使用常见的 Web 框架。
这是一个用 Express.js 开发 Serverless Web 应用的例子,通过 Serverless 把 Express.js 应用包装起来。通过这方式可以做成你喜欢的 Web 应用框架来开发 Serverless Web 应用。
我们如何把 Web 应用打包到 Amazon Lambda 上面?在 re:Invent 2020 的时候,Amazon Lambda 宣布支持容器镜像。Amazon Lambda 支持以容器镜像方式打包和部署函数代码。以前如果太大的依赖库话,可能无法打包到 250MB 的 Amazon Lambda 函数内,所以,使用统一的工具构建容器和基于 Amazon Lambda 的应用,支持最大 10GB 的容器镜像,亚秒级自动扩展,高可用,集成 200 多事件源。
这是一个例子,Amazon Lambda 函数的 Dockerfile,使用 Amazon ECR 公共仓库中的 node.js v12 基础镜像,复制代码和依赖到镜像中,运行 npm 命令安装依赖库,在启动时,使用我的 handler 函数。当然也可以使用自己定义的函数文件,这些都是没有问题的。
开发体验是很简单的,用常规的方式来开发体验,使用容器镜像部署 Amazon Lambda 函数 ,容器镜像,docker push,容器镜像、Amazon ECR,镜像推送到 ECR 镜像仓库,创建函数:状态: Pending、容器镜像、Amazon Lambda,从 Amazon ECR 拉取镜像,优化镜像,创建 Amazon Lambda 函数。调用:状态: Active,Amazon Lambda function,就绪。
Amazon Lambda Adapter 是最新的开源项目。这个项目的作用就可以让在 Amazon Lambda 上运行外部的应用,之前用 Serverless 要加载一个包,通过这个工具不需要修改您的代码,不需要引入任何第三方依赖,Amazon Lambda Adapter,快速开发无服务器 Web 应用的开源工具。通用的 Amazon Lambda API 和 Http API 转接工具,无需在应用中添加新的依赖包,使用任意 Web 框架,使用任意编程语言,使用成熟的开发工具在本地调试,使用 Rust 开发,安全高效。在您的 Dockerfile 里面添加就可以了。
第一个步骤可以在 Dockefile 中使用 Amazon Lambda Adapter 的步骤: 1.复制 Amazon Lambda Adapter;2.用它作为容器的 Entrypoint;3.使用 CMD 运行您的 web 应用 (默认监听端口 8080)。
如何为无服务器应用构建 CICD 流水线?
让我们看看实际的部署应用,因为计费的方式是当你真正使用的时候,或者您去调用的时候才会产生费用,您可以把它部署非常多份,可以给你每一个环境都部署一份,甚至可以给每一个开发人员都部署一套。如果您使用传统架构,很难想象我的生产环境跟我的架构是一样的,不可能给每一个开发人员都部署同样的生产环境,你在 Serverless 上面可以部署同样的环境,没有什么不可能。
在亚马逊上我们会推荐的一个方法就是通过多个帐户来隔离不同的环境,为什么要这么做呢?因为有一些指标是在整个账号范围内共享的,比如说 Amazon Lambda 共发的数量,默认是 1000 个,当然这个是可以提升的,您这个账号是生产和测试是在一个环境里面,你在测试里面跑一些压力测试,可能会造成整个并发而影响到生产,通过不同帐户划分的话,就不会发生这样的情况。
还有一个问题,我们有这么多的环境,我们如何去部署?在云上我们会非常强调一点,Serverless Application Model (SAM)是针对无服务器而优化的 Amazon CloudFormation 扩展,新的无服务器资源类型:函数,API 和简单表,支持 Amazon CloudFormation 支持的任何内容,开源项目(Apache 2.0)。
所以可以用几行代码的描述,可以变成函数,包括安全控制这样的东西。
所以刚才我们提到很多帐户的环境,我们可以通过这样一种方式来部署,我们还可以在开放环境来说,开放环境有环境权限,这样可以快速去验证它的应用,测试发现它的东西是否可以应用,最终来实现他的应用。通过 CI 的方式来触发 sam,通过相应的 Pipelines 来触发相应的环境,最后在 Amazon CloudFormotion 来做相应的部署。
另外一个新的项目是 sam 提供的,我们很多的客户都会遇到一些问题,要创建一个安全、跨账号的 CIDI 的流水线不是一个简单的工作,要花很多的工作量来完成的,Amazon Sam Pipeline,提供常用 CI/CD 系统的流水线模版,体现亚马逊的经验,Jenkins, GitLab CI/CD, GitHub Actions。在这里面还可以制造这样两个环境,还有亚马逊最小安全权限的规则,在这个 Pipelines 里面,最初可以先创造一个环境,帮您去新建 Pipelines 的云上访问控制的服务,然后有对应的 Access Key 和 Secret Access Key,user 这个权限是是获得另外一个角色,没有其他的权限,如果 Access Key 泄漏出去,拿到这个人也不能做什么的。通过精细的权限管理,让您的团队可以快速构建安全高效的 CI/CD 流水线。
如何实现安全部署?
前面讲了如何做部署,在安全部署方面怎么去做?在这里,我们可以通过 API 到 Amazon Lambda alias,最后我们发布新的颁布,V12 上,对于前端来说,他是访问 Amazon Lambda alias。
在部署开始的时候,我们把 10%的流量切换到新版本上。
在这个过程中我们可以等待,等待 3 分钟,监控一些指标,有没有报警,如果在这个等待过程中,发现程序报错,超过多少百分比,或者前端的延长变高了,可以自动把流量切回来了。如果没有问题再继续往下切。
如何监控无服务器应用?
这个我们看一下子监控,涉及到一些指标的问题,这些都是有相应的服务,这个是叫 Amazon Lambda Insights 的服务,下面还有日志和分布式追踪的功能。
这个有很多的企业客户还有自己常用的运营工具,希望用自己的工具去监控所有的环境,以前是比较困难的,我们推出这个 Amazon Lambda extension 服务,在 Amazon Lambda 运行可以修改变量,和 Amazon Lambda 函数在同一进程中运行,可修改运行时进程的启动参数,可设置与语言相关的环境变量和 wrapper 脚本。这个接收你的监控指标,发送到常用的监控手段上去,现在有很多的合作伙伴都提供了这种服务。
还有一种用途除了这种监控来做其他的事情,我们可以用 AppConfig,通过 extension 来访问 AppConfig,你可以打开一个开关去做一些部署。在运行时部署应用配置变更,受控的部署,验证与回滚。
Amazon CodeGuru 来收集您运行 CPU 的一些情况,通过一些方式来减少 Profiler 对您应用的影响,在这里面提升只有很少一部分的 agents 收集,会产生很小的影响,这个是在程序上继续跑,可以帮您收集到 CPU 对应的应用性能火焰图,并且会的自动会给您一些常用的一些建议。
亚马逊在团队通过 CodeGuru 优化把 CPU 利用率提升了 yoy,提升了 325%。Amazon Lambda 也有一个新的功能,通过页面可以直接打开开关,对应您的 CodeGuru。
最后一个例子就是可口可乐,是亚马逊的一个客户,在全球也饮料机大家可以选择,疫情之后大家都不太用这个,可口可乐想做一个不用按键可以在手机上直接操控的机器,这个是大概使用的例子,放上杯子,拿着手机去扫码,然后会打开一个应用,然后选择喜欢喝的饮料的品牌,选择了相应的口味然后按键,之后在 1 秒钟之内饮料就会出来。从手机到云上,API 进来,把控制信号再传回来到这个机器上,整个是在 1 秒钟之内完成的,这个方案从构想、设计、开发、设计、部署、全球的推广,只用了 100 天的时间。
所以,最终来说,希望大家从前面的介绍可以了解到亚马逊的服务和计算,可以帮助大家实现快速、低成本、更强的性能,如果大家有机会使用 Serverless 计算,加入全球这些公司也好,一起来使用 Serverless。
评论