FastAPI からリレーショナルデータベースへの接続
connection ジェネレーターは、FastAPI を Python リレーショナルデータベース プロジェクトに接続し、FastAPI の依存性を介して型付き SQLModel セッションをルートハンドラーに注入します。
このジェネレーターを使用する前に、以下を確認してください:
ジェネレーターの実行
Section titled “ジェネレーターの実行”- インストール Nx Console VSCode Plugin まだインストールしていない場合
- VSCodeでNxコンソールを開く
- クリック
Generate (UI)"Common Nx Commands"セクションで - 検索
@aws/nx-plugin - connection - 必須パラメータを入力
- クリック
Generate
pnpm nx g @aws/nx-plugin:connectionyarn nx g @aws/nx-plugin:connectionnpx nx g @aws/nx-plugin:connectionbunx nx g @aws/nx-plugin:connectionFastAPI プロジェクトをソースとして、リレーショナルデータベースプロジェクトをターゲットとして選択します。
| パラメータ | 型 | デフォルト | 説明 |
|---|---|---|---|
| sourceProject 必須 | string | - | ソース プロジェクト |
| targetProject 必須 | string | - | 接続先のターゲット プロジェクト |
| sourceComponent | string | - | 接続元のソース コンポーネント (コンポーネント名、ソース プロジェクト ルートからの相対パス、またはジェネレーター ID)。プロジェクトをソースとして明示的に選択するには '.' を使用します。 |
| targetComponent | string | - | 接続先のターゲット コンポーネント (コンポーネント名、ターゲット プロジェクト ルートからの相対パス、またはジェネレーター ID)。プロジェクトをターゲットとして明示的に選択するには '.' を使用します。 |
| preferInstallDependencies | boolean | true | ジェネレーター実行後に依存関係のインストールを優先するかどうか。複数のジェネレーターをバッチ処理する際にインストールを延期する場合はfalseに設定します(後続のジェネレーターがNxプロジェクトグラフを計算できるよう、必要に応じてインストールは実行されます)。最後に一度だけインストールします。 |
ジェネレーターの出力
Section titled “ジェネレーターの出力”ジェネレーターは FastAPI プロジェクトを変更します:
Directorypackages/my_api
- project.json
devからデータベースのdevターゲットへの依存関係を追加します - pyproject.toml データベースパッケージをワークスペースの依存関係として追加します
Directorymy_api
Directorydependencies
- my_db.py データベースセッション用の FastAPI
MyDbSession依存性
- my_db.py データベースセッション用の FastAPI
- project.json
ルートハンドラーでのデータベースの使用
Section titled “ルートハンドラーでのデータベースの使用”このジェネレーターは、ルートハンドラーで使用できる注入可能な FastAPI Dependency を設定します:
from sqlmodel import selectfrom my_api.dependencies.my_db import MyDbSessionfrom 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 itemFastAPI は自動的にリクエストごとに新しいセッションを開き、ハンドラーが返されるときにそれを閉じます。
インフラストラクチャ
Section titled “インフラストラクチャ”FastAPI Lambda 関数が実行時にデータベースに接続できるようにするには、データベースと同じ VPC にデプロイし、ネットワークおよび IAM アクセスを許可する必要があります。
アプリケーションスタックで、API をデータベースと同じ VPC にデプロイし、allowDefaultPortFrom と grantConnect を呼び出してネットワークパスを開き、Lambda ハンドラーに IAM rds-db:connect 権限を付与します:
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 サービスエンドポイントです。
API をデータベースと同じ VPC にデプロイし、additional_iam_policy_statements を介して rds-db:connect を付与し、セキュリティグループルールのペアでネットワークパスを開きます:
以下の例は、Python リレーショナルデータベース デプロイメントガイドの VPC リソースを参照しています:aws_subnet.database サブネットにはインターネットルートがなく、aws_subnet.private サブネットには NAT エグレスがあります。
module "my_database" { source = "../../common/terraform/src/app/dbs/my-database" vpc_id = aws_vpc.main.id database_subnet_ids = aws_subnet.database[*].id lambda_subnet_ids = aws_subnet.private[*].id}
module "api" { source = "../../common/terraform/src/app/apis/my-api" enable_vpc = true vpc_id = aws_vpc.main.id subnet_ids = aws_subnet.private[*].id
appconfig_application_id = module.runtime_config_appconfig.application_id appconfig_application_arn = module.runtime_config_appconfig.application_arn
additional_iam_policy_statements = [ { Effect = "Allow" Action = ["rds-db:connect"] Resource = [ "arn:aws:rds-db:${data.aws_region.current.region}:${data.aws_caller_identity.current.account_id}:dbuser:${module.my_database.connect_resource_id}/${module.my_database.database_runtime_user}" ] } ]}
resource "aws_vpc_security_group_ingress_rule" "api_to_database" { description = "Allow the API Lambda functions to connect to the database" security_group_id = module.my_database.security_group_id referenced_security_group_id = module.api.security_group_id from_port = module.my_database.cluster_port to_port = module.my_database.cluster_port ip_protocol = "tcp"}
resource "aws_vpc_security_group_egress_rule" "api_to_database" { description = "Allow outbound traffic from the API Lambda functions to the database" security_group_id = module.api.security_group_id referenced_security_group_id = module.my_database.security_group_id from_port = module.my_database.cluster_port to_port = module.my_database.cluster_port ip_protocol = "tcp"}API Lambda 関数は、プライベート分離サブネットではなく、エグレス付きプライベートサブネットにデプロイしてください。appconfig_application_id/appconfig_application_arn は、データベースモジュールではなく、ルートモジュールで一度宣言された共有 ランタイム設定 AppConfig アプリケーションから取得されます。これらを渡すことで、Lambda 関数に RUNTIME_CONFIG_APP_ID が設定され、アプリケーションへの読み取りアクセスが許可されます。
AppConfig アプリケーションは、データベースモジュールのランタイム設定エントリがデプロイされるように、database 名前空間を公開する必要があります。runtime-config/appconfig モジュールをインスタンス化する際に、namespaces に含めてください:
module "runtime_config_appconfig" { source = "../../common/terraform/src/core/runtime-config/appconfig"
application_name = "my-app-runtime-config" namespaces = ["connection", "agentcore", "database"]}ローカル開発
Section titled “ローカル開発”pnpm nx dev <project-name>yarn nx dev <project-name>npx nx dev <project-name>bunx nx dev <project-name>これにより、FastAPI と接続されているすべてのデータベースが起動します。LOCAL_DEV=true 環境変数により、データベースクライアントは Aurora の代わりにローカル Docker データベースに接続します。