运行Google Cloud Vision快速入门时遇google.auth.exceptions.TransportError错误
Google Cloud Vision在Colab调用时的认证错误解决方案
错误信息
ERROR:grpc._plugin_wrapping:AuthMetadataPluginCallback "<google.auth.transport.grpc.AuthMetadataPlugin object at 0x7fc1f3f66350>" raised exception! Traceback (most recent call last): File "/usr/local/lib/python3.7/dist-packages/google/auth/compute_engine/credentials.py", line 111, in refresh self._retrieve_info(request) File "/usr/local/lib/python3.7/dist-packages/google/auth/compute_engine/credentials.py", line 88, in _retrieve_info request, service_account=self._service_account_email File "/usr/local/lib/python3.7/dist-packages/google/auth/compute_engine/_metadata.py", line 234, in get_service_account_info return get(request, path, params={"recursive": "true"}) File "/usr/local/lib/python3.7/dist-packages/google/auth/compute_engine/_metadata.py", line 187, in get response, google.auth.exceptions.TransportError: ("Failed to retrieve http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/?recursive=true from the Google Compute Enginemetadata service. Status: 404 Response:\nb''", <google.auth.transport.requests._Response object at 0x7fc1fb046910>) The above exception was the direct cause of the following exception: Traceback (most recent call last): File "/usr/local/lib/python3.7/dist-packages/grpc/_plugin_wrapping.py", line 90, in __call__ context, _AuthMetadataPluginCallback(callback_state, callback)) File "/usr/local/lib/python3.7/dist-packages/google/auth/transport/grpc.py", line 101, in __call__ callback(self._get_authorization_headers(context), None) File "/usr/local/lib/python3.7/dist-packages/google/auth/transport/grpc.py", line 88, in _get_authorization_headers self._request, context.method_name, context.service_url, headers File "/usr/local/lib/python3.7/dist-packages/google/auth/credentials.py", line 133, in before_request self.refresh(request) File "/usr/local/lib/python3.7/dist-packages/google/auth/compute_engine/credentials.py", line 117, in refresh six.raise_from(new_exc, caught_exc) File "<string>", line 3, in raise_from google.auth.exceptions.RefreshError: ("Failed to retrieve http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/?recursive=true from the Google Compute Enginemetadata service. Status: 404 Response:\nb''", <google.auth.transport.requests._Response object at 0x7fc1fb046910>) --------------------------------------------------------------------------- _InactiveRpcError Traceback (most recent call last) /usr/local/lib/python3.7/dist-packages/google/api_core/grpc_helpers.py in error_remapped_callable(*args, **kwargs) 71 try: ---> 72 return callable_(*args, **kwargs) 73 except grpc.RpcError as exc: 7 frames _InactiveRpcError: <_InactiveRpcError of RPC that terminated with: status = StatusCode.UNAVAILABLE details = "Getting metadata from plugin failed with error: ("Failed to retrieve http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/?recursive=true from the Google Compute Enginemetadata service. Status: 404 Response:\nb''", <google.auth.transport.requests._Response object at 0x7fc1fb046910>)" debug_error_string = "UNKNOWN:Error received from peer vision.googleapis.com:443 {grpc_message:"Getting metadata from plugin failed with error: (\"Failed to retrieve http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/?recursive=true from the Google Compute Enginemetadata service. Status: 404 Response:\\nb''\\", <google.auth.transport.requests._Response object at 0x7fc1fb046910>)", grpc_status:14, created_time:"2022-09-13T14:48:30.187999422+00:00"}" > The above exception was the direct cause of the following exception: ServiceUnavailable Traceback (most recent call last) /usr/local/lib/python3.7/dist-packages/google/api_core/grpc_helpers.py in error_remapped_callable(*args, **kwargs) 72 return callable_(*args, **kwargs) 73 except grpc.RpcError as exc: ---> 74 raise exceptions.from_grpc_error(exc) from exc 75 76 return error_remapped_callable ServiceUnavailable: 503 Getting metadata from plugin failed with error: ("Failed to retrieve http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/?recursive=true from the Google Compute Enginemetadata service. Status: 404 Response:\nb''", <google.auth.transport.requests._Response object at 0x7fc1fb046910>)
执行代码
#connect to google drive from google.colab import drive drive.mount('/content/drive') #download and extract google cloud client !curl -O https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-cli-401.0.0-linux-x86_64.tar.gz !tar -xf google-cloud-cli-401.0.0-linux-x86_64.tar.gz #set credentials environment variable !export GOOGLE_APPLICATION_CREDENTIALS=/content/drive/MyDrive/imagelabeling-1663076432940-26cfebd304cf.json #install and init google cloud !./google-cloud-sdk/install.sh --usage-reporting False --quiet !./google-cloud-sdk/bin/gcloud init #install google-cloud-vision libraries !pip install --upgrade google-cloud-vision #download cat image !wget https://raw.githubusercontent.com/googleapis/python-vision/master/samples/snippets/quickstart/resources/wakeupcat.jpg #run labeling code import io import os # Imports the Google Cloud client library from google.cloud import vision # Instantiates a client client = vision.ImageAnnotatorClient() # The name of the image file to annotate file_name = os.path.abspath('/content/wakeupcat.jpg') # Loads the image into memory with io.open(file_name, 'rb') as image_file: content = image_file.read() image = vision.Image(content=content) # Performs label detection on the image file response = client.label_detection(image=image) labels = response.label_annotations print('Labels:') for label in labels: print(label.description)
已完成的操作
- 执行
gcloud init时选择重新初始化默认配置,通过网页登录谷歌账号并选择对应测试项目 - 测试项目已启用计费和Vision API
- 创建了拥有Owner角色的服务账号,并生成JSON密钥文件,已挂载到Colab的Drive路径中
问题原因及修复方案
错误核心是**GOOGLE_APPLICATION_CREDENTIALS环境变量未在Python运行环境中生效**——用!export设置的变量只作用于当前shell进程,不会传递到后续执行Python代码的进程,导致Vision客户端尝试从Colab元数据服务获取认证信息(Colab环境无默认服务账号元数据),从而抛出404错误。
修复步骤
替换环境变量设置方式
用Python的os.environ直接设置变量,确保能被Vision客户端读取。把原来的!export GOOGLE_APPLICATION_CREDENTIALS=...替换为:import os os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = '/content/drive/MyDrive/imagelabeling-1663076432940-26cfebd304cf.json'这段代码必须放在
from google.cloud import vision之前执行。可选:简化gcloud操作
Colab预装了gcloud CLI,无需手动下载安装。可以去掉下载、解压gcloud的步骤,改用服务账号直接激活:!gcloud auth activate-service-account --key-file=/content/drive/MyDrive/imagelabeling-1663076432940-26cfebd304cf.json !gcloud config set project 你的项目ID
修改后的完整代码
from google.colab import drive drive.mount('/content/drive') # 设置环境变量(关键修复) import os os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = '/content/drive/MyDrive/imagelabeling-1663076432940-26cfebd304cf.json' # 验证环境变量路径 print("Credentials path:", os.environ.get('GOOGLE_APPLICATION_CREDENTIALS')) # 安装依赖 !pip install --upgrade google-cloud-vision # 下载测试图片 !wget https://raw.githubusercontent.com/googleapis/python-vision/master/samples/snippets/quickstart/resources/wakeupcat.jpg # 调用Vision API import io from google.cloud import vision client = vision.ImageAnnotatorClient() file_name = os.path.abspath('/content/wakeupcat.jpg') with io.open(file_name, 'rb') as image_file: content = image_file.read() image = vision.Image(content=content) response = client.label_detection(image=image) labels = response.label_annotations print('Labels:') for label in labels: print(label.description)
内容的提问来源于stack exchange,提问作者matthias_buehlmann
相关产品推荐
相关产品推荐

