亚马逊云:原来这样构建 Serverless 模式的 Web 应用,也可以很丝滑!

Serverless
数据迁移
re:Invent
0
0
亚马逊云科技于 2022/11/30-2022/12/02 召开了 [2022 re:Invent 全球大会](https://dev.amazoncloud.cn/activity/reinvent2022)。作为全球云计算的引领者,亚马逊云本次大会的主题名为:“凌云驭势 重塑未来”。大会期间有一个很有趣的主题:将 Web 应用程序迁移到 Serverless 模式。正好这一方面是我目前主要在做的事情,所以下面想和你分享这一主题的内容以及业内在这一领域的实践。 # 迁移应用概览 时间回到 2016 年,那个时候,“无服务”的概念才刚刚出现,很多开发者对无服务的生成完全没有经验,甚至对无服务这一概念都知之甚少。然而,接触这个概念不久,有些团队就计划试着将应用迁移至无服务模式。 在迁移的过程中,制定策略成为了这其中的一个关键。因为你还要考虑是否有相应的平台能够兼容你要迁移的东西。在不断的实践和探索之后,发现“提升”和“转变”是符合迁移策略的方式。它们能够尽可能地利用现有的应用程序,将需要迁移的应用尽快地投入生产。**在本文中,我会为你介绍如何使用亚马逊云进行后端、前端以及数据库的迁移,以及在迁移过程中会遇到的常见问题**。 我们所要迁移的应用,是一个销售亚马逊云科技服务的电子商务平台,整个应用的概览如下所示,可以看到 Web 使用 ReactJs, Server 使用 ExpressJS、NodeJS 以及数据库使用的是 MongoDB。其中,这里的后端服务器,用于 Amazon API Gateway 运行。当然,除了上述技术栈之外,迁移也适合使用其他技术栈开发的应用。 ![1.png](https://dev-media.amazoncloud.cn/df66514278b64e2fa4b9efde3ee18404_1.png "1.png") 接下来,我们会按照下面几个步骤迁移这个应用。大致可以分为:迁移前的准备和迁移的过程。 # 迁移准备 在做迁移之前,你需要明确一些对迁移的要求,例如: - 对环境的开销尽可能为零; - 希望能配置尽可能少的基础设施,这样能做到不花精力在管理基础设施上,而把精力用在管理应用程序和改进用户体验上; - 不需要担心应用的可用性,如果出了问题就自动更换,或者进行自动的修复(这也是 Serverless 的优点); - 应用的源代码能够尽可能少的更改。 有了上述要求之后,我们大概能构想出可以使用哪些工具解决这些问题,以及大概的最终架构的模型。 我们根据上述要求,提出了下图中描述的架构模型: ![2.png](https://dev-media.amazoncloud.cn/9982b7ae77704c9ab22ee0ebe9d60011_2.png "2.png") 这份架构中使用到了 Amazon Lambda、Amplify、Cognito、CloudFront、S3 等工具。 同时,为了尽可能地实现自动化,推荐使用 Amazon Cloud Development Kit。 # 迁移开始 我们需要把所有 Amazon CloudFormation statics 的文件(例如:amplify-stack、backendapp-stack、cognito-stack、observability-stack、storage-stack)放到 lib 文件夹里。 ![3.png](https://dev-media.amazoncloud.cn/037ae16bddb14400874b008ec48528b4_3.png "3.png") 因为不希望对源代码进行过多的更改的情况下进行迁移,所以只需要将电商平台中完整的后端应用程序复制到后端目录中即可,即上图中显示的 backend-app 文件夹。 接着,前端使用的是 react,可以将 react 程序中的所有源代码放到 GitHub 或其他代码存储仓库中。对前端项目所要做的唯一改动就是在前端根目录下添加 **amplify.yml** 配置文件。这个文件有什么作用呢?后续内容中我会告诉你。 ![4.png](https://dev-media.amazoncloud.cn/95b705470014470fb0728a8792f2a5f1_4.png "4.png") 最后,需要对数据库 MongoDB 进行迁移。对于 MongoDB 而言,最好的 Serverless 方式是选择 MongoDB Atlas。 具体的做法是: 1. 首先创建一个 MongoDB Atlas 集群。 2. 使用下列命令,转储当前数据库到新的数据库上: ```js mongodump --uri="mongodb://<localuser>:<localpassword>@localhost:27017" mongorestor --uri="mongodb+srv://<user>: <password>@<clustername>.debkm.mongodb.net" ``` 3. 现在有了新的数据库。接着使用下列代码,在后端应用中将数据库的指向进行更改: ```js module.exports = { mongoURI: 'mongodb+srv://<user>:<password>@<clustername>.debkm.mongodb.net' } ``` 这样就能完成数据库的迁移了。上述过程也做到了尽可能少的改动这一项要求。 ![5.png](https://dev-media.amazoncloud.cn/cb4d1cb8e3364a20ab354a1460072cf2_5.png "5.png") 但是,这些还无法把环境的开销缩减为零。这个时候就需要借助 Amazon Lambda。 ## Amazon Lambda Web Adaptor 那如何把应用放在 Amazon Lambda 里呢?这里有一个方法: ![6.png](https://dev-media.amazoncloud.cn/0df6c00494684840b11ef276ce706654_6.png "6.png") 有一个名为 Amazon Lambda Web Adaptor 的开源工具,它的作用是它位于调用 Amazon Lambda 的事件之间,它能转换成像 http 那样应用程序能够理解的东西,例如http1/http2。并且,它使用了 rust 进行构造,非常的安全与高效。 ![7.png](https://dev-media.amazoncloud.cn/3fdaf7ab6094491d8e56bce70ecdd6d8_7.png "7.png") 因此,这个扩展体现了 Amazon Lambda 应用程序、API Gateway、Load Balancers 和 lambda 之间的运作。它会调用你的 lambda 然后会转化为任何你需要的网络应用程序。因此,我们无需对这个转化后的网络应用程序进行更改。除此之外,它还支持如 zip 格式的压缩包、容器镜像、任何 Web 框架、任何编程语言以及测试工具等。不过,还有值得庆幸的一点就是你可以在本地运行它,启动 API Gateway, 完成所有更改,然后将其推送到 Amazon Lambda,当就这一单就是很棒的开发体验。 ## Lambda 生命周期 如下图所示,是 Lambda 的生命周期。它分为两个部分: 1. 在冷启动期间发生的 Init 部分; 2. 响应事件的 Invocation 部分。 具体来说,在 Init 期间,它会开始扩展,直到进入 Invocation 部分开始,网络应用程序就会开始加载。例如,对于 NodeJS 这样的网络应用程序,将会发生数据库连接。同时,它会检查就绪端点的种类以确保你的应用程序已准备就绪。 当返回 200 状态码时, Adapter 会抓取你的调用,将其转换为 HTTP 请求并将其传递给你的应用程序。 ![8.png](https://dev-media.amazoncloud.cn/3a646cd72286420e9015763dd52de707_8.png "8.png") 除此之外,你可以利用将 ASYNC_INIT 置为 true,让 lambda 提供每 10 秒钟的自由初始化操作来推进扩展,同时启动你的网络应用程序。等一切准备就绪,Invocation 部分就会开始启动,Adapter 就会向网络应用程序发出 http 请求,并进行路由处理。 至此,我们就可以使用 Amazon Lambda 达成前面我们定下的目标了。 # 展望 除了可以使用亚马逊云构建 Serverless 模式的 Web 应用,本次大会还给开发者带来很多亚马逊云提供的功能与特性,以及在某些行业内应用的成功案例。例如,你还可以借助它构建 SaaS 应用,使用地理空间数据构建训练和部署 ML 模型,以及还可以使用托管 Jupyter 笔记本提高机器学习开发效率等等。 本次大会让我感受到了亚马逊云科技带来的无穷魅力,很多的细节的体验都是来源于千千万万开发者的开发反馈。期待在下一届大会,我们能体验到亚马逊云带来的更多有特色、接地气的产品! 文章审核:zacwang
目录
亚马逊云科技解决方案 基于行业客户应用场景及技术领域的解决方案
联系亚马逊云科技专家
亚马逊云科技解决方案
基于行业客户应用场景及技术领域的解决方案
联系专家
0
目录
关闭
contact-us