Skip to content

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

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

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

  1. FastAPI プロジェクト(py#api --framework=fastapi で生成)、py#api ガイドを参照
  2. py#rdb プロジェクト
Terminal window
pnpm nx g @aws/nx-plugin:connection
変更されるファイルを確認するためにドライランを実行することもできます
Terminal window
pnpm nx g @aws/nx-plugin:connection --dry-run

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 データベースに接続します。