【发布时间】:2021-04-13 04:56:55
【问题描述】:
我有一个快速的 API 应用程序。最初,我在我的 SAM 模板中通过 ngrok 隧道传递我的 DB URI。在此设置中,Lambda 将使用我本地机器的 PSQL DB。
DbConnnectionString:
Type: String
Default: postgresql://<uname>:<pwd>@x.tcp.ngrok.io:PORT/DB
这就是我在 Python 代码中读取 URI 的方式
# config.py
DATABASE_URL = os.environ.get('DB_URI')
db_engine = create_engine(DATABASE_URL)
db_session = sessionmaker(autocommit=False, autoflush=False,bind=db_engine)
print(f"Configs initialized for {API_V1_STR}")
# app.py
# 3rd party
from fastapi import FastAPI
# Custom
from config.app_config import PROJECT_NAME, db_engine
from models.db_models import Base
print("Creating all database")
Base.metadata.create_all(bind=db_engine)
app = FastAPI(title=PROJECT_NAME)
print("APP created")
但是每当我用 RDS DB 替换 DB URL 时,突然调用就会卡在create all database 步骤,如下图所示。当这种情况发生时,lambda 总是超时并抛出异常。
-
如果我使用 uvicorn 在本地运行代码,则不会发生此错误。 一切正常。
-
当我使用
sam local invoke时,即使是 RDS URL,API 调用也没有任何问题。只有在 AWS Lambda 中部署时才会出现此问题。
我注意到在此设置中配置被初始化了两次,一次在 START 请求 ID 之前和一次之后。
我已经尝试阅读它,但不清楚我能做些什么来解决这个问题。任何帮助将不胜感激。
【问题讨论】:
-
曾经考虑过Alembic?
-
可能是您的 URL 格式。你试过
f'postgresql+psycopg2://{user}:{pw}@{url}/{db}' -
@RakeshAdhikesavan:尝试过,但存在同样的错误。我在想一些奇怪的原因 create_all 被调用了两次,第一次调用以某种方式阻止了第二次调用。
标签: python-3.x aws-lambda sqlalchemy amazon-rds fastapi