在使用Lambda容器映像进行无服务运营时,解决了困扰的问题

这是atama plus Advent Calendar 2023的第十天文章。

你好。我是头脑加上SRE团队的加藤。

大家是如何管理无服务器应用程序的呢?如果在AWS Lambda上运行,AWS SAM、Serverless Framework、Chalice等无服务器框架的构建非常简单且有吸引力。

根据最新的需求和问题,我们决定转变为使用Lambda容器镜像1的架构。我们之前一直使用atama plus和Zappa框架来构建和管理API,但由于无法实现基于Terraform的基础设施统一管理等问题不断积累,我们做出了这个转变。

在本次经验中我将介绍Zappa使用过程中的问题,并解释如何通过Lambda容器镜像来解决这些问题。

最初的构成

在atama plus中,除了学习相关的服务外,机密信息的管理被分离成一个名为SecureAPI的子系统。
SecureAPI是使用Python和FastAPI构建的,并且使用Zappa将其部署到Lambda中。

image.png

问题

在运营SecureAPI时存在以下问题。

    • TerraformとZappaでインフラの管理が分かれ、相互依存していた

 

    • FastAPIをASGIで動かせない

 

    • コールドスタートによるパフォーマンス問題があった

 

    PythonのバージョンアップタイミングがLambdaのランタイム対応状況に左右されていた

以下,我们将详细地进行观察。

使用Terraform和Zappa分别管理基础设施,并互相依赖。

像Zappa一样的无服务器框架可以自动化从基础架构构建到部署到Lambda的过程,非常方便。但实际运营服务时,仅由Zappa创建的基础架构是不够的。

image.png

当我们在图上给出了涂色的部分,因为在Zappa中无法构建或者定制化,所以我们选择使用Terraform进行管理。

    • VPC(Terraform)を先に作らなければLambda(Zappa)を作れず

 

    Lambda(Zappa)を作らなければログ集約(Terraform)を作れない

会形成相互依存的局面。

由于一直在Terraform和Zappa之间来回操作,导致建立新环境的速度变慢了。

无法在ASGI上运行FastAPI

由于Zappa只支持WSGI,而FastAPI本来是基于ASGI运行的,因此我们不得不使用转换库来运行它。然而,在转换过程中,我们遇到了一些错误,尽管我们花了很多时间进行调查,但仍然无法找到问题的根源,这让我们感到非常无奈。

出现了由于冷启动引起的性能问题。

一些请求的响应时间可能会因Lambda的冷启动而变差。我们知道可以通过使用Lambda的Provisioned Concurrency功能,在事先确定的并行数上启动实例来缓解这个问题。不幸的是,很遗憾Zappa没有这个设置功能,所以我们无法引入它。

Python的版本更新时间会受到Lambda运行时的兼容情况的影响。

由于与其他Python应用程序的时间差异,导致产生了以下认知负荷。

    • 開発者はSecureAPIのPythonバージョンが異なることを意識して開発しなければならない

 

    せっかくバージョンアップで得た知識をSecureAPIのバージョンアップのときに再び思い出す必要がある

解决办法

我认为,这些问题发生是因为我们首先使用了Lambda,如果我们能够将它们转移到ECS等其他地方,那将会更灵活,并且能够进行更多自定义。

在这里,根据不同的服务进行判断,但对于SecureAPI而言,它不是一个访问量特别大的服务,如果迁移到ECS上,预计将会增加相当大的成本。

因此,我尽可能想要以Lambda的形式来解决这个问题。

整理Zappa所做的事情可以分解为三个部分:
① 创建API Gateway和Lambda函数
② 将API服务器转换成与Lambda函数接口相适应的形式
③ 将应用部署到Lambda函数中

可以通过以下方式分别解决:
①可以借助 Terraform 来解决。
②可以使用名为 mangum 的专用库来代替。
③可以引入 Lambda Container Images,将容器镜像推送到 ECR,从而替换为这个操作。

我考虑了一下,最终采用了Lambda容器镜像。它完美地解决了我遇到的问题。

    • インフラはすべてTerraformで管理し、アプリケーション側ではイメージをビルドするだけになった

mangumを使ってASGIアプリケーションを動かせるようになった
LambdaのProvisioned Concurrency機能を使ってコールドスタート問題を防げるようになった
任意のPythonバージョンが使えるようになった

最后

使用框架在初次创建时可以轻松完成,但当想要构建稳固的结构或进行大规模定制时,框架可能成为束缚,我再次深刻地感受到这一点。
听说Serverless Framework将在特定条件下收费,所以现在可能是考虑切换到Lambda容器镜像的时机。

明天是关于公司工程师石川制作内部访谈视频文字记录工具的故事。敬请期待!

下面提供一种中文的译文:正如其名称所示,该方法是在Lambda提供的运行时上运行容器映像,而不是Lambda本身。

严格来说,位于Customer VPC中的不是Lambda,而是连接到Lambda VPC的ENI。

https://github.com/Miserlou/Zappa/issues/2047

https://www.serverless.com/blog/serverless-framework-v4-a-new-model

bannerAds