在 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”