Salta ai contenuti

Database Relazionale Python

Filter this guidePick generator option values to hide sections that don't apply.

Questo generatore crea un nuovo progetto di database relazionale Python supportato da Amazon Aurora (PostgreSQL o MySQL), SQLModel per la modellazione dei dati e Alembic per le migrazioni dello schema. Genera il codice dell’applicazione e l’infrastruttura necessari per il provisioning e la gestione di un database utilizzando AWS CDK o Terraform, con definizione dichiarativa dello schema, distribuzione automatica delle migrazioni e un client di database.

  1. Installa il Nx Console VSCode Plugin se non l'hai già fatto
  2. Apri la console Nx in VSCode
  3. Clicca su Generate (UI) nella sezione "Common Nx Commands"
  4. Cerca @aws/nx-plugin - py#rdb
  5. Compila i parametri richiesti
    • Clicca su Generate
    ParametroTipoPredefinitoDescrizione
    name Obbligatoriostring-Nome del progetto database da generare
    directory stringpackagesLa directory in cui memorizzare l'applicazione.
    subDirectory string-La sottodirectory in cui viene posizionato il progetto. Per impostazione predefinita corrisponde al nome del progetto.
    infra aurora | noneauroraServizio di database relazionale da fornire.
    engine postgres | mysqlpostgresMotore di database da utilizzare con il servizio selezionato.
    databaseUser stringdbadminNome utente amministratore del database. Il valore predefinito è 'dbadmin'.
    databaseName string-Nome del database iniziale. Il valore predefinito corrisponde al nome del progetto.
    framework sqlmodelsqlmodelFramework ORM da utilizzare per il progetto generato.
    iac inherit | cdk | terraforminheritIl provider IaC preferito. Per impostazione predefinita viene ereditato dalla selezione iniziale.
    preferInstallDependencies booleantrueSe preferire l'installazione delle dipendenze dopo l'esecuzione del generatore. Impostare su false per rimandare l'installazione quando si eseguono più generatori in batch (l'installazione viene comunque eseguita se necessaria affinché i generatori successivi possano calcolare il grafo del progetto Nx); installare una volta alla fine.

    Il generatore crea la seguente struttura di progetto nella directory <directory>/<name>:

    • Directory<name>
      • __init__.py Esportazioni del package (get_engine, session_context)
      • connection.py Engine del database e factory di sessione con autenticazione IAM
      • utils.py Configurazione runtime e helper per lo sviluppo locale
      • migration_handler.py Handler Lambda che esegue le migrazioni Alembic durante la distribuzione
      • create_db_user_handler.py Handler Lambda che crea l’utente del database dell’applicazione durante la distribuzione
      • Directorymodels
        • example.py Definizione di tabella SQLModel di esempio
    • Directorymigrations
      • versions Script di migrazione generati da Alembic
      • env.py Ambiente Alembic (si connette al database)
      • script.py.mako Template di script di migrazione Alembic
    • alembic.ini Configurazione Alembic
    • config.json Dettagli di connessione per lo sviluppo locale e chiave di configurazione runtime
    • Dockerfile.migration Immagine container per l’handler di migrazione
    • Dockerfile.create-db-user Immagine container per l’handler create-db-user
    • project.json Configurazione del progetto e target di build

    Gli script di sviluppo locale sono condivisi tra tutti i progetti di database e generati in packages/common/scripts/:

    • Directorypackages/common/scripts/src/rdb
      • pull-image.ts Scarica l’immagine container del database
      • start-container.ts Avvia un container di database locale
      • wait-for-postgres-db.ts Attende che il database locale sia pronto (PostgreSQL)
      • wait-for-mysql-db.ts Attende che il database locale sia pronto (MySQL)

    Poiché questo generatore fornisce infrastruttura come codice basata sul tuo iac selezionato, creerà un progetto in packages/common che include i relativi costrutti CDK o moduli Terraform.

    Il progetto comune di infrastruttura come codice è strutturato come segue:

    • Directorypackages/common/constructs
      • Directorysrc
        • Directoryapp/ Construct per l’infrastruttura specifica di un progetto/generatore
        • Directorycore/ Construct generici riutilizzati dai construct in app
        • index.ts Punto di ingresso che esporta i construct da app
      • project.json Target di build e configurazione del progetto
    • Directorypackages/common/constructs/src
      • Directoryapp
        • Directorydbs
          • <name>.ts Infrastruttura specifica per il tuo database
      • Directorycore
        • Directoryrdb
          • aurora.ts Costrutto generico per database Aurora

    Il database distribuito ha la seguente architettura. Per impostazione predefinita, un Amazon RDS Proxy si trova davanti al cluster Aurora per raggruppare le connessioni e per abilitare l’autenticazione IAM — vedi Disabilitare RDS Proxy per l’alternativa. L’architettura è la stessa sia che si selezioni il motore PostgreSQL o MySQL; solo il tipo di motore Aurora differisce.

    Application(Lambda, Agent, ...)RDS ProxyMigrations LambdaAurora(PostgreSQL or MySQL)Secrets Manager(DB credentials) SQL (IAM auth) Schema migrations Admin credentials

    Il progetto generato utilizza SQLModel per definire lo schema del database. Il flusso di lavoro è model-first: aggiungi o aggiorna le classi di tabella SQLModel nella directory <name>/models/ del tuo progetto di database, quindi genera una migrazione da tali modifiche del modello.

    Modello di esempio:

    packages/my_db/my_db/models/example.py
    from sqlalchemy import Column, String
    from sqlmodel import Field, SQLModel
    class ExampleModel(SQLModel, table=True):
    id: int | None = Field(default=None, primary_key=True)
    name: str = Field(sa_column=Column(String(255), nullable=False))
    description: str | None = Field(default=None, sa_column=Column(String(255), nullable=True))

    Importa i tuoi modelli in <name>/models/__init__.py in modo che Alembic possa scoprirli durante l’autogenerazione.

    Dopo aver aggiunto o aggiornato i modelli, utilizza Alembic per generare e applicare gli script di migrazione. Il target alembic generato avvia automaticamente un container di database locale prima dell’esecuzione:

    Terminal window
    pnpm nx run <project>:alembic revision --autogenerate -m "describe your change"

    Questo genera un nuovo script di migrazione in migrations/versions/. Rivedi lo script generato prima di applicarlo.

    Applica la migrazione al tuo database locale:

    Terminal window
    pnpm nx run <project>:migrate

    Quando distribuisci lo stack AWS, l’infrastruttura generata applica automaticamente le migrazioni generate al database distribuito.

    Quando scarichi file di migrazione creati da altri sviluppatori, applicali al tuo database locale:

    Terminal window
    pnpm nx run <project>:migrate

    Il target alembic generato espone la CLI di Alembic, quindi puoi eseguire qualsiasi comando Alembic sul database locale. Consulta il riferimento dei comandi Alembic per i comandi disponibili.

    Terminal window
    pnpm nx run <project>:alembic <alembic-command>

    L’arresto di dev (ad esempio con Ctrl+C) rimuove automaticamente il container del database locale, ma preserva il volume nominato in modo che i tuoi dati persistano tra i riavvii.

    Importa session_context dal tuo package di database e usalo come async context manager per ottenere un AsyncSession:

    from sqlmodel import select
    from my_scope.my_db import session_context
    from my_scope.my_db.models.example import ExampleModel
    async def example():
    async with session_context() as session:
    results = (await session.execute(select(ExampleModel))).all()

    Il client del database automaticamente:

    • Recupera la configurazione del database da AWS AppConfig a runtime
    • Genera token di autenticazione temporanei tramite boto3 RDS Signer per l’autenticazione IAM
    • Stabilisce connessioni TLS utilizzando ssl.create_default_context()

    Il generatore di database relazionali crea un’infrastruttura CDK o Terraform in base al iac selezionato.

    Il costrutto CDK viene creato in common/constructs. Esempio di utilizzo:

    packages/infra/src/stacks/application-stack.ts
    import { MyDatabase } from '@my-scope/common-constructs';
    export class ApplicationStack extends Stack {
    constructor(scope: Construct, id: string, props?: StackProps) {
    super(scope, id, props);
    ...
    const db = new MyDatabase(this, 'Db', {
    vpc,
    vpcSubnets: {
    subnetType: SubnetType.PRIVATE_ISOLATED,
    }
    });
    }
    }

    Questo effettua il provisioning di un cluster Aurora con RDS Proxy, credenziali amministrative, utente del database dell’applicazione, registrazione della configurazione runtime e gestore delle migrazioni.

    L’infrastruttura generata crea due utenti del database:

    • Utente amministratore - Creato durante il provisioning del cluster con credenziali archiviate in AWS Secrets Manager
    • Utente applicazione - Creato tramite una risorsa personalizzata Lambda con autenticazione IAM abilitata e privilegi DML (SELECT, INSERT, UPDATE, DELETE) sul database dell’applicazione

    L’utente applicazione viene creato automaticamente con un nome casuale e autenticazione IAM. Il client del database generato è già configurato per autenticarsi come questo utente utilizzando token RDS a breve durata, quindi il codice dell’applicazione non gestisce mai le password del database.

    Il tuo VPC dovrebbe includere subnet pubbliche, subnet private con egress e subnet private isolate. Il database può essere eseguito in subnet private isolate, mentre le funzioni Lambda dell’applicazione dovrebbero essere eseguite in subnet private con egress in modo che possano raggiungere i servizi AWS come AppConfig.

    Click here for an example VPC configuration.

    Utilizza il generatore connection per connettere un progetto a questo database — consulta la guida alla connessione per il tipo di calcolo pertinente (ad esempio FastAPI, server MCP, agente) per il cablaggio dell’infrastruttura necessario per raggiungerlo.

    L’immagine Docker creata per questo progetto può essere scansionata alla ricerca di vulnerabilità utilizzando Trivy, eseguito dall’immagine Trivy ospitata su ECR.

    Un target trivy viene aggiunto al progetto che scansiona l’immagine creata e termina con codice di uscita non-zero se viene trovata qualsiasi vulnerabilità di gravità HIGH o CRITICAL. Il Dockerfile generato utilizza un’immagine base senza vulnerabilità risolvibili note di queste gravità al momento della generazione e aggiorna gli strumenti inclusi (come npm) per mantenerla tale.

    La scansione utilizza lo stesso motore di container della build dell’immagine (docker o finch), quindi non sono necessari strumenti aggiuntivi. Poiché la scansione viene rieseguita solo quando l’immagine cambia, un’immagine non modificata non viene scansionata nuovamente. Lo script root trivy fornito scansiona ogni immagine nel workspace:

    Terminal window
    pnpm trivy

    Potrebbero esserci casi in cui si desidera sopprimere una vulnerabilità specifica, ad esempio quando non è ancora disponibile una correzione e si è valutato il rischio come accettabile.

    Aggiungi l’ID della vulnerabilità (uno per riga) al file .trivyignore nella radice del progetto (cioè accanto al file project.json):

    .trivyignore
    # node-tar arbitrary file write - not exploitable in our usage
    CVE-2024-XXXXX

    Per maggiori dettagli sul filtraggio dei risultati, consulta la documentazione sul filtraggio di Trivy.

    L’infrastruttura generata include un RDS Proxy per impostazione predefinita, che si posiziona tra l’applicazione e il cluster Aurora. RDS Proxy offre diversi vantaggi:

    • Connection pooling - Mantiene un pool di connessioni al database che possono essere condivise tra le istanze dell’applicazione, riducendo l’overhead della creazione di nuove connessioni
    • Resilienza delle connessioni - Gestisce automaticamente i failover e le riconnessioni durante le sostituzioni delle istanze Aurora o la manutenzione
    • Autenticazione IAM - Supporta l’autenticazione al database basata su IAM, eliminando la necessità di gestire le credenziali del database nel codice dell’applicazione
    • Sicurezza migliorata - Impone la crittografia TLS per tutte le connessioni

    Puoi disabilitare il proxy RDS come segue:

    packages/infra/src/stacks/application-stack.ts
    import { MyDatabase } from '@my-scope/common-constructs';
    const db = new MyDatabase(this, 'Db', {
    ...
    enableRdsProxy: false,
    });

    Quando RDS Proxy è disabilitato, l’applicazione si connette direttamente all’endpoint del cluster Aurora.

    Il bundle CA di Amazon RDS deve essere presente nel trust store di sistema del runtime.

    ADD https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem /etc/pki/ca-trust/source/anchors/global-bundle.pem
    RUN update-ca-trust

    Per funzioni Lambda distribuite come zip (come una py#api FastAPI), il trust store CA integrato nell’ambiente di esecuzione Lambda Amazon Linux 2023 include le CA Root di Amazon utilizzate da RDS.

    Quando utilizzi RDS Proxy, non è necessario configurare il bundle CA RDS nel runtime che si connette al database.

    Configura le istanze writer e reader per il tuo cluster Aurora.

    packages/infra/src/stacks/application-stack.ts
    import { MyDatabase } from '@my-scope/common-constructs';
    const db = new MyDatabase(this, 'Db', {
    ...
    writer: ClusterInstance.serverlessV2('writer'),
    readers: [ClusterInstance.serverlessV2('reader')],
    });

    Controlla i limiti di scalabilità di Aurora Serverless v2 per adattarli al tuo carico di lavoro.

    packages/infra/src/stacks/application-stack.ts
    import { MyDatabase } from '@my-scope/common-constructs';
    const db = new MyDatabase(this, 'Db', {
    ...
    serverlessV2MinCapacity: 0.5,
    serverlessV2MaxCapacity: 8,
    });

    Fissa una versione specifica del motore Aurora.

    Per impostazione predefinita, l’immagine del container del database locale generata corrisponde alla versione predefinita del motore Aurora. Se modifichi la versione del motore Aurora, è consigliabile utilizzare anche una versione dell’immagine del container locale corrispondente per la massima compatibilità. Consulta le note di rilascio AWS per le versioni di Aurora PostgreSQL e le versioni di Aurora MySQL per identificare la versione del database della community corrispondente.

    L’immagine del database locale è configurata nel campo localDev.image del file config.json generato nella radice del progetto del database. Aggiorna quel valore quando modifichi le versioni del motore.

    engine = postgres
    packages/infra/src/stacks/application-stack.ts
    import { MyDatabase } from '@my-scope/common-constructs';
    const db = new MyDatabase(this, 'Db', {
    ...
    engineVersion: AuroraPostgresEngineVersion.VER_17_7,
    });
    engine = mysql
    packages/infra/src/stacks/application-stack.ts
    import { MyDatabase } from '@my-scope/common-constructs';
    const db = new MyDatabase(this, 'Db', {
    ...
    engineVersion: AuroraMysqlEngineVersion.VER_3_12_0,
    });

    La protezione dalla cancellazione è abilitata per impostazione predefinita (deletionProtection: true in CDK, deletion_protection = true in Terraform) per proteggere il cluster Aurora da cancellazioni accidentali.

    È possibile disabilitare la protezione dalla cancellazione per ambienti in cui è prevista la cancellazione del database, come stack di sviluppo o di anteprima di breve durata.

    packages/infra/src/stacks/application-stack.ts
    import { MyDatabase } from '@my-scope/common-constructs';
    const db = new MyDatabase(this, 'Db', {
    ...
    deletionProtection: false,
    });

    Il costrutto CDK mantiene il cluster Aurora per impostazione predefinita (removalPolicy: RemovalPolicy.RETAIN). Modifica questa impostazione quando desideri che l’eliminazione dello stack CDK crei uno snapshot o distrugga il cluster.

    Quando si utilizza RemovalPolicy.DESTROY, la protezione dall’eliminazione deve essere disabilitata prima che il cluster possa essere eliminato.

    packages/infra/src/stacks/application-stack.ts
    import { RemovalPolicy } from 'aws-cdk-lib';
    import { MyDatabase } from '@my-scope/common-constructs';
    const db = new MyDatabase(this, 'Db', {
    ...
    removalPolicy: RemovalPolicy.SNAPSHOT,
    });

    Per un ambiente effimero in cui il database dovrebbe essere eliminato con lo stack:

    packages/infra/src/stacks/application-stack.ts
    import { RemovalPolicy } from 'aws-cdk-lib';
    import { MyDatabase } from '@my-scope/common-constructs';
    const db = new MyDatabase(this, 'Db', {
    ...
    deletionProtection: false,
    removalPolicy: RemovalPolicy.DESTROY,
    });
    engine = postgres

    Il log postgresql viene esportato per Aurora PostgreSQL, con il logging limitato alle sole istruzioni DDL (log_statement=ddl) in modo che i valori dei parametri delle istruzioni non vengano mai registrati — purché ogni istruzione venga inviata singolarmente. log_statement=ddl registra l’intero testo grezzo di un batch multi-istruzione (ad esempio una singola chiamata psql -c "a;b;c") testualmente se una qualsiasi istruzione in esso è DDL, inclusi eventuali valori DML nello stesso batch.

    engine = mysql

    I log audit ed error vengono esportati per Aurora MySQLgeneral e slowquery sono deliberatamente esclusi poiché registrano il testo completo delle istruzioni, inclusi i valori DML. Advanced Auditing è limitato alle connessioni e ai DDL (server_audit_events=CONNECT,QUERY_DDL), quindi i valori dei parametri delle istruzioni non vengono mai registrati.

    Performance Insights è abilitato di default sull’istanza writer di Aurora (crittografato con la chiave KMS del cluster). I log del motore Aurora vengono anche esportati su CloudWatch Logs di default, configurati per mostrare l’attività a livello di schema senza esporre i dati delle righe.

    Disabilita l’esportazione dei log per database se non necessario:

    packages/infra/src/stacks/application-stack.ts
    import { MyDatabase } from '@my-scope/common-constructs';
    const db = new MyDatabase(this, 'Db', {
    ...
    enableCloudwatchLogs: false,
    enablePerformanceInsights: false,
    });

    La chiave KMS utilizzata per crittografare il cluster Aurora e il suo secret delle credenziali ha la rotazione automatica delle chiavi abilitata per impostazione predefinita. Disabilitala se la tua politica di sicurezza gestisce la rotazione esternamente.

    packages/infra/src/stacks/application-stack.ts
    import { MyDatabase } from '@my-scope/common-constructs';
    const db = new MyDatabase(this, 'Db', {
    ...
    enableKeyRotation: false,
    });

    Utilizza il generatore connection per integrare questo progetto con altri nel tuo workspace. Le seguenti connessioni coinvolgono questo progetto:

    Strands AgentsPythonAmazon AuroraPython
    Python Agent a Database RelazionaleConnetti un Python Agent a un database relazionale Aurora
    FastAPIAmazon AuroraPython
    FastAPI a Database RelazionaleConnetti una FastAPI a un database relazionale Aurora
    Model Context ProtocolPythonAmazon AuroraPython
    Python MCP Server a Database RelazionaleConnetti un Python MCP Server a un database relazionale Aurora