在 Google Cloud Function 中设置环境变量

Posted

技术标签:

【中文标题】在 Google Cloud Function 中设置环境变量【英文标题】:Setting environment variables in Google Cloud Function 【发布时间】:2018-05-28 10:27:00 【问题描述】:

我正在构建一个接受 POST 请求并将数据上传到 Google BigQuery 的小型 node.js 应用程序。

BigQuery 需要设置 GOOGLE_APPLICATION_CREDENTIALS,否则 BigQuery 将超时。如此处所述:https://cloud.google.com/docs/authentication/production

例如,在服务器启动时进行查询,如下所示:

GOOGLE_APPLICATION_CREDENTIALS=path/to/credentials.json DEBUG=* bin/www

在服务器启动时进行查询,如下所示会产生超时:

DEBUG=* bin/www

我已尝试使用以下 npm 包在脚本中设置环境变量:

"envs": "0.1.6",
"dotenv": "5.0.1"

并将它们设置为:

var envs = require('envs');
app.set('environment', envs('GOOGLE_APPLICATION_CREDENTIALS', 'path/to/credentials.json')); 

require('dotenv').config()

但是唉……

Google Cloud 功能不允许我指定任何环境变量,脚本部署逻辑都在幕后。我尝试在 Google Cloud Console 中找到配置文件,并考虑将其设置为全局环境变量,但我什至无法在该控制台中找到它。

有什么想法吗?

【问题讨论】:

【参考方案1】:

编辑 08/14/2018

没有设置环境变量的选项,但现在可以在 beta 模式下使用。只需在部署时使用下一个命令:

cloud beta functions deploy YOUR_FUNCTION_NAME --set-env-vars VAR1=foo,VAR2=bar FLAGS

编辑 11/22/2018(根据 Martin Omander 的建议)

如果这对您有意义,您也可以从您的 node.js 代码中设置它们: process.env.MY_VARIABLE = "it_works"

旧答案(解决与环境变量无关的实际问题)

不幸的是,与 AWS Lambda SCF 不同的是,它不支持设置环境变量,至少在某些显而易见的方面。

但在您的情况下,您实际上并不需要它。您需要在本地环境中使用 GOOGLE_APPLICATION_CREDENTIALS 进行测试,但在谷歌云功能上,只需设置项目 ID 就足够了,以防您使用 BigQuery npm

const BigQuery = require('@google-cloud/bigquery');

const projectId = 'project-id';

exports.testBigQuery = (req, res) => 

   const bigquery = new BigQuery(
       projectId: projectId,
   );


   bigquery
      .createDataset('test_set')
      .then(results => 
          const dataset = results[0];
          res.send(dataset.id);
      )
      .catch(err => 
          console.error('ERROR:', err);
      );
;

【讨论】:

您有多确定是这种情况?因为这正是我正在做的。 bigquery 和 Cloud Funcion 都是同一个项目的一部分,我遇到的超时错误与没有 GOOGLE_APPLICATION_CREDENTIALS 的本地测试时相同。 我敢肯定,因为我自己做了这件事,而且它对我有用,而无需手动设置任何凭据。我已经用我在 GCF 帐户上成功运行的实际测试代码更新了我的答案。您的超时可能是由其他问题引起的。你能分享你的功能的来源吗?此外,由于 GCF 是测试版,它们仍然有点原始,并且在某些情况下,删除您的功能并为您的帐户打开和关闭云功能可以解决此类问题。如果你的代码没问题,你应该试试。 我的代码应该没问题,已经使用了几个星期(只是解析位置数据并转发它的代理),刚刚将其移至 GCF。当然,我可以分享它,但是在这里的 cmets 部分这样做有点奇怪。谢谢,我会尝试将其关闭并重新打开! 更新:在创建一个新函数并将 bigquery 初始化移动到导出后,它似乎正在工作。插入了行,但是在完成后仍然会超时 太棒了!由于正在插入行,因此看起来超时不是由 BigQuery 引起的,因此它可能是由函数未正确退出引起的。您需要明确结束函数执行。在我的示例中,它是通过使用 res 对象返回 dataset.id 来完成的: res.send(dataset.id);你也可以使用 .end() 方法

以上是关于在 Google Cloud Function 中设置环境变量的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python 中运行 Google Cloud Function 中的子进程

从 Cloud Function (python) 写入 Google Cloud Storage

在 Google Cloud Function 中设置环境变量

Google Cloud Function - ImportError:无法从“google.cloud”(未知位置)导入名称“pubsub”

如何从 Firebase Cloud Function 在 Google Pub/Sub 中发布消息?

无法在安全的Google Cloud Function上获得CORS错误