Cloud Functions 部署中没有 GOOGLE_APPLICATION_CREDENTIALS

No GOOGLE_APPLICATION_CREDENTIALS in Cloud Functions deployment

我有一个与 Cloud Storage 和 BigQuery 交互的 Cloud Function,它们都属于同一个项目。从命令行部署 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云项目)。有这样的方法吗?我对 Google Cloud 有点陌生,所以我不熟悉 IAM 的来龙去脉。

(我需要这个的另一个原因是,我有一个客户不喜欢我作为开发人员可以访问那个 json 密钥并且 he/she 不想要json 密钥与函数代码一起部署。请提供一些详细信息,说明如何在 IAM 中执行此操作,尤其是 BigQuery 和 Cloud Storage,因为我也无法控制 IAM。

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

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

如果可以,至少在 GCP 上应用 运行 时,不得使用服务帐户密钥文件。 2 个原因

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

所以,我的同事 Gabe 和 Kolban 是对的。使用函数标识:

  • 或者您在部署函数时指定服务帐户电子邮件
  • 或者使用默认的服务账号(这个是计算引擎,默认是编辑角色,不太安全,首选第一种方案)

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

  • 查看 GOOGLE_APPLICATION_CREDENTIALS 环境变量是否存在。如果有,就用它
  • 查看 "well known file" 是否存在。根据 OS,当您执行 gcloud auth application-default login 时,凭据存储在本地的不同位置。图书馆找他们。
  • 看看the metadata server exists。此 link 参考计算引擎,但其他环境遵循相同的原则。

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