Cloud Functions部署中没有GOOGLE_APPLICATION_CREDENTIALS

时间:2020-05-25 23:10:32

标签: google-cloud-platform google-cloud-functions google-cloud-iam

我有一个Cloud Function,可以与Cloud Storage和BigQuery交互,它们都属于同一个项目。从命令行部署Cloud Function时,通常遵循的方式是:

$ gcloud functions deploy my_function ... --set-env-vars GOOGLE_APPLICATION_CREDENTIALS=my_project_credentials.json

my_project_credentials.json是一个json密钥文件,其中包含服务帐户和密钥,以允许访问Cloud Storage和BigQuery。

因为这是我此后的工作方式,所以我需要另一种方式来完全避免使用此JSON凭证文件(因为这些交互服务始终属于同一Google Cloud项目)。有这种方法吗?我对Google Cloud有点陌生,所以我对IAM的来龙去脉并不熟悉。

(我需要这样做的另一个原因是,我有一个不满意我的客户端的开发人员可以访问该json密钥,并且他/她不希望将json密钥与功能代码一起部署。请提供一些有关如何在IAM中进行此操作的详细信息,尤其是BigQuery和Cloud Storage,因为我也无法控制IAM。

2 个答案:

答案 0 :(得分:2)

在可能的情况下,至少在应用程序在GCP上运行时,不得使用服务帐户密钥文件。 2个原因

  • 这是用于身份验证的简单文件:您可以轻松地将其复制,通过电子邮件发送,甚至将其提交到您的代码存储库中,也许是公开的!
  • 这是个秘密,您必须安全地存储它并经常轮换使用(Google建议至少每90天一次)。很难管理,您想每隔90天使用新闻安全文件重新部署功能!

所以,我的同伴Gabe和Kolban拥有权利。使用功能标识:

  • 在部署功能时,您都可以指定服务帐户电子邮件
  • 或者将使用默认的服务帐户(这是计算引擎中的一个,默认情况下具有编辑者角色。不是很安全,请使用第一个解决方案)

在您的代码中,使用getDefaultCredential(根据语言,名称略有变化,但含义相同)。如果您查看源代码,将会发现该函数可以执行此操作

  • 查看GOOGLE_APPLICATION_CREDENTIALS环境变量是否存在。如果是这样,请使用
  • 查看“知名文件”是否存在。根据操作系统,并且在执行gcloud auth application-default login时,凭据将存储在本地的其他位置。图书馆在寻找他们。
  • 查看是否为the metadata server exists。此链接参考计算引擎,但其他环境遵循相同的原理。

没有“魔术”的东西。元数据服务器知道功能的身份,并可以按需生成访问和身份令牌。如果您的代码在GCP上运行,这些库将实现对它的调用-> 这就是为什么,您永远不需要服务帐户密钥文件,元数据服务器在这里为您提供此信息!

答案 1 :(得分:1)

科尔班说的话。部署Cloud Function时,您可以定义要使用的服务帐户,然后所有使用“应用程序默认凭据”的API调用将自动使用该服务帐户,而无需服务帐户承载令牌(json文件)。在此处查看文档:

https://cloud.google.com/docs/authentication/production#auth-cloud-implicit-nodejs