如何在 Google Cloud Functions 中获取当前的 projectId?
How can I get current projectId inside Google Cloud Functions?
问题很简单。我需要 projectId 才能在 Google 云函数中建立连接。我在 documentation 中找到了它所说的 projectId 是可选参数,将从 GCLOUD_PROJECT 进行检查,但在已部署的函数上它不起作用。
所以现在的问题是如何获取 projectId env 变量以便将其作为数据存储连接实例的参数传递,或者应该怎么做才能不传递此 ID 并与内部数据存储建立连接 Google 云函数?
更新 1
我发现我实际上可以从 process.env.GCLOUD_PROJECT 获取变量,就像任何其他 env.variable 一样。
但是,知道是最后一个问题,是否可以在没有任何配置对象的情况下使用 @google-cloud/datastore?
正如我在更新 1 中所写,我们可以从 process.env 变量中获取有关环境的所有信息。
关于@google-cloud/datastore的配置对象的第二个问题,它实际上可以在没有任何选项的情况下工作。它将尝试从环境变量中获取所有必需的参数。所以,由于我的代码中的错误,它没有工作。
您可以获得项目 ID const projectId = process.env.GCP_PROJECT
。
但由于某种原因,当 运行 模拟器时,未设置环境变量“GCP_PROJECT”。相反,已弃用的变量名称“GCLOUD_PROJECT”是 select 的名称。所以你可以两个都试试。
const projectId = process.env.GCP_PROJECT || process.env.GCLOUD_PROJECT
当 与 firebase deploy
一起部署时,有:
functions.config().firebase.projectId
functions.config().firebase.databaseURL
functions.config().firebase.storageBucket
functions.config().firebase.locationId
对于节点 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');
};
这也适用于您希望启动的任何其他实例(例如应用引擎)。
答案取决于您使用的运行时。
如果您使用 Python 3.7 和 Go 1.11,那么您很幸运。使用
process.env.GCP_PROJECT
如果使用任何 new runtimes, bad luck, either access the metadata server, or google suggests
Note: If your function/app requires one of the environment variables from
an older runtime, you can set the variable when deploying your
function. For example:
gcloud functions deploy envVarMemory \
--runtime nodejs10 \
--set-env-vars FUNCTION_MEMORY_MB=2Gi \
--memory 2Gi \
--trigger-http
如果使用地形:
resource "google_cloudfunctions_function" "my-function" {
name = "my-function"
runtime = "nodejs16"
environment_variables = {
GCP_PROJECT = var.project_id
}
#...
}
问题很简单。我需要 projectId 才能在 Google 云函数中建立连接。我在 documentation 中找到了它所说的 projectId 是可选参数,将从 GCLOUD_PROJECT 进行检查,但在已部署的函数上它不起作用。
所以现在的问题是如何获取 projectId env 变量以便将其作为数据存储连接实例的参数传递,或者应该怎么做才能不传递此 ID 并与内部数据存储建立连接 Google 云函数?
更新 1
我发现我实际上可以从 process.env.GCLOUD_PROJECT 获取变量,就像任何其他 env.variable 一样。 但是,知道是最后一个问题,是否可以在没有任何配置对象的情况下使用 @google-cloud/datastore?
正如我在更新 1 中所写,我们可以从 process.env 变量中获取有关环境的所有信息。
关于@google-cloud/datastore的配置对象的第二个问题,它实际上可以在没有任何选项的情况下工作。它将尝试从环境变量中获取所有必需的参数。所以,由于我的代码中的错误,它没有工作。
您可以获得项目 ID const projectId = process.env.GCP_PROJECT
。
但由于某种原因,当 运行 模拟器时,未设置环境变量“GCP_PROJECT”。相反,已弃用的变量名称“GCLOUD_PROJECT”是 select 的名称。所以你可以两个都试试。
const projectId = process.env.GCP_PROJECT || process.env.GCLOUD_PROJECT
当 与 firebase deploy
一起部署时,有:
functions.config().firebase.projectId
functions.config().firebase.databaseURL
functions.config().firebase.storageBucket
functions.config().firebase.locationId
对于节点 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');
};
这也适用于您希望启动的任何其他实例(例如应用引擎)。
答案取决于您使用的运行时。 如果您使用 Python 3.7 和 Go 1.11,那么您很幸运。使用
process.env.GCP_PROJECT
如果使用任何 new runtimes, bad luck, either access the metadata server, or google suggests
Note: If your function/app requires one of the environment variables from an older runtime, you can set the variable when deploying your function. For example:
gcloud functions deploy envVarMemory \
--runtime nodejs10 \
--set-env-vars FUNCTION_MEMORY_MB=2Gi \
--memory 2Gi \
--trigger-http
如果使用地形:
resource "google_cloudfunctions_function" "my-function" {
name = "my-function"
runtime = "nodejs16"
environment_variables = {
GCP_PROJECT = var.project_id
}
#...
}