在软件及互联⽹应⽤开发领域,微服务与DevOps已是⾮常深⼊⼈⼼的概念:微服务架构是应 ⽤程序解决业务耦合问题的利器;围绕DevOps理念衍⽣的⼯具、流程和规范使应⽤开发-交付效率得以提升;⽽云计算提供的从基础设施到应⽤软件的全⽅位服务,更是让微服务和DevOps的落地实施得到了极⼤的便利。
本篇⽂章将通过在AWS上构建并发布ServerLess应⽤的完整示例,串联起AWS上与微服务、 DevOps相关的各个服务组件,介绍它们的概念并⼊⻔其⽤法,其中主要包括:
AWS Lambda
AWS SAM
AWS APIGateway
CodeCommit
CodeBuild
CodeDeploy
CodePipeline
开始编写ServerLess应用
所谓ServerLess是新⼀代的云原⽣——微服务架构,其理念是将应⽤交付所关⼼的服务器类型、容量、扩容、操作系统、中间件、运⾏环境等与应⽤逻辑剥离,从⽽使开发⼈员更专注、⾼效地完成业务开发。
AWS Lambda
AWS通过Lambda对ServerLess提供⽀持,⼀个Lambda函数是⼀段由特定事件触发的代码, 当我们将⼀个Lambda函数和某⼀事件源相结合,则构成了⼀个Lambda应用程序,例如:我们把某个函数的事件源设定为AWS APIGateway,Lambda应⽤程序即可作为⼀个WEB API来使用。
AWS SAM
AWS提供了SAM(Serverless Application Model)来⽅便ServerLess应⽤的管理,SAM能够集中管理Lambda函数以及其相关的事件源和资源等,并且⽅便了应⽤的测试和部署。使⽤SAM命令⾏⼯具,执⾏⼏⾏命令即可完成⼀个ServerLess应⽤的构建和发布。
我们来开始使⽤SAM CLI完成⼀个示例应⽤的发布。
前导步骤
在开始示例前需要完成以下前导步骤(以下步骤的操作过程在AWS官⽅⽂档中可以很⽅便找到,这⾥不再赘述):
1.创建AWS账号
2.配置IAM权限
3.安装AWS CLI及AWS SAM CLI,并完成配置
4.创建S3存储桶
完成以上步骤后,我们来正式开始创建ServerLess应用:
1. 初始化应用
执⾏命令:(这⾥程序运⾏环境指定为python3.7,可以通过sam init -h查看⽀持的运⾏环境)
sam init –runtime python3.7 –name hello_world
该命令执⾏完成后会得到⼀个标准化的初始化应⽤⽬录:

其中:
- hello_world/hello_world/app.py 中实现Lambda函数逻辑的代码⽂件
- hello_world/template.yaml 为SAM⽤来定义ServerLess应⽤及其所需资源的模版⽂件

模版⽂件中,我们重点关注的Resources段落,定义了与Lambda相关的运⾏环境、代码路径、函数名称等;Events段落指定该函数的事件源,这⾥设定的是Api,即通过AWS APIGateway将此应⽤API发布出来。
2.构建应⽤
命令:sam build
执⾏构建过程,会将Lambda应⽤及其依赖复制到统⼀⽬录(默认为.aws-sam);
Tips:此处构建所依赖的系统包较多,⽐较容易失败,可以通过添加-u参数使⽤容器环境执行构建过程。
3.打包应⽤
命令:
sam package –output-template packaged.yaml –s3-bucket bucketname
该命令执⾏应⽤打包过程,会将build完成的⽂件压缩到⼀个⽂件,并将该⽂件上传到指定的 S3存储桶中,同时将应⽤包的位置路径信息保存到packaged.yaml⽂件,以供后续应用发布使用。

对⽐template.yaml和packaged.yaml,可以看出打包后代码路径指向了S3存储桶中的对象。
4.发布应用
命令:
sam deploy –template-file packaged.yaml –region region –capabilities CAPABILITY_IAM –stack-name serverless-hello-world
该命令执⾏应⽤发布过程,会按照packaged.yaml⽂件中的指定,将资源组件在AWS上完整的创建出来。

5.测试应用
⾸先执⾏命令:
aws cloudformation describe-stacks –stack-name serverless-hello-world -region region –query “Stacks[].Outputs”
命令输出:

从中获取到API的终端地址,本地尝试访问API:
为ServerLess应⽤组织DevOps流程
在以上五个步骤我们完成了⼀个AWS ServerLess应⽤的构建和发布过程,下⾯我们将其与AWS DevOps⼯具相结合,实现⼀个简易的CI/CD流程。
使⽤CodeCommit创建代码仓库
AWS CodeCommit是由 Amazon Web Services 托管的版本控制服务,我们可以像使⽤GitHub/GitLab等托管Git仓库⼀样使⽤它。创建代码仓库并上传源代码的过程⽐较简单,通过AWS CLI或者在控制台中都能⽐较简单的完 成,可以参考官⽅文档(https://docs.aws.amazon.com/zh_cn/codecommit/latest/userguide/welcome.html)完成操作。
使用CodeBuild构建ServerLess应用
AWS CodeBuild 是⼀项在云中完全托管的构建服务。CodeBuild可编译源代码,运⾏单元测试,并构建可供部署的项⽬。可以类⽐Jenkins或Gitlab中的构建功能。
1.添加构建描述文件
在Lambda应⽤项⽬根⽬录中添加buildspec.yml⽂件,内容示例:

即在构建环境准备阶段明确运⾏环境,并安装相关依赖工具,其步骤和前⾯⼿动执⾏的过程类似。
2.创建构建项目
在AWS CodeBuild控制台创建构建项⽬,其过程⽐较简单,按照⽂档 (https://docs.aws.amazon.com/zh_cn/codebuild/latest/userguide/getting-started.html)指引操作即可。过程中 需要注意⼀点:需要为构建项⽬中创建的⻆⾊分配S3存储桶访问权限,不然构建结果⽆法上传到S3存储桶。
使⽤CodePipeline串联代码构建及发布过程
AWS CodePipeline 是⼀种持续交付服务,可⽤于建模、可视化和⾃动执⾏发布软件所需的步骤。正如Pipeline这个名字,我们将应⽤源码、构建和发布通过管道连接起来,构成⼀个完整的⾃动化流程,这⾥我们介绍CodePipeline中⼏个⽐较关键的概念:
Source: 即管道数据的输⼊端,可以是源码仓库(CodeCommit、GitHub),S3存储桶或者 ECR;可以为源配置事件检测,当源发⽣变化时⾃动触发Pipeline;
Stage: 即流程中的每个过程,可以是构建、发布和其他过程,⼀个Pipeline中可以包含多个 过程;
Pipeline的创建过程实际上是CodeCommit、CodeBuild、CodeDeploy相整合的过程,可以参考 这篇⽂档完成配置:⽂档链接(https://docs.aws.amazon.com/zh_cn/codepipeline/latest/userguide/tutorialsserverlessrepo-auto-publish.html)
当配置完成,我们可以修改Lambda函数中的逻辑,提交到CodeCommit代码仓库,然后就会触发Pipeline的执⾏,根据Pipeline中定义的各个阶段完成应⽤构建和发布。
Pipeline执⾏结果示例:

总结
上面的过程中简单介绍了AWS Lambda应⽤的编写,介绍了AWS DevOps⼯具集,并初步实 现了应⽤的CI/CD流程。AWS Lambda和DevOps的更多功能和应⽤需要我们进一步深⼊学习与 实践。希望本篇⽂章对你有所帮助,今后会有更多相关实践分享,敬请期待。
参考文档:
model/blob/master/versions/2016-10-31.md#specification (https://github.com/awslabs/serverless–
application–model/blob/master/versions/2016-10-31.md#specification)
(https://docs.aws.amazon.com/zh_cn/codepipeline/latest/userguide/welcome.html)
(https://aws.amazon.com/devops/?nc2=h_m2)
- 在AWS上应⽤持续交付和部署⽩⽪书:
https://d1.awsstatic.com/whitepapers/DevOps/practicing–continuous–integrationcontinuous–delivery-on–AWS.pdf (https://d1.awsstatic.com/whitepapers/DevOps/practicing–continuousintegration–continuous–delivery-on–AWS.pdf)