问题描述
我有一个相当简单的要求,因为我需要多个区域中 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:
- 云资源管理器 API
- 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。