如何在GCP中通过UI或Python API延长access token的有效期
GCP VM服务账号访问令牌过期问题解决方案
通过GCE元数据服务器获取的默认服务账号访问令牌有效期固定为3600秒,不支持直接修改
expires_in参数自定义延长,可通过以下方案解决长时训练场景的令牌过期问题:
方案1:实现令牌自动刷新逻辑(优先推荐)
无需额外配置,仅需在代码中封装令牌获取逻辑,在令牌即将过期时自动从元数据服务器拉取新的有效令牌,无权限配置和密钥泄露风险。
示例代码:
import requests import time class GCEMetadataTokenManager: def __init__(self, buffer_seconds=300): self.token = None self.expire_timestamp = 0 # 提前300秒刷新令牌,避免边界情况下的认证失败 self.refresh_buffer = buffer_seconds self.metadata_url = "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token" self.req_headers = {"Metadata-Flavor": "Google"} def get_valid_token(self): # 令牌已过期或即将过期时触发刷新 if time.time() > self.expire_timestamp - self.refresh_buffer: resp = requests.get(self.metadata_url, headers=self.req_headers) resp.raise_for_status() token_data = resp.json() self.token = token_data["access_token"] self.expire_timestamp = time.time() + token_data["expires_in"] return self.token # 调用示例 token_manager = GCEMetadataTokenManager() # 每次发起API请求前调用get_valid_token方法获取有效令牌 api_headers = { "Authorization": f"Bearer {token_manager.get_valid_token()}" }
方案2:使用服务账号密钥生成自定义有效期令牌
如果需要更长的单次令牌有效期,可使用服务账号密钥文件生成最长12小时(43200秒)的访问令牌,超出12小时的场景可搭配自动刷新逻辑使用。
示例代码:
from google.oauth2 import service_account import google.auth.transport.requests # 替换为你的服务账号密钥本地路径 SA_KEY_PATH = "/path/to/your-service-account-key.json" # TPU操作所需的权限范围 API_SCOPES = ["https://www.googleapis.com/auth/cloud-platform"] # 自定义有效期,最大值为43200秒(12小时) CUSTOM_EXPIRE_SECONDS = 43200 # 初始化凭证 credentials = service_account.Credentials.from_service_account_file( SA_KEY_PATH, scopes=API_SCOPES ) # 生成指定有效期的令牌 req = google.auth.transport.requests.Request() credentials.refresh(req, expires_in=CUSTOM_EXPIRE_SECONDS) # 获取令牌 access_token = credentials.token
方案3:使用GCP官方客户端库(最省事)
GCP官方提供的各服务SDK默认内置了令牌自动刷新逻辑,无需自行管理令牌的获取和刷新,直接调用对应接口即可。
关停TPU示例代码:
from google.cloud import tpu_v2 # 初始化客户端,自动处理认证逻辑 tpu_client = tpu_v2.TpuClient() # 替换为你的项目、可用区、TPU实例名称信息 project_id = "your-project-id" zone = "us-central1-a" tpu_node_name = "your-tpu-name" node_full_name = f"projects/{project_id}/locations/{zone}/nodes/{tpu_node_name}" # 发起删除TPU请求 delete_op = tpu_client.delete_node(name=node_full_name) # 等待操作完成 delete_op.result() print(f"TPU实例 {tpu_node_name} 已成功关停")
注意事项
- 方案1无需额外密钥,仅需VM绑定的服务账号拥有TPU操作权限即可,安全性最高
- 方案2需要妥善保管服务账号密钥文件,避免泄露造成安全风险
- 所有方案均无需修改GCP平台配置,元数据服务器返回的令牌固定有效期不可手动调整
内容的提问来源于stack exchange,提问作者user395882
相关产品推荐
相关产品推荐

