在AWS App Runner上运行的FastAPI服务器在24小时后出现故障



我有一个用Gunicorn配置的FastAPI服务器,部署在AWS App Runner上。当我尝试访问该端点时,它工作得很好,然而,24小时后,当我试图访问同一个端点时,我收到了一个502坏网关错误,在此之后,cloudWatch上没有任何记录,直到我重新部署应用程序,然后它又开始正常工作。

我怀疑这与我的Gunicorn配置本身有关,它在一段时间后以某种方式关闭了我的API,而不是AWS App Runner,但我还没有找到任何解决方案。我还在下面展示了我的Gunicorn设置。任何hep都将不胜感激。

from fastapi import FastAPI
import uvicorn
from fastapi.middleware.cors import CORSMiddleware
from gunicorn.app.base import BaseApplication
import os
import multiprocessing
api = FastAPI()

def number_of_workers():
print((multiprocessing.cpu_count() * 2) + 1)
return (multiprocessing.cpu_count() * 2) + 1

class StandaloneApplication(BaseApplication):
def __init__(self, app, options=None):
self.options = options or {}
self.application = app
super().__init__()
def load_config(self):
config = {
key: value for key, value in self.options.items()
if key in self.cfg.settings and value is not None
}
for key, value in config.items():
self.cfg.set(key.lower(), value)
def load(self):
return self.application

@api.get("/test")
async def root():
return 'Success'

if __name__ == "__main__":
if os.environ.get('APP_ENV') == "development":
uvicorn.run("api:api", host="0.0.0.0", port=2304, reload=True)
else:
options = {
"bind": "0.0.0.0:2304",
"workers": number_of_workers(),
"accesslog": "-",
"errorlog": "-",
"worker_class": "uvicorn.workers.UvicornWorker",
"timeout": "0"
}
StandaloneApplication(api, options).run()

我也遇到了同样的问题。经过大量的尝试和错误,两个变化似乎为我解决了这个问题

  1. 将uvicorn--timeout-keep-alive设置为65。对于gunicorn,此参数为--keep-alive。我假设如果uvicorn在ALB之前关闭了tcp套接字,那么应用程序负载均衡器将抛出502。

  2. 将App Runner运行状况检查更改为使用HTTP而不是TCP ping来管理容器回收。目前,AWS UI不允许您进行此更改。您必须使用aws-cli执行此操作。使用任何活动的URL路径进行ping检查-在您的情况下/测试

aws apprunner update-service --service-arn <arn> --health-check-configuration Protocol=HTTP,Path=/test

#2可能刚好足以解决问题。

最新更新