Lambda部署的TypeScript代码上传GCS显示成功但无文件问题
问题描述
我使用TypeScript编写代码,通过服务账户JSON文件作为凭证将文件上传至GCS,代码部署在AWS Lambda中。测试时返回“上传成功”,但查看GCS服务器却未发现上传的文件,请问可能是什么原因导致的?
代码如下:
import { Storage } from '@google-cloud/storage' import { SSM } from 'aws-sdk' import fs from 'fs' import os from 'os' export async function uploadFileToGCS(filename: string, bucketName: string): Promise<any> { // GCSサービスアカウントの認証情報を指定します。 const serviceAccountCredentials = await getParameter() const credentials = JSON.parse(serviceAccountCredentials)[0] const projectId = 'my-project-id' const storage = new Storage({ projectId: projectId, credentials: credentials, }) const filePath = os.tmpdir() // Create CSV fs.writeFileSync(`${filePath}/${filename}`, '', { encoding: 'utf-8' }) // Write the file to the writable directory console.log(`CSV file "${filename}" has been created.`) try { const bucket = storage.bucket(bucketName) await bucket.upload(`${filePath}/${filename}`, { destination: filename, }) console.log(`File ${filename} uploaded to ${bucketName}.`) return Promise.resolve({ statusCode: 200, body: 'Successfully Uploaded', }) } catch (err) { console.error('Error uploading file:', err) return Promise.resolve({ statusCode: 500, body: 'Failed with Uploading', }) } }
我的预期是文件能成功上传至GCS服务器。
可能的原因及排查方向
- 服务账户权限配置问题:检查GCS服务账户是否同时拥有
storage.objects.create(上传权限)和storage.objects.list(查看权限)。如果仅配置了上传权限,文件实际已上传但你无法在控制台看到;若权限完全未配置正确,可能存在SDK静默处理的情况,导致上传未成功但代码返回“成功”。 - 凭证解析错误:代码中
JSON.parse(serviceAccountCredentials)[0]假设SSM返回的是数组并取第一个元素,但如果SSM存储的是单个完整的服务账户JSON对象,这会导致credentials结构错误。此时SDK可能未正确初始化,要么使用了Lambda的默认权限(若存在)上传到错误位置,要么上传失败但未触发catch块。建议添加日志打印credentials的具体内容,确认是否包含client_email、private_key等必要字段。 - 存储桶或项目ID不匹配:确认传入的
bucketName是否与你查看的GCS存储桶完全一致,projectId是否为该存储桶所属的项目ID,避免因跨项目上传导致文件不在预期位置。 - 空文件被隐藏:代码中创建的是空文件(写入内容为空字符串),部分GCS控制台界面可能默认隐藏空文件。可以通过
gsutil ls gs://<你的存储桶名称>命令直接查询,确认文件是否存在。 - 临时文件创建异常:虽然使用了Lambda允许的
os.tmpdir(),但仍需确认文件是否真的创建成功。可以添加代码console.log('临时文件是否存在:', fs.existsSync(${filePath}/${filename}))验证,避免因文件未创建成功导致上传了空内容或失败。 - GCS控制台缓存延迟:GCS控制台偶尔会有缓存,建议等待几分钟后刷新页面,或通过GCS API、CLI工具确认文件状态。
- SDK版本或静默bug:检查Lambda的CloudWatch日志,是否存在SDK内部的警告信息(未触发catch块的情况)。尝试升级
@google-cloud/storage到最新版本,避免旧版本的已知bug导致上传异常。
内容的提问来源于stack exchange,提问作者Mr.Yuu
相关产品推荐
相关产品推荐

