如何以编程方式获取Google云运行API中的当前项目ID

AIK*_* DO 12 google-cloud-platform google-cloud-pubsub google-cloud-run

我有一个容器化的 API,并在 cloud run 内运行。如何获取正在执行云运行的当前项目 ID?我努力了:

  • 我在日志中的 textpayload 中看到它,但我不确定如何读取 post 函数内的 textpayload ?我收到的 pub sub 消息缺少此信息。
  • 我已经阅读了查询元数据 api 的内容,但不太清楚如何从 api 中再次执行此操作。有链接吗?

还有其他办法吗?

编辑:

经过下面的一些评论后,我最终在Cloud Run中运行的 .net API 中得到了这段代码。

        private string GetProjectid()
        {
            var projectid = string.Empty;
            try {
                var PATH = "http://metadata.google.internal/computeMetadata/v1/project/project-id";
                using (var client = new HttpClient())
                {
                    client.DefaultRequestHeaders.Add("Metadata-Flavor", "Google");
                    projectid = client.GetStringAsync(PATH).Result.ToString();
                }

                Console.WriteLine("PROJECT: " + projectid);
            }
            catch (Exception ex) {
                Console.WriteLine(ex.Message + " --- " + ex.ToString());
            }
            return projectid;
        }
Run Code Online (Sandbox Code Playgroud)

更新一下,可以用了 我的构建推送一直失败,但我没有看到。感谢大家。

Ste*_*ren 7

http://metadata.google.internal/computeMetadata/v1/project/project-id您可以通过发送带有标头的 GET 请求来获取项目 ID Metadata-Flavor:Google

请参阅此文档

以 Node.js 为例:

索引.js:

    const express = require('express');
    const axios = require('axios');
    const app = express();
    
    const axiosInstance = axios.create({
      baseURL: 'http://metadata.google.internal/',
      timeout: 1000,
      headers: {'Metadata-Flavor': 'Google'}
    });
    
    app.get('/', (req, res) => {
      let path = req.query.path || 'computeMetadata/v1/project/project-id';
      axiosInstance.get(path).then(response => {
        console.log(response.status)
        console.log(response.data);
        res.send(response.data);
      });
    });
    
    const port = process.env.PORT || 8080;
    app.listen(port, () => {
      console.log('Hello world listening on port', port);
    });
Run Code Online (Sandbox Code Playgroud)

包.json:


    {
      "name": "metadata",
      "version": "1.0.0",
      "description": "Metadata server",
      "main": "app.js",
      "scripts": {
        "start": "node index.js"
      },
      "author": "",
      "license": "Apache-2.0",
      "dependencies": {
        "axios": "^0.18.0",
        "express": "^4.16.4"
      }
    }
Run Code Online (Sandbox Code Playgroud)


Mat*_*off 6

其他人已经展示了如何通过 HTTP API 获取项目名称,但在我看来,这里更容易、更简单、更高效的做法是将项目 ID 设置为运行时环境变量。为此,当您部署该函数时:

gcloud functions deploy myFunction --set-env-vars PROJECT_ID=my-project-name
Run Code Online (Sandbox Code Playgroud)

然后你可以用如下代码访问它:

gcloud functions deploy myFunction --set-env-vars PROJECT_ID=my-project-name
Run Code Online (Sandbox Code Playgroud)

您只需为部署该函数的每个环境设置正确的值即可。这样做的一个非常小的缺点是需要为每个环境提供一次性命令行参数,而一个非常大的优点是不使您的函数依赖于成功验证和解析 API 响应。这还提供了代码可移植性,因为几乎所有托管环境都支持环境变量,包括本地开发环境。


ign*_*ant 5

@Steren 在 python 中的回答

import os

def get_project_id():
    # In python 3.7, this works
    project_id = os.getenv("GCP_PROJECT")

    if not project_id:  # > python37
        # Only works on runtime.
        import urllib.request

        url = "http://metadata.google.internal/computeMetadata/v1/project/project-id"
        req = urllib.request.Request(url)
        req.add_header("Metadata-Flavor", "Google")
        project_id = urllib.request.urlopen(req).read().decode()

    if not project_id:  # Running locally
        with open(os.environ["GOOGLE_APPLICATION_CREDENTIALS"], "r") as fp:
            credentials = json.load(fp)
        project_id = credentials["project_id"]

    if not project_id:
        raise ValueError("Could not get a value for PROJECT_ID")

    return project_id
Run Code Online (Sandbox Code Playgroud)