Skip to content

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

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

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

  1. FastAPI プロジェクト(py#api --framework=fastapi で生成)、py#api ガイドを参照
  2. py#rdb プロジェクト

このジェネレーターを実行@aws/nx-plugin:connection

pnpm nx g @aws/nx-plugin:connection
コマンドを組み立てる5

必須

必須

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

ジェネレーターオプション5 オプション
sourceProject必須string

ソース プロジェクト

targetProject必須string

接続先のターゲット プロジェクト

sourceComponentstring

接続元のソースコンポーネント(コンポーネント名、ソースプロジェクトルートからの相対パス、またはジェネレーターID)。プロジェクトをソースとして明示的に選択するには '.' を使用します。

targetComponentstring

接続先のターゲットコンポーネント(コンポーネント名、ターゲットプロジェクトルートからの相対パス、またはジェネレーターID)。プロジェクトをターゲットとして明示的に選択するには '.' を使用します。

preferInstallDependenciesbooleanデフォルト: true

ジェネレーター実行後に依存関係のインストールを優先するかどうか。複数のジェネレーターをバッチ処理する際にインストールを延期する場合は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))).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 は、リクエストごとに新しいセッションを自動的に開き、ハンドラーが戻るときにそれを閉じます。

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 サービスエンドポイントであり、アウトバウンドインターネットアクセスが必要です。

RDS Proxy を使用せずに接続する場合の SSL 要件

Section titled “RDS Proxy を使用せずに接続する場合の SSL 要件”

Amazon Linux 2023 Lambda実行環境の組み込みCA信頼ストアには、RDSで使用されるAmazon Root CAが含まれているため、追加の設定は必要ありません。

RDS Proxyを使用する場合、Lambda関数でRDS CAバンドルを設定する必要はありません。

Terminal window
pnpm nx dev <project-name>

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