FastAPI から リレーショナルデータベースへ
connection ジェネレーターは、FastAPI を Python リレーショナルデータベース プロジェクトに接続し、FastAPI の依存性を介して型付き SQLModel セッションをルートハンドラーに注入します。
このジェネレーターを使用する前に、以下を確認してください:
ジェネレーターの実行
Section titled “ジェネレーターの実行”このジェネレーターを実行@aws/nx-plugin:connection
pnpm nx g @aws/nx-plugin:connection yarn nx g @aws/nx-plugin:connection npx nx g @aws/nx-plugin:connection bunx nx g @aws/nx-plugin:connection- インストール Nx Console VSCode Plugin まだインストールしていない場合
- VSCodeでNxコンソールを開く
- クリック
Generate (UI)"Common Nx Commands"セクションで - 検索
@aws/nx-plugin - connection - 必須パラメータを入力
- クリック
Generate
コマンドを組み立てる5
必須
必須
FastAPI プロジェクトをソースとして、リレーショナルデータベースプロジェクトをターゲットとして選択します。
sourceProject必須stringソース プロジェクト
targetProject必須string接続先のターゲット プロジェクト
sourceComponentstring接続元のソースコンポーネント(コンポーネント名、ソースプロジェクトルートからの相対パス、またはジェネレーターID)。プロジェクトをソースとして明示的に選択するには '.' を使用します。
targetComponentstring接続先のターゲットコンポーネント(コンポーネント名、ターゲットプロジェクトルートからの相対パス、またはジェネレーターID)。プロジェクトをターゲットとして明示的に選択するには '.' を使用します。
preferInstallDependenciesbooleanデフォルト: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))).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 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 名前空間を公開するため、データベースモジュールのランタイム設定エントリは追加の設定なしでデプロイされます。
RDS Proxy を使用せずに接続する場合の SSL 要件
Section titled “RDS Proxy を使用せずに接続する場合の SSL 要件”Amazon Linux 2023 Lambda実行環境の組み込みCA信頼ストアには、RDSで使用されるAmazon Root CAが含まれているため、追加の設定は必要ありません。
RDS Proxyを使用する場合、Lambda関数でRDS CAバンドルを設定する必要はありません。
ローカル開発
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 データベースに接続します。