在 Cloud Run 上部署 FastAPI (初学者)
本文的主要专案请参阅详细範例档案、文章描述皆在 GitHub 专案中简介
在 Google Cloud Run 上运行 FastAPI 的範本
透过一键式且快速地使用 FastAPI 在 Cloud Run 上部署 API
透过 CLI 的基本方法
gcloud CLI
在云端上建立映像档 (容器登记)
gcloud builds submit --tag {REGION}.gcr.io/{PROJECT_ID}/{IMAGE} --ignore-file .gcloudignore
部署服务至 Cloud Run
gcloud run deploy --image {REGION}.gcr.io/{PROJECT_ID}/{IMAGE} --platform managed --port 8000 --memory {1Gi} --timeout={2m}
透过 Shell 的进阶方法
优点
自动化: 透过使用这些工具,您可以自动化部署资源与基础架构的流程,节省时间并减少人为失误的机会
一致性: 自动化确保了部署流程在各种环境中都是一致的,这使得管理和疑难排解更加容易
可重複使用: 透过 Cloud Deployment Manager 或 shell script,您可以重複使用範本和脚本来多次部署相同的资源和基础架构,进而提高建立新环境的效率
扩展性: 这些工具让您可以扩展部署大规模专案所需的资源与基础架构,尤其适用于大型专案
版本控制: 透过将範本和脚本储存在版本控制中,您可以追蹤变更并在必要时回到先前的版本
工作方式
在我们的 deploy.sh
中,我们将:
config.env
取得环境变数source config.env
启用 GCP 服务gcloud services enable cloudbuild.googleapis.com storage-component.googleapis.com containerregistry.googleapis.com run.googleapis.com
将映像档建置至容器登记gcloud builds submit --tag "$CONTAINER_HOST/$PROJECT_ID/$IMAGE_NAME:$IMAGE_TAG" --ignore-file .gcloudignore
部署到 Cloud Rungcloud run deploy $SERVICE_NAME --image "$CONTAINER_HOST/$PROJECT_ID/$IMAGE_NAME:$IMAGE_TAG" --platform managed --port "$PORT" --memory "$MEMORY" --timeout="$TIMEOUT" --region="$REGION"
您可以使用 gcloud run deploy --help
检查所有的 FLAGS,参阅
如果您不希望任何人访问此 API,您应该从 deploy.sh
中删除 --allow-unauthenticated
,参阅验证
一键部署方式
在 config.env
中定义您的 "环境变数",例如:
PROJECT_ID="GCP-PROJECT-ID"IMAGE_NAME="service-template"IMAGE_TAG="latest"CONTAINER_HOST="asia.gcr.io"SERVICE_NAME="service-template"REGION="asia-east1"PORT=8000MEMORY="1Gi"TIMEOUT="2m"
在 main.py
和 routers/
中定义您的应用程式(FastAPI)。
在 requirements.txt
中定义所需的模组
.py
中收集所有使用模组的简单方法,在 cmd、powershell、wsl、git bash
中执行以下 CLIpip install pipreqs
pipreqs ./
检查您的 Dockerfile
部署您的应用程式:
在 wsl、git bash
中执行以下 CLI
./deploy.sh
示範
使用 Git 複製此专案
打开终端机,并导览到此专案目录
执行 ./deploy.sh
指令
等待部署完成,并取得 Service URL
,例如:https://service-template-xxxxxxxxxx-xx.a.run.app
使用 client.py
脚本测试您的 API,例如:
Script
import requestshost = "Service URL"url = f"{host}/v1/recommend"request_data = { "page": "index", "data": {"ip_address": "e12345"}}res = requests.post(url, json=request_data)if res.status_code == 200: print(res.json())else: print("Error: ", res.text)
Result
{'code': '0', 'msg': 'success', 'ip_address': 'e12345'}
验证
验证是 Cloud Run 中的安全选项,用于控制谁可以访问您的应用程式
--no-allow-unauthenticated
: 任何人都不可访问 api
允许限定的成员可访问
gcloud run services add-iam-policy-binding my-service --region='us-central1' --member='user:test-user@gmail.com' --role='roles/run.invoker'
--allow-unauthenticated
: 任何人都可以访问 api