我有一些云功能。我也有一个nodejs服务器在AppEngine运行。我从那里调用我的云功能。目前我可以从任何地方打电话到我的云功能!
是否有任何方法我可以限制访问我的云功能,只有当从我的服务器上运行的谷歌应用程序引擎调用?
你有两个解决方案
- 第一个是使用一个服务帐户,描述为AndresMijares。但是,不是创造一个新的。实际上,如果您创建了一个新的服务帐户,并希望将其与app引擎一起使用,则需要生成一个服务帐户密钥文件,并将此密钥与代码一起部署。它不是很安全,因为你还需要安全地存储这个秘密等等。
所以,解决方案是使用App Engine默认的服务帐户,作为这个电子邮件模式
<project_ID>@appspot.gserviceaccount.com
在项目级调用的所有函数上授予此服务帐户为role/cloudfunctions.invoker
。
- 第二个解决方案没有第一个那么好,但它也是可能的。您可以更新您的云功能,并将入口参数设置为内部。这意味着只有来自项目中的vpc的流量才能到达云功能,包括项目的其他资源(如计算引擎)。→这就是为什么它不是一个很好的解决方案,但最终,云函数不能从任何地方调用。
因此,为了允许App engine使用您的VPC调用Cloud Function,您需要使用无服务器VPC连接器,将无服务器世界与您的VPC连接起来。除了安全性较差之外,此解决方案还涉及无服务器VPC连接器的额外成本。
第二个解决方案的优点是,您不必更新应用程序代码来执行对云函数的安全调用。您只能更新部署配置,并且只能在内部调用函数。
对于第一个解决方案,您需要更新代码以向请求的标头添加安全令牌。它类似于函数对函数的身份验证。我个人不喜欢这种实现方式,因为你不能在本地测试:本地没有元数据服务器!
我写了一篇文章,你可以从中得到灵感的部分"避免元数据服务器"。
编辑1
在深入研究了App Engine无服务器VPC连接器和这个答案之后,只可能达到一个"内部"入口。云功能(或云运行),具有云功能或云运行。App Engine不会在无服务器VPC连接器内部路由公共流量,因此第二种解决方案在App Engine情况下是不可能的。
有几种方法可以做到这一点。可以创建业务帐户IAM & Admin -> Services accounts
需要为该业务帐户申请Cloud Functions Invoker
角色,可通过gcloud cli配置。
gcloud beta functions add-iam-policy-binding YOUCLOUDFUNCTIONAME --member serviceAccount:NAME-OF-YOUR-SERVICE-ACCOUNT@project-name.iam.gserviceaccount.com --role roles/cloudfunctions.invoker --region YOUR-REGION
您将收到如下提示:
bindings:
- members:
- allUsers
- YOUR SERVICE ACCOUNT
理想情况下,您需要删除allUsers
角色。
gcloud beta functions remove-iam-policy-binding YOUFUNCTIONNAME --member allUsers --role roles/cloudfunctions.invoker --region us-central1
然后您需要确保您的AppEngine
实例可以访问您刚刚创建的服务帐户,这应该可以解决问题。请注意,根据您的情况,您可能需要更多的配置,但这可以为您提供一个良好的起点。