如何在 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
  }
  #...
}