问题很简单。我需要 projectId 才能在 Google Cloud Function 中建立连接。我找到了 documentation 其中说,projectId 是可选参数,将从 GCLOUD_PROJECT 进行检查,但在部署的功能上它不起作用。
所以现在的问题是如何获取 projectId 环境变量以便将其作为数据存储连接实例的参数传递,或者应该做什么才能不传递此 id 并与 Google Cloud Function 内的数据存储建立连接?
更新1
我发现我实际上可以从 process.env.GCLOUD_PROJECT 获取变量,就像任何其他 env.variable 一样。 但是,知道是最后一个问题,是否真的可以在没有任何配置对象的情况下使用@google-cloud/datastore?
您可以获取项目 ID 为
const projectId = process.env.GCP_PROJECT
。
但由于某种原因,运行模拟器时未设置环境变量“GCP_PROJECT”。相反,应选择已弃用的变量名称“GCLOUD_PROJECT”。所以你可以尝试一下它们。
const projectId = process.env.GCP_PROJECT || process.env.GCLOUD_PROJECT
答案取决于您使用的运行时。 如果您使用 Python 3.7 和 Go 1.11,那么您很幸运。使用
process.env.GCP_PROJECT
如果使用任何新运行时,运气不好,要么访问元数据服务器,要么谷歌建议
注意:如果您的函数/应用程序需要以下环境变量之一 较旧的运行时,您可以在部署时设置变量 功能。例如:
gcloud functions deploy envVarMemory \
--runtime nodejs10 \
--set-env-vars FUNCTION_MEMORY_MB=2Gi \
--memory 2Gi \
--trigger-http
如果使用 terraform:
resource "google_cloudfunctions_function" "my-function" {
name = "my-function"
runtime = "nodejs16"
environment_variables = {
GCP_PROJECT = var.project_id
}
#...
}
在 Cloud Functions v2 公共预览版(2022 年 10 月)下,有一个名为“内置参数”的部分,允许使用“项目 ID”、“数据库 URL”和“存储桶”。 可能还会在此处列出位置 ID(“默认 GCP 资源位置”),尽管当前文档中没有该内容。
我没有让它发挥作用。但是,这确实:
require
环境变量。总是被定义的。仅当存在活动的 Firebase 项目时才定义
const firebaseConfig = JSON.parse( process.env.FIREBASE_CONFIG );
const locationId_maybe = firebaseConfig.locationId || null;
const projectId = firebaseConfig.projectId;
const databaseURL = firebaseConfig.databaseURL;
。这是有道理的,因为它需要访问云中的 GCP 项目。
Firebase CLI 11.15.0
正如我在更新 1 中所写,我们可以从
变量获取有关环境的所有信息。 关于 @google-cloud/datastore 的配置对象的第二个问题,它实际上可以在没有任何选项的情况下工作。它将尝试从环境变量中获取所有必需的参数。所以,由于我的代码中的错误,它不起作用。
对于 Python 3.9 及更高版本的运行时,您可以使用:
这需要安装
from google.auth import default
_, project_id = default()
。它可以通过使用元数据服务或加载服务帐户凭据来工作。
如果是 HTTP 函数,我们可以通过 URL 来找出当前项目和区域
google-cloud-core
如果您使用 Firebase,则可以使用
req.header('host')
firebase-admin
:
projectId
试试这个。
获取
// package.json
{
...
"firebase-admin": "^11.11.0",
...
}
projectId
对于节点 8 之后的任何运行时,您可以使用https://www.npmjs.com/package/gcp-metadata
const gcpMetadata = require('gcp-metadata');
export const getGCPProjectIdFromMetadata = async () => {
const isAvailable = await gcpMetadata.isAvailable();
if (!isAvailable) {
return undefined;
}
return gcpMetadata.project('project-id');
};
部署时,有:
firebase deploy