如何为Google Cloud Function以服务账号身份认证调用Google API?
在Google Cloud Function云端以服务账号身份认证Google Sheets API
好问题!在GCP上运行Cloud Function时,完全不需要像本地那样手动管理服务账号密钥文件——平台已经内置了更安全、更省心的认证机制,下面分两种常用场景给你讲清楚:
一、使用默认服务账号(最推荐)
这是GCP官方推荐的方式,安全又不用额外配置:
- 步骤1:获取默认服务账号邮箱
Cloud Function默认会使用项目的App Engine默认服务账号,格式是你的项目ID@appspot.gserviceaccount.com。你可以在GCP控制台的「IAM与管理 > 服务账号」页面找到它。 - 步骤2:给默认账号授权Sheet访问权限
打开你的目标Google Sheet,点击右上角「共享」,把上面的默认服务账号邮箱添加进去,权限设置为「编辑」(根据你的需求调整级别)。 - 步骤3:简化代码,移除本地认证逻辑
本地开发时你可能写了指定keyFilename的代码,但云端完全不需要。googleapis库会自动检测GCP运行环境的内置凭据,代码可以简化成这样:const { google } = require('googleapis'); const sheets = google.sheets({ version: 'v4' }); // 云端自动加载默认服务账号凭据,只需指定所需权限范围 const auth = new google.auth.GoogleAuth({ scopes: ['https://www.googleapis.com/auth/spreadsheets'], }); // 后续的写入逻辑和本地一致即可 async function writeToSheet() { const client = await auth.getClient(); const res = await sheets.spreadsheets.values.update({ auth: client, spreadsheetId: '你的表格ID', range: 'Sheet1!A1', valueInputOption: 'RAW', resource: { values: [['云端写入测试']] }, }); }
二、使用自定义服务账号(细粒度权限控制)
如果你的场景需要更严格的权限隔离,可以创建自定义服务账号:
- 步骤1:创建自定义服务账号
在GCP控制台「IAM与管理 > 服务账号」页面,点击「创建服务账号」,给它起个名字(比如sheets-writer),并授予必要的权限(比如Google Sheets API > 编辑者,或者更宽泛的编辑器权限)。 - 步骤2:授权Sheet访问权限
和上面一样,把自定义服务账号的邮箱添加到目标Sheet的共享列表里。 - 步骤3:部署函数时指定自定义账号
可以用gcloud命令行部署:
或者在GCP控制台部署时,找到「运行时服务账号」选项,选择你创建的自定义账号。gcloud functions deploy 你的函数名 \ --runtime nodejs20 \ --trigger-http \ --service-account 自定义账号邮箱@你的项目ID.iam.gserviceaccount.com - 步骤4:代码无需修改
同样不需要指定密钥文件,google.auth.GoogleAuth()会自动加载当前服务账号的凭据。
重要注意事项
- 绝对不要把本地的
dev-key.json上传到云端或者代码仓库,这会带来严重的安全风险!云端完全不需要密钥文件。 - 确保你的GCP项目已经启用了Google Sheets API:在控制台「API与服务 > 已启用的API」里搜索并启用它,否则函数会报错权限不足。
内容的提问来源于stack exchange,提问作者natevw




