部署在多个地区的功能中,统一的代码库



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

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

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

问题是默认情况下函数转到"us-central "而不是firebase项目区域,所以指定区域的唯一方法似乎是在代码库等中使用。region("eu-west3")指定符。但是因为我想在所有项目中使用一个统一的代码库,所以在每个项目的基础上更改它有点麻烦。

关于如何最好地管理这个有什么建议吗?

您可以使用firebase functions:config:set:

将Region值存储为环境配置。
firebase functions:config:set env.region="us-central1" 

运行functions:config:set后,必须重新部署功能使新的配置可用。

然后使用以下代码获取函数中的环境变量:

exports.myFunction = functions
.region(functions.config.env.region)
.https.onRequest((req, res) => {
res.send("Hello");
});
有了这个,您不再需要更改代码中的区域。但是如果你想改变区域,你仍然需要在每个项目上改变配置和重新部署功能。

另一个解决方案是使用Cloud Build来自动化一切。我还没有完全测试过,但以下是我能想到的。

首先,按照如何使用Firebase构建器工具的说明进行操作。您需要这个社区提供的映像来在Cloud Build上运行Firebase CLI命令。完成后,请确保在项目上启用了以下API:

  1. 云资源管理器API
  2. Firebase Management 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。

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

config是一个函数,所以这个调整是必要的:

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

最新更新