Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

trying to find the current project id of the deployed python function in google cloud gives error

I have deployed a python 3.7 function in google cloud. I need to get the project-id through code to find out where it is deployed.

I write a small python 3.7 script and test it through google shell command line

import urllib
import urllib.request
url="http://metadata.google.internal/computeMetadata/v1/project/project-id"
x=urllib.request.urlopen(url)
with x as response:
 x.read()

Unfortunately this gives me only b'' as response. I am not getting the project id though I have set it using

gcloud config set project my-project

Can anyone please help as I am new to google cloud and python? Thanks.

This is an additional issue below: issue 2:

In my local system I have installed gcloud and if I run the above python3.7 script from there

x=urllib.request.urlopen(url) #this line

I am getting this exception from the line above:

Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/urllib/request.py", line 1350, in do_open
    h.request(req.get_method(), req.selector, req.data, headers,
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/http/client.py", line 1240, in request
    self._send_request(method, url, body, headers, encode_chunked)
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/http/client.py", line 1286, in _send_request
    self.endheaders(body, encode_chunked=encode_chunked)
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/http/client.py", line 1235, in endheaders
    self._send_output(message_body, encode_chunked=encode_chunked)
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/http/client.py", line 1006, in _send_output
    self.send(msg)
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/http/client.py", line 946, in send
    self.connect()
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/http/client.py", line 917, in connect
    self.sock = self._create_connection(
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/socket.py", line 787, in create_connection
    for res in getaddrinfo(host, port, 0, SOCK_STREAM):
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/socket.py", line 918, in getaddrinfo
    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
socket.gaierror: [Errno 8] nodename nor servname provided, or not known

The below changes as suggested by the answer also gives me empty string

enter image description here

like image 816
user1403505 Avatar asked Dec 01 '20 09:12

user1403505


Video Answer


1 Answers

In the Python 3.7 runtime, you can get the project ID via an environment variable:

import os
project_id = os.environ['GCP_PROJECT']

In future runtimes, this environment variable will be unavailable, and you'll need to get the project ID from the metadata server:

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()

Running this locally will produce an error because your local machine can't resolve the http://metadata.google.internal URL -- this is only available to deployed functions.

like image 190
Dustin Ingram Avatar answered Sep 21 '22 23:09

Dustin Ingram