GitHub热门项目FastAPI:在Google Cloud Run环境下的安装与使用

云信安装大师
90
AI 质量分
10 5 月, 2025
3 分钟阅读
0 阅读

GitHub热门项目FastAPI:在Google Cloud Run环境下的安装与使用

引言

FastAPI是GitHub上最受欢迎的Python Web框架之一,以其高性能和易用性著称。Google Cloud Run则是一个完全托管的无服务器平台,可以轻松部署容器化应用。本文将带你一步步在Google Cloud Run上部署FastAPI应用,让你快速体验这个强大的组合。

准备工作

在开始之前,你需要准备以下内容:

  1. Google Cloud账号(可免费试用)
  2. 本地安装的Python 3.7+环境
  3. 安装Google Cloud SDK
  4. Docker(用于构建容器镜像)

第一步:创建FastAPI应用

我们先创建一个简单的FastAPI应用作为示例。

代码片段
# main.py
from fastapi import FastAPI

app = FastAPI()

@app.get("/")
async def root():
    return {"message": "Hello World"}

@app.get("/items/{item_id}")
async def read_item(item_id: int, q: str = None):
    return {"item_id": item_id, "q": q}

这个简单的API包含两个端点:
/ – 返回欢迎消息
/items/{item_id} – 演示路径参数和查询参数

第二步:添加依赖文件

创建requirements.txt文件,列出项目依赖:

代码片段
fastapi>=0.68.0
uvicorn>=0.15.0

第三步:创建Dockerfile

为了让我们的应用能在Cloud Run上运行,需要将其容器化:

代码片段
# 使用官方Python运行时作为基础镜像
FROM python:3.9-slim

# 设置工作目录
WORKDIR /app

# 先复制依赖文件,利用Docker缓存层优化构建速度
COPY requirements.txt .

# 安装依赖
RUN pip install --no-cache-dir -r requirements.txt

# 复制应用代码
COPY . .

# 声明容器运行时监听的端口(Cloud Run会覆盖这个值)
EXPOSE 8080

# 启动命令(Cloud Run要求监听$PORT环境变量)
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8080"]

关键点说明:
python:3.9-slim是一个轻量级的Python镜像
--no-cache-dir可以减少镜像大小
– Cloud Run会自动设置$PORT环境变量,但这里我们固定使用8080以简化示例

第四步:本地测试

在部署前,先在本地测试:

  1. 构建Docker镜像:
代码片段
docker build -t fastapi-cloudrun .
  1. 运行容器:
代码片段
docker run -p 8080:8080 fastapi-cloudrun
  1. 访问http://localhost:8080/应该能看到{“message”:”Hello World”}

第五步:部署到Google Cloud Run

现在我们将应用部署到Cloud Run:

  1. 登录Google Cloud并设置项目
代码片段
gcloud auth login
gcloud config set project YOUR_PROJECT_ID
  1. 启用必要服务
代码片段
gcloud services enable run.googleapis.com containerregistry.googleapis.com cloudbuild.googleapis.com
  1. 构建并推送镜像
代码片段
gcloud builds submit --tag gcr.io/YOUR_PROJECT_ID/fastapi-cloudrun .
  1. 部署到Cloud Run
代码片段
gcloud run deploy fastapi-service \
    --image gcr.io/YOUR_PROJECT_ID/fastapi-cloudrun \
    --platform managed \
    --region us-central1 \
    --allow-unauthenticated \
    --port=8080 \
    --memory=512Mi \
    --cpu=1 \
    --timeout=300s \
    --concurrency=80 \
    --max-instances=10 \
    --min-instances=0 

参数说明:
--allow-unauthenticated: 允许公开访问(生产环境可能需要限制)
--memory: 每个实例的内存分配(512Mi是默认值)
--cpu: CPU分配(1表示1个vCPU)
--concurrency: 每个实例处理的并发请求数(默认80)
--max-instances: Auto-scaling的最大实例数(控制成本)

  1. 获取服务URL

部署完成后,会输出服务URL,格式如:

代码片段
https://fastapi-service-xxxxxx-uc.a.run.app/

访问这个URL应该能看到与本地测试相同的结果。

高级配置选项

自定义域名(可选)

如果你有自己的域名,可以将其映射到Cloud Run服务:

代码片段
gcloud beta run domain-mappings create \ 
    --service fastapi-service \ 
    --domain your-domain.com \ 
    --region us-central1 

CI/CD自动化(可选)

创建cloudbuild.yaml实现自动部署:

代码片段
steps:
- name: 'gcr.io/cloud-builders/docker'
  args: ['build', '-t', 'gcr.io/$PROJECT_ID/fastapi-cloudrun', '.']

- name: 'gcr.io/cloud-builders/docker'
  args: ['push', 'gcr.io/$PROJECT_ID/fastapi-cloudrun']

- name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
  entrypoint: gcloud 
  args: ['run', 'deploy', 'fastapi-service',
         '--image', 'gcr.io/$PROJECT_ID/fastapi-cloudrun',
         '--platform', 'managed',
         '--region', 'us-central1',
         '--allow-unauthenticated']
images:
- 'gcr.io/$PROJECT_ID/fastapi-cloudrun'

然后每次提交代码后运行:

代码片段
gcloud builds submit --config cloudbuild.yaml .

常见问题解决

Q1: Deployment failed with “Container failed to start”

检查日志:

代码片段
gcloud logging read "resource.type=cloud_run_revision AND resource.labels.service_name=fastapi-service" --limit=50 

常见原因:
1. Dockerfile中的CMD命令不正确(必须监听$PORT)
2. Python依赖安装失败(检查requirements.txt)

Q2: Cold start时间过长

解决方案:
1. 预热实例:设置最小实例数大于0 (--min-instances=1)
2. 精简镜像:使用更小的基础镜像如python:3.9-alpine

Q3: API响应慢或超时

调整以下参数:

代码片段
--cpu=2 \            # CPU增加到2个vCPU  
--memory=1024Mi \     # RAM增加到1GB  
--timeout=900s        # timeout延长到15分钟  

Best Practices最佳实践

  1. 健康检查端点
    添加/healthz端点用于健康检查:
代码片段
@app.get("/healthz") 
async def health_check():
    return {"status": "healthy"}
  1. 环境变量配置
    使用环境变量管理配置(数据库连接等):
代码片段
import os 

DATABASE_URL = os.getenv("DATABASE_URL", "sqlite:///:memory:")

3.日志记录
Cloud Run会自动捕获stdout/stderr日志。建议添加结构化日志:

代码片段
import logging 

logger = logging.getLogger(__name__) 

@app.get("/") 
async def root(): 
    logger.info("Root endpoint accessed") 
    return {"message": "Hello World"}

4.安全加固
生产环境中应:

代码片段
--allow-unauthenticated=false   #启用身份验证  
set-env-vars="DEBUG=false"      #禁用调试模式  

Cost Optimization成本优化技巧

1.合理设置自动扩缩参数
对于流量波动大的应用:

代码片段
--min-instances=0     #允许缩容到零节省成本  
--max-instances=100   #防止突发流量导致账单爆炸  

2.利用CPU Allocated vs Used指标
如果CPU利用率长期低于50%,可以降低CPU分配:

代码片段
--cpu=.5              #仅分配半个vCPU  

3.选择合适的区域
不同区域价格不同(e.g., Iowa比东京便宜20%)

Monitoring监控

查看服务的监控指标:

代码片段
https://console.cloud.google.com/run/detail/us-central1/fastapi-service/metrics?project=YOUR_PROJECT_ID  

关键指标包括:
– Request Count/Latency
– CPU/Memory Utilization
– Instance Count

Clean Up清理资源

避免产生意外费用:

代码片段
#删除Cloud Run服务  
gcloud run services delete fastapi-service \   
   --platform managed \   
   --region us-central1  

#删除Container Registry中的镜像   
gcloud container images delete gcr.io/YOUR_PROJECT_ID/fastapi-cloudrun   

Conclusion总结

通过本文我们完成了以下工作:

✅创建了一个基本的FastAPI应用
✅编写了优化的Dockerfile
✅将应用部署到Google Cloud Run
✅配置了自动扩缩和监控

FastAPI+CloudRun的组合优势明显:

🚀快速开发与部署周期
⚡️自动扩缩应对流量波动
💰按实际用量付费的定价模式

下一步你可以尝试:

•集成数据库(如Firestore或Cloud SQL)
•添加用户认证(Firebase Auth)
•实现更复杂的业务逻辑

Happy Coding! 🎉

原创 高质量