跳转到内容

FastAPI 到关系数据库

connection 生成器将 FastAPI 连接到 Python 关系数据库项目,通过 FastAPI 依赖项将类型化的 SQLModel 会话注入到您的路由处理程序中。

在使用此生成器之前,请确保您已具备:

  1. 一个 FastAPI 项目(使用 py#api --framework=fastapi 生成),请参阅 py#api 指南
  2. 一个 py#rdb 项目

运行此生成器@aws/nx-plugin:connection

pnpm nx g @aws/nx-plugin:connection
构建你的命令5

必需

必需

选择您的 FastAPI 项目作为源,选择您的关系数据库项目作为目标。

生成器选项5 个选项
sourceProject必需string

源项目

targetProject必需string

要连接到的目标项目

sourceComponentstring

要连接的源组件(组件名称、相对于源项目根目录的路径或生成器 ID)。使用 '.' 显式选择项目作为源。

targetComponentstring

要连接到的目标组件(组件名称、相对于目标项目根目录的路径或生成器 ID)。使用 '.' 显式选择项目作为目标。

preferInstallDependenciesboolean默认值: true

是否在生成器运行后优先安装依赖项。设置为 false 可在批量运行多个生成器时延迟安装(如果后续生成器需要计算 Nx 项目图,仍会运行安装);在最后统一安装一次。

生成器会修改您的 FastAPI 项目:

  • 文件夹packages/my_api
    • project.json 添加从 dev 到数据库的 dev 目标的依赖
    • pyproject.toml 将数据库包添加为工作区依赖项
    • 文件夹my_api
      • 文件夹dependencies
        • my_db.py 用于数据库会话的 FastAPI MyDbSession 依赖项

此生成器配置了一个可注入的 FastAPI Dependency,您可以在路由处理程序中使用它:

packages/my_api/my_api/api.py
from sqlmodel import select
from my_api.dependencies.my_db import MyDbSession
from my_scope_my_db.models.example import ExampleModel
@app.get("/examples")
async def list_examples(my_db: MyDbSession):
return (await my_db.execute(select(ExampleModel))).scalars().all()
@app.post("/examples")
async def create_example(name: str, my_db: MyDbSession):
item = ExampleModel(name=name)
my_db.add(item)
await my_db.commit()
await my_db.refresh(item)
return item

FastAPI 会自动为每个请求打开一个新会话,并在处理程序返回时关闭它。

为了允许 FastAPI Lambda 函数在运行时连接到数据库,它必须部署到与数据库相同的 VPC 中,并被授予网络和 IAM 访问权限。

在您的应用程序堆栈中,将 API 部署到与数据库相同的 VPC 中,然后调用 allowDefaultPortFromgrantConnect 来打开网络路径并授予 Lambda 处理程序 IAM rds-db:connect 权限:

packages/infra/src/stacks/application-stack.ts
import { MyDatabase } from '@my-scope/common-constructs';
const db = new MyDatabase(this, 'Db', { vpc, ... });
const api = new MyApi(this, 'Api', {
integrations: MyApi.defaultIntegrations(this)
.withDefaultOptions({
vpc,
vpcSubnets: { subnetType: SubnetType.PRIVATE_WITH_EGRESS },
})
.build(),
});
Object.entries(api.integrations).forEach(([operation, integration]) => {
db.allowDefaultPortFrom(integration.handler, `Allow ${operation} to connect to the database`);
db.grantConnect(integration.handler);
});

将 API Lambda 函数部署到具有出口的私有子网,而不是私有隔离子网。在运行时,session_context() 从 AWS AppConfig 检索数据库配置,这是一个需要出站互联网访问的公共 AWS 服务端点。

在不使用 RDS Proxy 的情况下连接时的 SSL 要求

Section titled “在不使用 RDS Proxy 的情况下连接时的 SSL 要求”

Amazon Linux 2023 Lambda 执行环境的内置 CA 信任存储包含 RDS 使用的 Amazon Root CA,因此不需要额外的配置。

当使用 RDS Proxy 时,您不需要在 Lambda 函数中配置 RDS CA 捆绑包。

Terminal window
pnpm nx dev <project-name>

这将启动 FastAPI 和所有连接的数据库。LOCAL_DEV=true 环境变量会使数据库客户端连接到其本地 Docker 数据库而不是 Aurora。