两年前,我部署了一个包含多个Firebase云功能的项目,其中一些功能是通过使用数据库触发器来调用的,其中3个是通过使用“ functions.https.onCall…”触发器(“可调用的”功能)来调用的。
部署后一切正常,但是,在2019年10月左右,我不得不放弃该项目,并且我没有继续维护它。
当前,我有兴趣让该站点再次正常运行,因此我遵循了收到的电子邮件中列出的所有必要步骤,例如更新了node.js版本,firebase admin和functions版本,等等。上;但是,在重新部署功能之后,只有那些具有数据库触发器的功能似乎可以正常工作。 (请注意,这些功能自使用之日起并未进行任何修改。)
我在浏览器控制台上遇到无法使用的功能的错误是:
通过CORS策略阻止从源“ https://….com”获取“ https://…/ functionName”处的访问:不存在“ Access-Control-Allow-Origin”标头在请求的资源上。如果不透明的响应满足您的需求,请将请求的模式设置为“ no-cors”,以在禁用CORS的情况下获取资源。
在对我的步骤进行了一些测试和追溯之后,我已经能够精确地找出问题所在,但是,我还无法解决它。
基本上,我注意到自从我第一次部署项目以来,对GCP的权限处理方式已经发生了变化,因为我现在不得不添加防火墙规则,以便甚至能够运行以前使用的实例而无需这样做。因此,在我看来,很可能是防火墙本身阻止了功能连接到GCP上的虚拟机实例,从而阻止了功能运行时的完成并导致错误。
因此,我决定通过授予对实例的开放访问权限(通过指定0.0.0.0/0作为进入与虚拟机相关的目标标签的源IP范围)来对此进行测试,此后所有功能又再次完全发挥作用。
事实是,出于明显的原因,我确实不想保留对实例的开放访问权限,但是我无法通过任何其他方法建立成功的连接。
我阅读了以下页面:
访问控制: https://cloud.google.com/functions/docs/concepts/iam
配置网络设置: https://cloud.google.com/functions/docs/networking/network-settings
Cloud Functions IAM角色: https://cloud.google.com/functions/docs/reference/iam/roles#additional-configuration
另外: Firebase Functions to GCE firewall rule
然后,根据我的收集,我正在寻找的是设置防火墙规则,以便与该应用相关的服务帐户已启用权限。但是,我还没有这样做:
•首先,在防火墙规则详细信息中选择“指定目标标记”(就像我对IP范围所做的那样)将“服务帐户”禁用为源过滤器。
•将“网络中的所有实例”设置为目标,将“服务帐户”设置为源过滤器,并将“ App Engine默认服务帐户”(…@appspot.gserviceaccount.com)或“ firebase-adminsdk”设置为(firebase-adminsdk-…@ .... iam.gserviceaccount.com)作为“源服务帐户”;并未授予必要的权限,因为这些功能又回到了无法使用的状态。 对于最后一个选项,我什至遵循以下步骤: https://cloud.google.com/functions/docs/reference/iam/roles#additional-configuration 对于项目运行时服务帐户:…@appspot.gserviceaccount.com;但没有任何改变。
•最后,选择其他可用选项作为“源服务帐户”(Compute Engine默认服务帐户)也不会启用连接。
总之:完成此问题的唯一必要步骤是找到一种方法,该方法可以从Firebase云功能中调用GCP中的VM,而无需授予对所有IP的访问权限。只是功能(所以我假设管理员帐户相关?)。
以防万一:
在检查我的Firebase控制台设置后,我注意到我收到以下警告: “您的项目缺少用于Firebase Admin SDK的服务帐户” (尽管事实是,在项目的原始部署期间创建了一个项目。我将其称为firebase-adminsdk-A@proyect.iam.gserviceaccount.com)
因此,我经历了创建一个新帐户的过程:firebase-adminsdk-B@proyect.iam.gserviceaccount.com,并将密钥添加到功能中,但是,此新帐户未授予必要的权限在防火墙上。 此外,我现在在防火墙选项的“ firebase-adminsdk”下有两个firebase服务帐户:
firebase-adminsdk-A@proyect.iam.gserviceaccount.com
firebase-adminsdk-B@proyect.iam.gserviceaccount.com
在被选中后,都无法解决CORS问题。
我不知道是不是缺少在Firebase控制台上检测到第一个服务帐户的原因。
最后,如果这与某种意义相关:
我尝试了一些在网上找到的解决方案,例如检查“云功能调用程序”在云功能控制台上对功能的所有权限是否都设置为allUsers,然后重新部署所有功能;但这没什么区别。
(https://github.com/firebase/firebase-functions/issues/645#issuecomment-605835353) (https://cloud.google.com/functions/docs/securing/managing-access-iam#allowing_unauthenticated_function_invocation)
此外,阅读后:
https://firebase.google.com/docs/functions/callable
“警告:默认情况下,与版本低于7.7.0的任何Firebase CLI一起部署的新HTTP和HTTP可调用函数均为私有,并在调用时引发HTTP 403错误。在部署任何新功能之前,要么明确公开这些功能,要么更新Firebase CLI。”
我将Firebase CLI更新到最新版本,并再次重新部署了所有功能。
很抱歉,我认为文字问题似乎是相当具体的,因此我想尽可能详尽。 (Firebase支持无法为我提供解决方案)
谢谢。
答案 0 :(得分:0)
不确定我是否理解正确,但是我认为最简单的解决方案是使用VPC Serverles connector。
创建 VPC无服务器连接器时,诸如App Engine,Cloud Run和Cloud Functions等资源可以连接到VPC内部的资源,如VM。
根据我所读的内容,您在使用防火墙设置,服务帐户和所有其他内容时遇到了麻烦。因此,当您创建 VPC无服务器连接器(可以按照此guide创建一个)时,可以使用它使用其内部IP连接到VM,例如:>
假设您有2个具有内部IP 10.128.0.2
和10.128.0.3
的VM。然后,将CF use the VPC Serverless Connector设置为将流量输出到内部资源,您可以使用来自功能代码的VM的内部IP调用这些VM(在创建函数时,请记住使用Route only requests to private IPs through the VPC connector
,因此只有流量才能到达内部资源使用VPC。
对于防火墙,您只需要从创建时配置的 VPC无服务器连接器 CIDR授予访问权限。例如,如果使用10.8.0.0/28
,则只需授予在选定端口中该CIDR范围内对VM的访问权限(例如80
,8080
,443
或任何您需要使用的内容),则不必允许对您不理想的0.0.0.0/0
进行访问。
尝试一下,希望对您有所帮助:
答案 1 :(得分:0)