AIK*_* DO 12 google-cloud-platform google-cloud-pubsub google-cloud-run
我有一个容器化的 API,并在 cloud run 内运行。如何获取正在执行云运行的当前项目 ID?我努力了:
还有其他办法吗?
编辑:
经过下面的一些评论后,我最终在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)
更新一下,可以用了 我的构建推送一直失败,但我没有看到。感谢大家。
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)
其他人已经展示了如何通过 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 响应。这还提供了代码可移植性,因为几乎所有托管环境都支持环境变量,包括本地开发环境。
@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)
| 归档时间: |
|
| 查看次数: |
14766 次 |
| 最近记录: |