FastAPI에서 관계형 데이터베이스로
connection 제너레이터는 FastAPI를 Python 관계형 데이터베이스 프로젝트에 연결하여, FastAPI 의존성을 통해 타입이 지정된 SQLModel 세션을 라우트 핸들러에 주입합니다.
사전 요구 사항
섹션 제목: “사전 요구 사항”이 제너레이터를 사용하기 전에 다음이 필요합니다:
py#fast-api프로젝트py#rdb프로젝트
사용법
섹션 제목: “사용법”제너레이터 실행
섹션 제목: “제너레이터 실행”- 설치 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 | - | 연결을 시작할 소스 컴포넌트 (컴포넌트 이름, 소스 프로젝트 루트 기준 상대 경로, 또는 generator id). 프로젝트를 소스로 명시적으로 선택하려면 '.'을 사용하세요. |
| targetComponent | string | - | 연결할 대상 컴포넌트 (컴포넌트 이름, 대상 프로젝트 루트 기준 상대 경로, 또는 generator id). 프로젝트를 대상으로 명시적으로 선택하려면 '.'을 사용하세요. |
| preferInstallDependencies | boolean | true | 생성기 실행 후 의존성 설치를 선호할지 여부입니다. 여러 생성기를 일괄 처리할 때 설치를 연기하려면 false로 설정하세요 (후속 생성기가 Nx 프로젝트 그래프를 계산할 수 있도록 필요한 경우 설치는 여전히 실행됩니다); 마지막에 한 번만 설치합니다. |
제너레이터 출력
섹션 제목: “제너레이터 출력”제너레이터는 FastAPI 프로젝트를 수정합니다:
디렉터리packages/my_api
- project.json
dev가 데이터베이스의dev타겟에 의존성 추가 - pyproject.toml 데이터베이스 패키지를 워크스페이스 종속성으로 추가
디렉터리my_api
디렉터리dependencies
- my_db.py 데이터베이스 세션을 위한 FastAPI
MyDbSession의존성
- my_db.py 데이터베이스 세션을 위한 FastAPI
- project.json
라우트 핸들러에서 데이터베이스 사용
섹션 제목: “라우트 핸들러에서 데이터베이스 사용”이 제너레이터는 라우트 핸들러에서 사용할 수 있는 주입 가능한 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는 요청당 새 세션을 자동으로 열고 핸들러가 반환될 때 닫습니다.
인프라
섹션 제목: “인프라”런타임에 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 서비스 엔드포인트입니다.
데이터베이스와 동일한 VPC에 API를 배포하고, additional_iam_policy_statements를 통해 rds-db:connect 권한을 부여하며, 보안 그룹 규칙 쌍으로 네트워크 경로를 여세요:
module "my_database" { source = "../../common/terraform/src/app/dbs/my-database" vpc_id = module.vpc.vpc_id database_subnet_ids = module.vpc.private_isolated_subnet_ids lambda_subnet_ids = module.vpc.private_subnet_ids}
module "api" { source = "..." enable_vpc = true vpc_id = module.vpc.vpc_id subnet_ids = module.vpc.private_subnet_ids
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}" ] } ]
env = { RUNTIME_CONFIG_APP_ID = module.runtime_config_appconfig.application_id }}
resource "aws_vpc_security_group_ingress_rule" "api_to_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" { 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 함수를 프라이빗 격리 서브넷이 아닌 이그레스가 있는 프라이빗 서브넷에 배포하세요. RUNTIME_CONFIG_APP_ID는 데이터베이스 모듈의 출력이 아닌 공유 런타임 구성 AppConfig 애플리케이션을 가리켜야 합니다.
로컬 개발
섹션 제목: “로컬 개발”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 데이터베이스에 연결하도록 합니다.