Skip to content

FastAPI からリレーショナルデータベースへの接続

connection ジェネレーターは、FastAPIPython リレーショナルデータベース プロジェクトに接続し、FastAPI の依存性を介して型付き SQLModel セッションをルートハンドラーに注入します。

このジェネレーターを使用する前に、以下を確認してください:

  1. py#fast-api プロジェクト
  2. py#rdb プロジェクト
  1. インストール Nx Console VSCode Plugin まだインストールしていない場合
  2. VSCodeでNxコンソールを開く
  3. クリック Generate (UI) "Common Nx Commands"セクションで
  4. 検索 @aws/nx-plugin - connection
  5. 必須パラメータを入力
    • クリック Generate

    FastAPI プロジェクトをソースとして、リレーショナルデータベースプロジェクトをターゲットとして選択します。

    パラメータデフォルト説明
    sourceProject 必須string-ソース プロジェクト
    targetProject 必須string-接続先のターゲット プロジェクト
    sourceComponent string-接続元のソース コンポーネント (コンポーネント名、ソース プロジェクト ルートからの相対パス、またはジェネレーター ID)。プロジェクトをソースとして明示的に選択するには '.' を使用します。
    targetComponent string-接続先のターゲット コンポーネント (コンポーネント名、ターゲット プロジェクト ルートからの相対パス、またはジェネレーター ID)。プロジェクトをターゲットとして明示的に選択するには '.' を使用します。
    preferInstallDependencies booleantrueジェネレーター実行後に依存関係のインストールを優先するかどうか。複数のジェネレーターをバッチ処理する際にインストールを延期する場合はfalseに設定します(後続のジェネレーターがNxプロジェクトグラフを計算できるよう、必要に応じてインストールは実行されます)。最後に一度だけインストールします。

    ジェネレーターは FastAPI プロジェクトを変更します:

    • Directorypackages/my_api
      • project.json dev からデータベースの dev ターゲットへの依存関係を追加します
      • pyproject.toml データベースパッケージをワークスペースの依存関係として追加します
      • Directorymy_api
        • Directorydependencies
          • my_db.py データベースセッション用の FastAPI MyDbSession 依存性

    ルートハンドラーでのデータベースの使用

    Section titled “ルートハンドラーでのデータベースの使用”

    このジェネレーターは、ルートハンドラーで使用できる注入可能な 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))).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 サービスエンドポイントです。

    Terminal window
    pnpm nx dev <project-name>

    これにより、FastAPI と接続されているすべてのデータベースが起動します。LOCAL_DEV=true 環境変数により、データベースクライアントは Aurora の代わりにローカル Docker データベースに接続します。