You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 02:43:22