头图

本文内容选自2021中国DevOps社区峰会 · 大连站,孙华老师分享的《无服务器应用DevOps最新实践》文字实录和视频回放。

image.png

扫码查看视频回放

以下是演讲文字实录:

大家好,我是孙华,亚马逊云科技无服务器产品专家。很高兴今天有机会跟大家交流无服务器应用DevOps最新实践。今天在我这边45分钟的时间里面,想跟大家介绍一下什么是无服务器应用,如何开发部署无服务器应用,怎么做CI/CD和监控,如何做到安全的部署等等。

什么是无服务器应用

image.png

在亚马逊云科技,我们认为无服务器计算帮您做到无需管理服务器就可以运行你的代码。你提供代码,定义一下您的代码在什么事件下运行。比如当用户访问您的网站时,亚马逊会自动提供计算资源,运行你的代码,为用户展示您的网站的内容。

对于亚马逊来说,无服务器计算意味着您不需要部署、安装、升级服务器,同时还可以帮您自动扩展应用。例如,您的APP应用,当用户数量快速增加的时候,Serverless会帮您自动增加计算资源,保证客户可以得到快速响应。无服务器应用按照代码实际运行的时长来计费,避免浪费资源。

常见的应用,负载总会有波峰波谷的。例如一个游戏,在白天和夜晚的用户访问量可能相差十倍。如果按照峰值部署需要的服务器,会有大量的服务器闲置。Serverless按照代码实际运行时长计费,您可以节省很多的成本。无服务器服务是内置高可用的。亚马逊的无服务器计算服务的计算资源分布在多个可用区。如果一个可用区出现问题,会在其他可用区继续运行,同时其他的可用区有足够的冗余容量来承载这些额外的负载。这样的高可用冗余的计算集群,成本是相当可观的。但是对于用户来说,当您使用这样的Serverless服务时,只需要按照您的代码运行的实际时长,按照毫秒计费。

image.png

亚马逊的无服务器计算服务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。

image.png

可以总结一下前面提到的特点: 无服务器计算,第一就是方便、快捷,不需要去部署服务器、安装操作系统、安装应用需要的依赖等等,直接把代码提交上去配置好事件源就可以了。第二个就是性能,我们有一些客户,提供电子发票服务。电子发票是PDF文件,需要转换成缩略图,展示给客户。这个客户原来使用外部的服务去生成PDF的缩略图,每个月要花七八万的费用。通过使用Amazon Lambda,在PDF文件上传到Amazon S3时触发Amazon Lambda函数来做这个事情。发现原来需要10秒才能完成,现在用Amazon Lambda只需要2秒,成本由原来的8万降到现在的不到100元。这也体现了Amazon Lambda可以帮助客户降低成本。第三点是安全。使用Amazon Lambda,服务器的操作系统和运行时的安全都是由亚马逊来管理的,您只需要负责应用和数据的安全。

image.png

因为前面的特性,我们可以看到在7年中,有非常多的用户开始使用这个服务,这些应用在上面有上万亿次的使用。

如何开发部署无服务器应用?

image.png

我们看一下Serverless应用怎么开发的,其实非常的简单,有几个东西,有一个事件源,触发一个函数的处理器,后面在代码里面可以访问任何的服务,后端也好或者API也好。

image.png

开发也很简单,编写代码、部署到Amazon Lambda、在事件触发时,代码自动运行。当事件发生的时候,Amazon Lambda自动触发你的代码。

image.png

这是一个很简单的例子,Amazon Lambda事件里面包括事件源传递过来的数据。这个函数体里面有自己的逻辑代码进行出来,最后返回结果就可以了。

image.png

如果要开发Web应用,你可以在前端使用API Gateway提供Http,在您的Amazon Lambda里面,可以直接使用常见的Web框架。

image.png

这是一个用Express.js开发Serverless Web应用的例子,通过Serverless把Express.js应用包装起来。通过这方式可以做成你喜欢的Web应用框架来开发Serverless Web应用。

image.png

我们如何把Web应用打包到Amazon Lambda上面?在re:Invent 2020的时候,Amazon Lambda 宣布支持容器镜像。Amazon Lambda 支持以容器镜像方式打包和部署函数代码。以前如果太大的依赖库话,可能无法打包到250MB的Amazon Lambda函数内,所以,使用统一的工具构建容器和基于Amazon Lambda 的应用,支持最大10GB的容器镜像,亚秒级自动扩展,高可用,集成200多事件源。

image.png

这是一个例子,Amazon Lambda函数的Dockerfile,使用Amazon ECR公共仓库中的node.js v12基础镜像,复制代码和依赖到镜像中,运行npm命令安装依赖库,在启动时,使用我的handler函数。当然也可以使用自己定义的函数文件,这些都是没有问题的。

image.png

开发体验是很简单的,用常规的方式来开发体验,使用容器镜像部署Amazon Lambda函数 ,容器镜像,docker push,容器镜像、Amazon ECR,镜像推送到ECR镜像仓库,创建函数:状态: Pending、容器镜像、Amazon Lambda,从Amazon ECR拉取镜像,优化镜像,创建Amazon Lambda函数。调用:状态: Active,Amazon Lambda function,就绪。

image.png

Amazon Lambda Adapter是最新的开源项目。这个项目的作用就可以让在Amazon Lambda上运行外部的应用,之前用Serverless要加载一个包,通过这个工具不需要修改您的代码,不需要引入任何第三方依赖,Amazon Lambda Adapter,快速开发无服务器Web应用的开源工具。通用的Amazon Lambda API和Http API转接工具,无需在应用中添加新的依赖包,使用任意Web框架,使用任意编程语言,使用成熟的开发工具在本地调试,使用Rust开发,安全高效。在您的Dockerfile里面添加就可以了。

image.png

第一个步骤可以在Dockefile中使用Amazon Lambda Adapter的步骤: 1.复制Amazon Lambda Adapter;2.用它作为容器的Entrypoint;3.使用CMD运行您的web应用 (默认监听端口8080)。

如何为无服务器应用构建CICD流水线?

image.png

让我们看看实际的部署应用,因为计费的方式是当你真正使用的时候,或者您去调用的时候才会产生费用,您可以把它部署非常多份,可以给你每一个环境都部署一份,甚至可以给每一个开发人员都部署一套。如果您使用传统架构,很难想象我的生产环境跟我的架构是一样的,不可能给每一个开发人员都部署同样的生产环境,你在Serverless上面可以部署同样的环境,没有什么不可能。

image.png

在亚马逊上我们会推荐的一个方法就是通过多个帐户来隔离不同的环境,为什么要这么做呢?因为有一些指标是在整个账号范围内共享的,比如说Amazon Lambda共发的数量,默认是1000个,当然这个是可以提升的,您这个账号是生产和测试是在一个环境里面,你在测试里面跑一些压力测试,可能会造成整个并发而影响到生产,通过不同帐户划分的话,就不会发生这样的情况。

image.png

还有一个问题,我们有这么多的环境,我们如何去部署?在云上我们会非常强调一点,Serverless Application Model (SAM)是针对无服务器而优化的Amazon CloudFormation扩展,新的无服务器资源类型:函数,API和简单表,支持Amazon CloudFormation支持的任何内容,开源项目(Apache 2.0)。

image.png

所以可以用几行代码的描述,可以变成函数,包括安全控制这样的东西。

image.png

所以刚才我们提到很多帐户的环境,我们可以通过这样一种方式来部署,我们还可以在开放环境来说,开放环境有环境权限,这样可以快速去验证它的应用,测试发现它的东西是否可以应用,最终来实现他的应用。通过CI的方式来触发sam,通过相应的Pipelines来触发相应的环境,最后在Amazon CloudFormotion来做相应的部署。

image.png

另外一个新的项目是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流水线。

如何实现安全部署?

image.png

前面讲了如何做部署,在安全部署方面怎么去做?在这里,我们可以通过API到Amazon Lambda  alias,最后我们发布新的颁布,V12上,对于前端来说,他是访问Amazon Lambda alias。

image.png

在部署开始的时候,我们把10%的流量切换到新版本上。

image.png

在这个过程中我们可以等待,等待3分钟,监控一些指标,有没有报警,如果在这个等待过程中,发现程序报错,超过多少百分比,或者前端的延长变高了,可以自动把流量切回来了。如果没有问题再继续往下切。

如何监控无服务器应用?

image.png

这个我们看一下子监控,涉及到一些指标的问题,这些都是有相应的服务,这个是叫Amazon Lambda Insights的服务,下面还有日志和分布式追踪的功能。

image.png

这个有很多的企业客户还有自己常用的运营工具,希望用自己的工具去监控所有的环境,以前是比较困难的,我们推出这个Amazon Lambda extension服务,在Amazon Lambda运行可以修改变量,和Amazon Lambda函数在同一进程中运行,可修改运行时进程的启动参数,可设置与语言相关的环境变量和wrapper脚本。这个接收你的监控指标,发送到常用的监控手段上去,现在有很多的合作伙伴都提供了这种服务。

image.png

还有一种用途除了这种监控来做其他的事情,我们可以用AppConfig,通过extension来访问AppConfig,你可以打开一个开关去做一些部署。在运行时部署应用配置变更,受控的部署,验证与回滚。

image.png

image.png

image.png

image.png

Amazon CodeGuru 来收集您运行CPU的一些情况,通过一些方式来减少Profiler对您应用的影响,在这里面提升只有很少一部分的agents收集,会产生很小的影响,这个是在程序上继续跑,可以帮您收集到CPU对应的应用性能火焰图,并且会的自动会给您一些常用的一些建议。

image.png

image.png

亚马逊在团队通过CodeGuru优化把CPU利用率提升了yoy,提升了325%。Amazon Lambda也有一个新的功能,通过页面可以直接打开开关,对应您的CodeGuru。

image.png

image.png

最后一个例子就是可口可乐,是亚马逊的一个客户,在全球也饮料机大家可以选择,疫情之后大家都不太用这个,可口可乐想做一个不用按键可以在手机上直接操控的机器,这个是大概使用的例子,放上杯子,拿着手机去扫码,然后会打开一个应用,然后选择喜欢喝的饮料的品牌,选择了相应的口味然后按键,之后在1秒钟之内饮料就会出来。从手机到云上,API进来,把控制信号再传回来到这个机器上,整个是在1秒钟之内完成的,这个方案从构想、设计、开发、设计、部署、全球的推广,只用了100天的时间。

image.png

image.png

所以,最终来说,希望大家从前面的介绍可以了解到亚马逊的服务和计算,可以帮助大家实现快速、低成本、更强的性能,如果大家有机会使用Serverless计算,加入全球这些公司也好,一起来使用Serverless。


亚马逊云开发者
2.9k 声望9.6k 粉丝

亚马逊云开发者社区是面向开发者交流与互动的平台。在这里,你可以分享和获取有关云计算、人工智能、IoT、区块链等相关技术和前沿知识,也可以与同行或爱好者们交流探讨,共同成长。