连接到 Firestore 数据库

使用 Firestore 可为 Cloud Run 服务设置可扩缩的 NoSQL 云数据库。Firestore 是一种灵活且可伸缩的 NoSQL 数据库,适用于进行移动端、Web 和服务器开发。

您可以使用本页面介绍的 Cloud Run 集成将 Cloud Run 服务快速连接到新的 Firestore 数据库。

准备工作

  • 确保您要集成的 Cloud Run 服务已部署完毕。
  • 查看 Firestore 价格页面。您需要为集成中使用的各个资源付费。

所需的角色

如需使用 Cloud Run 集成,您或您的管理员必须向两个不同的主账号授予 IAM 角色

点击查看您的 Google 账号需要的角色

如需获得使用 Cloud Run 集成所需的权限,请让您的管理员向您的 Google 账号授予项目的以下 IAM 角色:

点击查看服务账号需要的角色

如需部署 Cloud Run 服务,您可以使用系统自动创建的 Compute Engine 默认服务账号,也可以指定用户管理的服务账号。服务账号必须具有以下角色:

将服务连接到新的 Firestore 数据库

任何配置更改都会导致新修订版本的创建。后续修订版本也将自动采用此配置设置,除非您进行了明确更新。

您可以使用控制台或命令行将 Cloud Run 服务连接到 Firestore 数据库。

控制台

  1. 在 Google Cloud 控制台中,转到 Cloud Run 页面。

    转到 Cloud Run

  2. 在服务列表中,点击要在此集成中使用的服务。

  3. 点击 Integrations(集成)标签。

  4. 点击添加集成

  5. 点击 Firestore 数据库

  6. 使用默认名称,或者将名称更改为您要使用的值。

    图片

  7. 如果系统提示您启用 API 列表,请点击启用并等待 API 启用。

  8. 资源下,记下此集成后将创建的新资源。

  9. 点击提交,然后等待集成和资源创建完成。此过程最多可能需要 15 分钟。

gcloud

  1. 更新到最新的 Google Cloud CLI:

    gcloud components update
    
  2. 创建集成:

    gcloud beta run integrations create \
    --type=firestore \
    --service=SERVICE \
    --region REGION
    

    您需要在其中:

    • SERVICE 替换为您的 Cloud Run 服务的名称。

    (可选)添加 --service-account=SERVICE_ACCOUNT_EMAIL 标志。

    • SERVICE_ACCOUNT_EMAIL 替换为用于部署服务的用户管理的服务账号电子邮件地址 (PROJECT_NUMBER-compute@developer.gserviceaccount.com)。如果要使用默认计算服务账号 (SERVICE_ACCOUNT_ID@PROJECT_ID.iam.gserviceaccount.com),请省略此标志。

      如需在部署 Cloud Run 集成时继续使用指定的服务账号,请运行以下命令:

      gcloud config set runapps/deployment-service-account
      
  3. 等待最多 15 分钟,在此期间,系统会创建并连接一个完全配置的 Firestore 数据库。此外,系统还会创建新的 Cloud Run 修订版本,包括用于标识数据库的环境变量。该过程完成后,系统会显示以下消息:

    [firestore] integration [firestore-xxx] has been updated successfully.
    
    To connect to the Firestore database, utilize the environment variable
    `FIRESTORE_DB_NAME`. This variable is added to the Cloud Run
    service for you.

    您可以运行 gcloud beta run integrations describe 来检查状态。

查看 Firestore 数据库集成

如需查看 Cloud Run 服务的 Firestore 数据库集成的当前状态,请执行以下操作:

控制台

  1. 在 Google Cloud 控制台中,转到 Cloud Run 页面。

    转到 Cloud Run

  2. 在服务列表中,点击要在此集成中使用的服务。

  3. 点击 Integrations(集成)标签。

  4. 找到相关 Firestore 数据库集成,然后点击查看详情

gcloud

  1. 使用以下命令获取可用集成的列表:

    gcloud beta run integrations list
  2. 使用返回列表中的名称显示它的详细信息:

    gcloud beta run integrations describe INTEGRATION_NAME

    INTEGRATION_NAME 替换为您的 Firestore 数据库集成的名称。

删除 Firestore 数据库集成

如果删除集成,则系统还会删除与该集成关联的所有 Google Cloud 资源,但不会删除 Cloud Run 服务。

如需从 Cloud Run 服务中删除 Firestore 数据库集成,请执行以下操作:

控制台

  1. 在 Google Cloud 控制台中,转到 Cloud Run 页面。

    转到 Cloud Run

  2. 点击要删除集成的服务。

  3. 点击 Integrations(集成)标签。

  4. 找到您感兴趣的 Firestore 数据库集成,点击集成右侧的省略号图标,然后点击删除

gcloud

  1. 使用以下命令获取可用集成的列表:

    gcloud beta run integrations list
  2. 使用返回列表中的名称删除集成:

    gcloud beta run integrations delete INTEGRATION_NAME
    

    您需要在其中:

    • INTEGRATION_NAME 替换为您的 Firestore 数据库集成的名称。

    (可选)您可以使用以下标志选项:

    选项 说明
    --service-account 用于执行删除操作的用户管理的服务账号电子邮件地址。

在代码中访问 Firestore 数据库

完成集成后,Cloud Run 会自动添加环境变量 FIRESTORE_DB_NAME,以便在 Cloud Run 服务代码中使用。

使用 Firestore 的服务示例代码

如需查看 Firestore Server 库代码示例或以下示例,请参阅 Firestore 文档:

以下说明中的 Python 示例需要使用 Cloud Run 集成创建的 Firestore 数据库,并在原生 Firestore 模式下运行。您还必须有现成的代码库以将代码推送到其中。

  1. 为示例文件创建目录:

    mkdir SERVICE
    

    SERVICE 替换为 Cloud Run 服务名称。

  2. 配置 Docker 身份验证:

    gcloud auth configure-docker REGION-docker.pkg.dev
    

    REGION 替换为该服务的 Google Cloud 区域。

  3. SERVICE 目录中创建一个 requirements.txt 文件,并添加以下内容:

    flask
    google-cloud-firestore
    
  4. SERVICE 目录中创建一个 Dockerfile 文件,并添加以下内容:

    FROM python:3.9-slim
    
    WORKDIR /app
    
    COPY requirements.txt ./
    RUN pip install -r requirements.txt
    
    COPY . .
    
    EXPOSE 8080
    
    CMD ["python", "app.py"]
    
  5. SERVICE 目录中创建一个 app.py 文件,并添加以下内容:

    from flask import Flask, jsonify, request
    import google.cloud.firestore
    import os

    app = Flask(name) dbname = os.environ['FIRESTORE_DB_NAME'] db = google.cloud.firestore.Client(database=dbname) # Initialize Firestore client

    @app.route('/data', methods=['POST']) def add_data(): data = request.get_json() db.collection('city_person').add(data) return jsonify({'message': 'Data added successfully!'}), 201

    @app.route('/data', methods=['GET']) def get_data(): results = db.collection('city_person').stream() data_list = [doc.to_dict() for doc in results] return jsonify(data_list), 200

    if name == 'main': app.run(host='0.0.0.0', port=8080, debug=True)

  6. 前往 SERVICE 目录:

    cd SERVICE
    

SERVICE 替换为 Cloud Run 服务文件夹的名称。

  1. 构建 Docker 映像:

    docker build -t REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY_NAME/IMAGE_NAME:latest .
    

    您需要将其中的:

    • REGION 替换为该服务的 Google Cloud 区域。
    • PROJECT_ID 替换为 Google Cloud 项目 ID。
    • REPOSITORY_NAME 替换为 Artifact Registry 制品库的名称。
    • IMAGE_NAME 替换为对容器映像的引用,例如 us-docker.pkg.dev/cloudrun/container/job:latest
  2. 推送 Docker 映像:

    docker push REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY_NAME/IMAGE_NAME:latest
    

    您需要将其中的:

    • REGION 替换为该服务的 Google Cloud 区域。
    • PROJECT_ID 替换为 Google Cloud 项目 ID。
    • REPOSITORY_NAME 替换为 Artifact Registry 制品库的名称。
    • IMAGE_NAME 替换为对容器映像的引用,例如 us-docker.pkg.dev/cloudrun/container/job:latest
  3. 将服务部署到 Cloud Run:

    gcloud run deploy SERVICE_NAME --image REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY_NAME/IMAGE_NAME:latest --allow-unauthenticated --region REGION
    

REGION 替换为该服务的 Google Cloud 区域。将 PROJECT_ID 替换为 Google Cloud 项目 ID。将 REPOSITORY_NAME 替换为 Artifact Registry 制品库的名称,并将 IMAGE_NAME 替换为对容器映像的引用,例如 us-docker.pkg.dev/cloudrun/container/job:latest。

部署完成后,服务网址会显示在文本网址的旁边。

  1. 为 Cloud Run 配置 Firestore 集成:

    gcloud beta run integrations create \
    --type=firestore \
    --service=SERVICE_NAME \
    --region REGION
    
  2. 部署完成后,在以下读取和写入命令中输入服务网址:

    1. 写入数据:

      curl -X POST SERVICE_URL/data -H "Content-Type: application/json" -d '{"name": "Alice", "city": "New York"}'
      
    2. 读取数据:

      curl https://SERVICE_URL/data
      

如需查看读取数据命令中返回的不同结果,您可以更改写入数据命令中的名称和城市。

限制