如何在Google Cloud Function中配置Kaggle API密钥使其可被识别?
解决Google Cloud Function中Kaggle API无法找到密钥的问题
核心问题排查与解决方案
1. 优先使用环境变量认证(最可靠,避免文件路径问题)
Kaggle API支持直接通过环境变量KAGGLE_USERNAME和KAGGLE_KEY完成认证,无需依赖kaggle.json文件,这是在Serverless环境下最稳妥的方式:
import os import json from google.cloud import secretmanager def access_secret_version(project_id, secret_id, version_id="latest"): client = secretmanager.SecretManagerServiceClient() name = f"projects/{project_id}/secrets/{secret_id}/versions/{version_id}" response = client.access_secret_version(request={"name": name}) return response.payload.data.decode("UTF-8") def main(event, context): # 替换为你的项目ID和Secret名称 project_id = "your-project-id" secret_id = "kaggle-api-key" # 从Secret Manager读取密钥内容 kaggle_secret = access_secret_version(project_id, secret_id) kaggle_config = json.loads(kaggle_secret) # 设置Kaggle认证环境变量 os.environ["KAGGLE_USERNAME"] = kaggle_config["username"] os.environ["KAGGLE_KEY"] = kaggle_config["key"] # 必须在设置环境变量后再导入kaggle模块 import kaggle # 执行数据集下载 kaggle.api.dataset_download_files("your-dataset-name", path="/tmp", unzip=True) # 后续上传至GCS的代码...
2. 若坚持使用kaggle.json文件,需修正以下问题
如果一定要用文件方式认证,你可能踩了这几个坑:
(1)环境变量设置时机错误
Kaggle模块在导入时就会读取配置路径,如果你的代码先导入kaggle再设置KAGGLE_CONFIG_DIR,环境变量的修改不会生效。必须先完成环境变量和文件准备,再导入kaggle:
import os import json def prepare_kaggle_config(): # 读取挂载的密钥文件 with open("/.kaggle/kaggle.json", 'r') as f: kaggle_api_key = f.read().strip() # 写入/tmp目录 tmp_config_path = "/tmp/kaggle.json" with open(tmp_config_path, 'w') as f: json.dump(json.loads(kaggle_api_key), f) # 关键:设置文件权限为600,Kaggle要求配置文件不能被其他用户读取 os.chmod(tmp_config_path, 0o600) # 设置配置目录环境变量 os.environ["KAGGLE_CONFIG_DIR"] = "/tmp" def main(event, context): # 先准备配置 prepare_kaggle_config() # 再导入kaggle import kaggle # 执行下载操作 kaggle.api.dataset_download_files("your-dataset-name", path="/tmp", unzip=True)
(2)Secret挂载路径错误
检查Cloud Function的Secret挂载配置:确保挂载的是文件路径/.kaggle/kaggle.json,而非目录/.kaggle。如果挂载到目录,密钥内容会被存放在目录下以Secret名称命名的文件中,而非kaggle.json,导致API找不到文件。
(3)文件权限不符合要求
Kaggle API要求kaggle.json的权限必须为600(仅所有者可读可写),否则会拒绝读取。务必在写入文件后执行os.chmod(tmp_config_path, 0o600)。
内容的提问来源于stack exchange,提问作者Sean MacInnis
相关产品推荐
相关产品推荐

