使用 AWS Lambda 和 AWS Step Functions 轻松构建 Serverless 应用

阅读数:21 2019 年 11 月 8 日 08:00

使用AWS Lambda和AWS Step Functions轻松构建Serverless应用
_ 作者: Vivian Zhang(张芸)_
复制代码
Serverless(无服务器)应用可以说是当前的行业热点,用户无需预配置或管理服务器,只需要部署功能代码,AWS Lambda 会在需要的时候执行代码并自动缩放, 从每天几个请求到每秒数千个请求,轻松地实现 FaaS (Function as a Service)。无服务器应用的使用场景非常广阔,从微服务架构,到批处理、流处理、运维自动化和移动计算。
### 实现 Serverless 应用,除了 AWS Lambda 还需要什么?
我们来看一个典型的基于 Lambda 的无服务器应用。
![](https://d2908q01vomqb2.awsstatic-china.com/472b07b9fcf2c2451e8781e944bf5f77cd8457c8/2017/09/13/1-2.png)
当我们将作为计算和存储实体的 Lambda 函数、消息队列、DB 去掉,可以看到下面这张图。
![](https://d2908q01vomqb2.awsstatic-china.com/472b07b9fcf2c2451e8781e944bf5f77cd8457c8/2017/09/13/2-3.png)
这张图上的箭头,就是上一张图里 Lambda 函数之间的流程,或者可以称为 Lambda 函数之间的“胶水”,它们起到了编排协调各个 Lambda 函数的作用。通常在应用中,我们会需要有这样的一些流程:
* 我想要顺序地执行方法。
* 我想要并行地运行这些方法。
* 我想要基于数据选择执行方法。
* 我想要重试某些方法。
* 我想要 try/catch/finally。
* 我想要代码运行一定时间或者等待一段时间……
通常我们可以通过方法调用、函数链、DB 和消息队列来协调这些函数,实现流程。但是对于所采用的协调机制,我们都希望它具有以下功能:
* 可以自动伸缩;
* 不会丢失状态;
* 可以处理错误和超时;
* 可以简单的搭建和运维;
* 可以审计。
这里我们介绍一种方式,采用 AWS Step Functions 协调 Lambda 函数之间的流程。
### AWS Step Functions
AWS Step Functions 是一个可视工作流服务,可用来轻松协调分布式应用程序和微服务的各个组件。用户从单个组件构建应用程序,每个组件都执行一个特定的功能,也就是 Task(可以采用 Lambda 函数实现)。Step Functions 提供了一种可靠的方法来协调这些组件并逐步完成应用程序中的这些功能,并且 提供了一个图形控制台,将应用程序的组件可视化为一系列步骤,它可以自动触发并跟踪每一个步骤,并在出现错误时重试,这样应用程序就可以每一次都按照预先设定的顺序执行。Step Functions 会记录每一步的状态,因此当事情出错时,用户可以快速地诊断和调试问题。
要使用 Step Functions 构建应用,首先我们需要在 Step Functions 里创建 State Machine(状态机),也就是对应每一个应用的工作流程。可以采用以下 8 种蓝图,包括 7 种预定义好的状态机和 1 种自定义的。创建好的状态机用 JSON 描述。
![](https://d2908q01vomqb2.awsstatic-china.com/472b07b9fcf2c2451e8781e944bf5f77cd8457c8/2017/09/13/3-3.png)
在每一个状态机里,我们需要定义一系列的 State(状态),用来完成不同的功能:
* Task:在状态机中完成特定的功能,可以采用 Lambda 函数实现。
* Choice:在各种执行分支中进行选择。
* Fail 和 Success:停止一个执行,并设为 Fail 或者 Success。
* Pass:简单地将输入传给输出,或者注入一些数据。
* Wait:提供一定时间的延迟,或者等待到特定的时间 / 数据。
* Parallel:并行地执行分支。
可以看出,上一节中我们所需要的协调和流程在这些状态中都得到了支持。其中的 Task 状态是用来真正实现应用的功能,而其他状态用来处理功能之间的流程。比如说,下面是一个名为 HelloWorld,执行 Lambda 函数的状态。
![](https://d2908q01vomqb2.awsstatic-china.com/472b07b9fcf2c2451e8781e944bf5f77cd8457c8/2017/09/13/4.png)
下图是一个拥有所有状态的状态机:
![](https://d2908q01vomqb2.awsstatic-china.com/472b07b9fcf2c2451e8781e944bf5f77cd8457c8/2017/09/13/5-2.png)
在 Console 里看到一个创建好的状态机是这样:
![](https://d2908q01vomqb2.awsstatic-china.com/472b07b9fcf2c2451e8781e944bf5f77cd8457c8/2017/09/13/6-1.png)
我们点击 New Execution 并且传入 input 数据,就可以启动该状态机的一次执行,并且可以从界面上查看执行的情况。
此外也可以通过 AWS SDKs,Step Functions API 和 AWS CLI 来启动状态机的执行并且查看进程。
![](https://d2908q01vomqb2.awsstatic-china.com/472b07b9fcf2c2451e8781e944bf5f77cd8457c8/2017/09/13/7.png)
### 采用 AWS Lambda 和 AWS Step Functions 构建 Serverless 应用的例子
这里介绍一个镜像识别和后端处理的例子,展示如何使用 AWS Step Functions 编排一个集成 AWS Lambda、Amazon S3、Amazon DynamoDB 和 Amazon Rekognition 的无服务器处理工作流。此工作流处理上传至 Amazon S3 的照片,并从镜像中提取元数据,如地理位置、大小 / 格式、时间等。然后,它使用镜像识别功能标记照片中的对象,同时还生成照片的缩略图。该例子的源代码在 github 上:https://github.com/awslabs/lambda-refarch-imagerecognition
![](https://d2908q01vomqb2.awsstatic-china.com/472b07b9fcf2c2451e8781e944bf5f77cd8457c8/2017/09/13/8-2.png)
整个架构的流程如下:
1. 一张图片上传到名为 PhotoRepo 的 S3 bucket 里,位于“Incoming/”前缀下。
2. S3 upload event 产生,触发了名为 ImageProcStartExecution 的 Lambda 函数,该函数启动了 AWS Step Functions 中 ImageProc 状态机的执行,并将 S3 bucket 和 object key 作为参数传入状态机。
3. ImageProc 状态机执行以下步骤:
4. 从 S3 中读取文件并抽取出图片的元数据(格式、EXIF 数据、大小等等);
5. 基于上一步骤的输出,验证上传的文件格式是否支持(png 或者 jpg);如果不支持,抛出 NotSupportedImageType 错误并且结束执行。
6. 将抽取出的元数据保存在 ImageMetadata DynamoDB 中。
7. 并行地同时启动两个进程:
* 1) 调用 Amazon Rekognition 探测图像文件的对象,如果探测到,将 tag 保存到 ImageMetadata DynamoDB 中;
* 2) 生成缩略图并且保存在名为 PhotoRepo 的 S3 bucket 的“Thumbnails/”前缀下面。
可以通过源代码中的 test web app 上传图片来测试该图像识别和处理工作流的结果。
![](https://d2908q01vomqb2.awsstatic-china.com/472b07b9fcf2c2451e8781e944bf5f77cd8457c8/2017/09/13/9-1.png)
可以通过源代码中的 CloudFormation template 来创建该后端处理应用程序。
### 结论
用 AWS Lambda 函数定义应用程序需要执行的每一个特定功能,而用 AWS Step Functions 定义在各个功能中流转的流程,这样采用 AWS Lambda 和 AWS Step Functions 联合使用的方式,可以轻松地构建出 Serverless 应用。
此外,AWS 还提供一系列完全托管的服务,可以用来构建和运行无服务器应用程序。
![](https://d2908q01vomqb2.awsstatic-china.com/472b07b9fcf2c2451e8781e944bf5f77cd8457c8/2017/09/13/10.png)
![](https://d2908q01vomqb2.awsstatic-china.com/472b07b9fcf2c2451e8781e944bf5f77cd8457c8/2017/09/13/11.png)
### 参考
可以在我们的网站上下载到相关例子的 sample code:https://github.com/awslabs/lambda-refarch-imagerecognition
关于 AWS Step Functions 的 更多内容请参考网站: https://aws.amazon.com/cn/step-functions/
关于 AWS Lambda 的更多内容请参考网站: https://aws.amazon.com/lambda/
关于 AWS 服务器平台请参考网站: https://aws.amazon.com/cn/serverless/

本文转载自 AWS 技术博客。

原文链接:
https://amazonaws-china.com/cn/blogs/china/easily-build-serverless-applications-using-aws-lambda-and-aws-step-functions/

欲了解 AWS 的更多信息,请访问【AWS 技术专区】

评论

发布