使用统一的代码库在多个区域中部署函数

问题描述

我有一个相当简单的要求,因为我需要多个区域中 Firebase 函数、存储桶和 Firestore 数据库的相同副本,以满足数据不会在区域之间移动。一种适用于欧盟、英国、美国等。

因为每个 firebase 项目只能有一个 firestore 数据库,所以我按照建议为每个区域创建一个新项目。我可以使用 firebase 项目环境变量将我的存储桶读/写重定向到正确的区域,以定义要写入的存储桶。到目前为止一切顺利。

现在最后一个瓶颈是函数本身。

问题是认情况下函数会转到“us-central1”而不是 firebase 项目区域,因此似乎指定区域的唯一方法是在代码库等中使用 .region("eu-west3") 说明符。但是因为我想要一个跨所有项目的统一代码库,在每个项目的基础上改变这个有点麻烦。

有关如何最好地管理此问题的任何建议?

解决方法

您可以使用 firebase functions:config:set 将区域值存储为环境配置:

firebase functions:config:set env.region="us-central1" 

运行 functions:config:set 后,您必须重新部署函数以使新配置可用。

然后 get the environment variable 使用此代码在您的函数中:

exports.myFunction = functions
    .region(functions.config.env.region)
    .https.onRequest((req,res) => {
            res.send("Hello");
    });

有了这个,您不再需要更改代码中的区域。但是如果你想改变地区,你仍然需要改变每个项目的配置和重新部署功能。


另一种解决方案是使用 Cloud Build 自动执行所有操作。我还没有完全测试过它,但这是我能想到的。

首先,follow the instructions 关于如何使用 Firebase 构建器工具。您需要此社区提供的映像才能在 Cloud Build 上运行 Firebase CLI 命令。完成后,请确保您的项目启用了以下 API:

  1. 云资源管理器 API
  2. Firebase 管理 API

在您的 Cloud Build 设置中,Firebase Admin 已启用。

然后试试这个 cloudbuild.yaml 文件。 Cloud Build 将在您的项目和其他项目中使用该工具:

steps:
# Setup First Project
  - name: gcr.io/project-id1/firebase
    id: 'Use Project 1'
    args: ['use','project-id1'] 

  - name: gcr.io/project-id1/firebase
    id: 'Set Firebase Environment Config'
    args: ['functions:config:set','env.region=us-central1'] 
     
  - name: gcr.io/project-id1/firebase
    id: 'Deploy function1'
    args: ['deploy','--project=project-id1','--only=functions']

# Setup Second Project
  - name: gcr.io/project-id1/firebase
    id: 'Use Project 2'
    args: ['use','project-id2'] 

  - name: gcr.io/project-id1/firebase
    id: 'Set Firebase Environment Config'
    args: ['functions:config:set','env.region=eu-west3'] 
     
  - name: gcr.io/project-id1/firebase
    id: 'Deploy function2'
    args: ['deploy','--project=project-id2','--only=functions']

# And so on...

注意:将 project-id 更改为您的实际项目 ID。