Aller au contenu

FastAPI vers Base de données relationnelle

Le générateur connection relie un projet FastAPI à un projet Python Relational Database, en injectant une session SQLModel typée dans vos gestionnaires de routes via une dépendance FastAPI.

Avant d’utiliser ce générateur, assurez-vous d’avoir :

  1. Un projet FastAPI (généré avec py#api --framework=fastapi), voir le guide py#api
  2. Un projet py#rdb

Exécuter ce générateur@aws/nx-plugin:connection

pnpm nx g @aws/nx-plugin:connection
Composez votre commande5

Requis

Requis

Sélectionnez votre projet FastAPI comme source et votre projet de base de données relationnelle comme cible.

Options du générateur5 options
sourceProjectRequisstring

Le projet source

targetProjectRequisstring

Le projet cible auquel se connecter

sourceComponentstring

Le composant source depuis lequel se connecter (nom du composant, chemin relatif à la racine du projet source, ou identifiant de générateur). Utilisez '.' pour sélectionner explicitement le projet comme source.

targetComponentstring

Le composant cible auquel se connecter (nom du composant, chemin relatif à la racine du projet cible, ou identifiant de générateur). Utilisez '.' pour sélectionner explicitement le projet comme cible.

preferInstallDependenciesbooleanPar défaut: true

Indique s'il faut privilégier l'installation des dépendances après l'exécution du générateur. Définir à false pour différer l'installation lors de l'exécution de plusieurs générateurs en lot (une installation s'exécute quand même si nécessaire pour que les générateurs suivants puissent calculer le graphe de projet Nx) ; installer une seule fois à la fin.

Le générateur modifie votre projet FastAPI :

  • Répertoirepackages/my_api
    • project.json Ajoute une dépendance de dev sur la cible dev de la base de données
    • pyproject.toml Ajoute le package de base de données comme dépendance d’espace de travail
    • Répertoiremy_api
      • Répertoiredependencies
        • my_db.py Dépendance FastAPI MyDbSession pour la session de base de données

Utiliser la base de données dans les gestionnaires de routes

Section intitulée « Utiliser la base de données dans les gestionnaires de routes »

Ce générateur configure une dépendance FastAPI injectable que vous pouvez utiliser dans vos gestionnaires de routes :

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 ouvre automatiquement une nouvelle session par requête et la ferme lorsque le gestionnaire retourne.

Pour permettre à la fonction Lambda FastAPI de se connecter à la base de données lors de l’exécution, elle doit être déployée dans le même VPC que la base de données et bénéficier d’un accès réseau et IAM.

Dans votre stack d’application, déployez l’API dans le même VPC que la base de données, puis appelez allowDefaultPortFrom et grantConnect pour ouvrir le chemin réseau et accorder la permission IAM rds-db:connect au gestionnaire Lambda :

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);
});

Déployez les fonctions Lambda de l’API dans un sous-réseau privé avec sortie, et non dans un sous-réseau privé isolé. Lors de l’exécution, session_context() récupère la configuration de la base de données depuis AWS AppConfig, qui est un point de terminaison de service AWS public nécessitant un accès Internet sortant.

Le magasin de confiance CA intégré de l’environnement d’exécution Lambda Amazon Linux 2023 inclut les CA racine Amazon utilisés par RDS, aucune configuration supplémentaire n’est donc nécessaire.

Lors de l’utilisation de RDS Proxy, vous n’avez pas besoin de configurer le bundle CA RDS dans votre fonction Lambda.

Terminal window
pnpm nx dev <project-name>

Cela démarre la FastAPI et toutes les bases de données connectées. La variable d’environnement LOCAL_DEV=true fait en sorte que le client de base de données se connecte à sa base de données Docker locale au lieu d’Aurora.