Bỏ qua để đến nội dung

Cơ sở dữ liệu quan hệ Python

Generator này tạo một dự án cơ sở dữ liệu quan hệ Python mới được hỗ trợ bởi Amazon Aurora (PostgreSQL hoặc MySQL), SQLModel để mô hình hóa dữ liệu, và Alembic để di chuyển schema. Nó tạo ra mã ứng dụng và cơ sở hạ tầng cần thiết để cung cấp và quản lý cơ sở dữ liệu bằng AWS CDK hoặc Terraform, với định nghĩa schema khai báo, triển khai migration tự động, và một database client.

  1. Cài đặt Nx Console VSCode Plugin nếu bạn chưa cài đặt
  2. Mở Nx Console trong VSCode
  3. Nhấp Generate (UI) trong phần "Common Nx Commands"
  4. Tìm kiếm @aws/nx-plugin - py#rdb
  5. Điền các tham số bắt buộc
    • Nhấp Generate
    Tham sốKiểuMặc địnhMô tả
    name Bắt buộcstring-Tên của dự án cơ sở dữ liệu cần tạo
    directory stringpackagesThư mục để lưu trữ ứng dụng.
    subDirectory string-Thư mục con mà dự án được đặt trong đó. Mặc định là tên dự án.
    infra aurora | noneauroraDịch vụ cơ sở dữ liệu quan hệ cần cung cấp.
    engine postgres | mysqlpostgresCông cụ cơ sở dữ liệu sử dụng với dịch vụ đã chọn.
    databaseUser stringdbadminTên người dùng quản trị cơ sở dữ liệu. Mặc định là 'dbadmin'.
    databaseName string-Tên cơ sở dữ liệu ban đầu. Mặc định là tên dự án.
    framework sqlmodelsqlmodelFramework ORM sử dụng cho dự án được tạo.
    iac inherit | cdk | terraforminheritNhà cung cấp IaC ưu tiên. Mặc định được kế thừa từ lựa chọn ban đầu của bạn.
    preferInstallDependencies booleantrueCó nên ưu tiên cài đặt các phụ thuộc sau khi generator chạy hay không. Đặt thành false để hoãn cài đặt khi thực hiện nhiều generator cùng lúc (việc cài đặt vẫn chạy nếu cần thiết để các generator tiếp theo có thể tính toán biểu đồ dự án Nx); cài đặt một lần vào cuối.

    Generator tạo cấu trúc dự án sau trong thư mục <directory>/<name>:

    • Thư mục<name>
      • __init__.py Package exports (get_engine, session_context)
      • connection.py Database engine và session factory với xác thực IAM
      • utils.py Runtime config và các helper phát triển cục bộ
      • migration_handler.py Lambda handler chạy Alembic migrations trong quá trình triển khai
      • create_db_user_handler.py Lambda handler tạo application database user trong quá trình triển khai
      • Thư mụcmodels
        • example.py Ví dụ định nghĩa bảng SQLModel
    • Thư mụcmigrations
      • versions Các script migration được tạo bởi Alembic
      • env.py Môi trường Alembic (kết nối đến cơ sở dữ liệu)
      • script.py.mako Template script migration Alembic
    • alembic.ini Cấu hình Alembic
    • config.json Chi tiết kết nối phát triển cục bộ và runtime config key
    • Dockerfile.migration Container image cho migration handler
    • Dockerfile.create-db-user Container image cho create-db-user handler
    • project.json Cấu hình dự án và build targets

    Các script phát triển cục bộ được chia sẻ trên tất cả các dự án cơ sở dữ liệu và được tạo vào packages/common/scripts/:

    • Thư mụcpackages/common/scripts/src/rdb
      • pull-image.ts Kéo database container image
      • start-container.ts Khởi động một local database container
      • wait-for-postgres-db.ts Chờ cơ sở dữ liệu cục bộ sẵn sàng (PostgreSQL)
      • wait-for-mysql-db.ts Chờ cơ sở dữ liệu cục bộ sẵn sàng (MySQL)

    Vì generator này cung cấp infrastructure as code dựa trên iacProvider bạn đã chọn, nó sẽ tạo một dự án trong packages/common bao gồm các CDK constructs hoặc Terraform modules liên quan.

    Dự án infrastructure as code chung được cấu trúc như sau:

    • Thư mụcpackages/common/constructs
      • Thư mụcsrc
        • Thư mụcapp/ Constructs cho infrastructure cụ thể của một dự án/generator
        • Thư mụccore/ Constructs chung được tái sử dụng bởi các constructs trong app
        • index.ts Entry point xuất các constructs từ app
      • project.json Các build targets và cấu hình của dự án
    • Thư mụcpackages/common/constructs/src
      • Thư mụcapp
        • Thư mụcdbs
          • <name>.ts Cơ sở hạ tầng cụ thể cho cơ sở dữ liệu của bạn
      • Thư mụccore
        • Thư mụcrdb
          • aurora.ts Construct cơ sở dữ liệu Aurora chung

    Cơ sở dữ liệu được triển khai có kiến trúc như sau. Theo mặc định, một Amazon RDS Proxy nằm phía trước cụm Aurora để gộp các kết nối và kích hoạt xác thực IAM — xem Vô hiệu hóa RDS Proxy để biết phương án thay thế. Kiến trúc giống nhau cho dù bạn chọn engine PostgreSQL hay MySQL; chỉ có phiên bản engine Aurora khác nhau.

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

    Dự án được tạo sử dụng SQLModel để định nghĩa schema cơ sở dữ liệu của bạn. Quy trình làm việc là model-first: thêm hoặc cập nhật các lớp bảng SQLModel trong thư mục <name>/models/ của dự án cơ sở dữ liệu, sau đó tạo một migration từ những thay đổi model đó.

    Ví dụ model:

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

    Import các model của bạn trong <name>/models/__init__.py để Alembic có thể phát hiện chúng trong quá trình tự động tạo.

    Sau khi thêm hoặc cập nhật models, sử dụng Alembic để tạo và áp dụng các script migration. Target alembic được tạo tự động khởi động một local database container trước khi chạy:

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

    Điều này tạo một script migration mới trong migrations/versions/. Xem xét script được tạo trước khi áp dụng nó.

    Áp dụng migration vào cơ sở dữ liệu cục bộ của bạn:

    Terminal window
    pnpm nx run <project>:migrate

    Khi bạn triển khai AWS stack, cơ sở hạ tầng được tạo tự động áp dụng các migrations đã tạo vào cơ sở dữ liệu đã triển khai.

    Khi bạn kéo các file migration được tạo bởi các nhà phát triển khác, áp dụng chúng vào cơ sở dữ liệu cục bộ của bạn:

    Terminal window
    pnpm nx run <project>:migrate

    Target alembic được tạo hiển thị Alembic CLI, vì vậy bạn có thể chạy bất kỳ lệnh Alembic nào đối với cơ sở dữ liệu cục bộ. Xem tài liệu tham khảo lệnh Alembic để biết các lệnh có sẵn.

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

    Dừng dev (ví dụ: với Ctrl+C) tự động xóa local database container, nhưng giữ lại named volume để dữ liệu của bạn tồn tại qua các lần khởi động lại.

    Import session_context từ database package của bạn và sử dụng nó như một async context manager để có được một 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()

    Database client tự động:

    • Lấy cấu hình cơ sở dữ liệu từ AWS AppConfig bằng biến môi trường RUNTIME_CONFIG_APP_ID
    • Tạo token xác thực tạm thời qua boto3 RDS Signer cho xác thực IAM
    • Thiết lập kết nối TLS bằng ssl.create_default_context()

    Trình tạo cơ sở dữ liệu quan hệ tạo ra cơ sở hạ tầng CDK hoặc Terraform dựa trên iacProvider bạn đã chọn.

    Construct CDK được tạo trong common/constructs. Ví dụ sử dụng:

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

    Điều này cung cấp một cụm Aurora với RDS Proxy, thông tin xác thực quản trị, người dùng cơ sở dữ liệu ứng dụng, đăng ký cấu hình runtime và trình xử lý migration.

    Cơ sở hạ tầng được tạo ra tạo hai người dùng cơ sở dữ liệu:

    • Người dùng quản trị - Được tạo trong quá trình cung cấp cụm với thông tin xác thực được lưu trữ trong AWS Secrets Manager
    • Người dùng ứng dụng - Được tạo thông qua tài nguyên tùy chỉnh Lambda với xác thực IAM được bật và các đặc quyền DML (SELECT, INSERT, UPDATE, DELETE) trên cơ sở dữ liệu ứng dụng

    Người dùng ứng dụng được tự động tạo với tên ngẫu nhiên và xác thực IAM. Client cơ sở dữ liệu được tạo đã được cấu hình sẵn để xác thực với tư cách người dùng này bằng cách sử dụng token RDS có thời hạn ngắn, vì vậy mã ứng dụng của bạn không bao giờ xử lý mật khẩu cơ sở dữ liệu.

    VPC của bạn nên bao gồm các subnet công khai, subnet riêng tư có egress và subnet riêng tư bị cô lập. Cơ sở dữ liệu có thể chạy trong các subnet riêng tư bị cô lập, trong khi các hàm Lambda ứng dụng nên chạy trong các subnet riêng tư có egress để chúng có thể truy cập các dịch vụ AWS như AppConfig.

    packages/infra/src/stacks/application-stack.ts
    const vpc = new Vpc(this, 'Vpc', {
    subnetConfiguration: [
    {
    name: 'public',
    subnetType: SubnetType.PUBLIC,
    },
    {
    name: 'private_with_egress',
    subnetType: SubnetType.PRIVATE_WITH_EGRESS,
    },
    {
    name: 'private_isolated',
    subnetType: SubnetType.PRIVATE_ISOLATED,
    },
    ],
    });

    Sử dụng trình tạo connection để kết nối một dự án với cơ sở dữ liệu này — xem hướng dẫn kết nối cho loại compute liên quan (ví dụ: FastAPI, MCP server, agent) để biết cách kết nối cơ sở hạ tầng cần thiết để truy cập nó.

    Cơ sở hạ tầng được tạo ra bao gồm một RDS Proxy theo mặc định, nằm giữa ứng dụng của bạn và cụm Aurora. RDS Proxy cung cấp một số lợi ích:

    • Connection pooling - Duy trì một nhóm kết nối cơ sở dữ liệu có thể được chia sẻ giữa các instance ứng dụng, giảm chi phí thiết lập kết nối mới
    • Connection resilience - Tự động xử lý failover và kết nối lại trong quá trình thay thế hoặc bảo trì instance Aurora
    • IAM authentication - Hỗ trợ xác thực cơ sở dữ liệu dựa trên IAM, loại bỏ nhu cầu quản lý thông tin xác thực cơ sở dữ liệu trong mã ứng dụng của bạn
    • Improved security - Thực thi mã hóa TLS cho tất cả các kết nối

    Bạn có thể tắt RDS proxy như sau:

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

    Khi RDS Proxy bị tắt, ứng dụng của bạn kết nối trực tiếp đến endpoint cụm Aurora.

    Yêu cầu SSL khi kết nối không có RDS Proxy

    Phần tiêu đề “Yêu cầu SSL khi kết nối không có RDS Proxy”

    Amazon RDS CA bundle phải có trong system trust store của 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

    Đối với các Lambda function được triển khai dưới dạng zip (chẳng hạn như py#api FastAPI), system trust store tích hợp sẵn của môi trường thực thi Lambda Amazon Linux 2023 bao gồm các Amazon Root CA được sử dụng bởi RDS.

    Khi sử dụng RDS Proxy, bạn không cần cấu hình RDS CA bundle trong runtime kết nối đến cơ sở dữ liệu.

    Cấu hình các instance writer và reader cho Aurora cluster của bạn.

    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')],
    });

    Kiểm soát giới hạn mở rộng của Aurora Serverless v2 để phù hợp với khối lượng công việc của bạn.

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

    Cố định một phiên bản engine Aurora cụ thể.

    Theo mặc định, image container cơ sở dữ liệu cục bộ được tạo ra sẽ khớp với phiên bản engine Aurora mặc định. Nếu bạn thay đổi phiên bản engine Aurora, bạn nên sử dụng phiên bản image container cục bộ tương ứng để đảm bảo khả năng tương thích tối đa. Xem ghi chú phát hành của AWS cho các phiên bản Aurora PostgreSQLcác phiên bản Aurora MySQL để xác định phiên bản cơ sở dữ liệu cộng đồng tương ứng.

    Image cơ sở dữ liệu cục bộ được cấu hình trong trường localDev.image của tệp config.json được tạo ra trong thư mục gốc của dự án cơ sở dữ liệu của bạn. Cập nhật giá trị đó khi bạn thay đổi phiên bản engine.

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

    Bảo vệ xóa được bật theo mặc định (deletionProtection: true trong CDK, deletion_protection = true trong Terraform) để bảo vệ Aurora cluster khỏi bị xóa nhầm.

    Bạn có thể tắt bảo vệ xóa cho các môi trường mà việc xóa cơ sở dữ liệu được dự kiến, chẳng hạn như các stack phát triển hoặc xem trước có thời gian tồn tại ngắn.

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

    Cấu trúc CDK giữ lại cụm Aurora theo mặc định (removalPolicy: RemovalPolicy.RETAIN). Thay đổi điều này khi bạn muốn việc xóa CDK stack tạo snapshot hoặc phá hủy cụm thay vào đó.

    Khi sử dụng RemovalPolicy.DESTROY, bảo vệ xóa cũng phải được tắt trước khi cụm có thể bị xóa.

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

    Đối với môi trường tạm thời mà cơ sở dữ liệu nên được xóa cùng với 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,
    });

    Performance Insights được bật trên Aurora writer instance theo mặc định (được mã hóa bằng KMS key của cluster). Bạn cũng có thể xuất các nhật ký Aurora engine sang CloudWatch Logs (postgresql cho Aurora PostgreSQL; audit, error, generalslowquery cho Aurora MySQL). Bật xuất nhật ký cho từng cơ sở dữ liệu:

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

    Khóa KMS được sử dụng để mã hóa cụm Aurora và bí mật thông tin xác thực của nó có tính năng xoay vòng khóa tự động được bật theo mặc định. Tắt nó nếu chính sách bảo mật của bạn quản lý việc xoay vòng từ bên ngoài.

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

    Sử dụng generator connection để tích hợp dự án này với các dự án khác trong workspace của bạn. Các kết nối sau liên quan đến dự án này:

    Strands AgentsPythonAmazon AuroraPython
    Python Agent to Relational DatabaseKết nối một Python Agent đến cơ sở dữ liệu quan hệ Aurora
    FastAPIAmazon AuroraPython
    FastAPI to Relational DatabaseKết nối một FastAPI đến cơ sở dữ liệu quan hệ Aurora
    Model Context ProtocolPythonAmazon AuroraPython
    Python MCP Server to Relational DatabaseKết nối một Python MCP Server đến cơ sở dữ liệu quan hệ Aurora