在使用Lambda容器映像进行无服务运营时,解决了困扰的问题
你好。我是头脑加上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中。

问题
在运营SecureAPI时存在以下问题。
-
- TerraformとZappaでインフラの管理が分かれ、相互依存していた
-
- FastAPIをASGIで動かせない
-
- コールドスタートによるパフォーマンス問題があった
- PythonのバージョンアップタイミングがLambdaのランタイム対応状況に左右されていた
以下,我们将详细地进行观察。
使用Terraform和Zappa分别管理基础设施,并互相依赖。
像Zappa一样的无服务器框架可以自动化从基础架构构建到部署到Lambda的过程,非常方便。但实际运营服务时,仅由Zappa创建的基础架构是不够的。

当我们在图上给出了涂色的部分,因为在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容器镜像的时机。
明天是关于公司工程师石川制作内部访谈视频文字记录工具的故事。敬请期待!
严格来说,位于Customer VPC中的不是Lambda,而是连接到Lambda VPC的ENI。
https://github.com/Miserlou/Zappa/issues/2047
https://www.serverless.com/blog/serverless-framework-v4-a-new-model