Google cloud platform 谷歌云存储403禁止使用服务帐户-在本地工作,但部署为云功能时不起作用

Google cloud platform 谷歌云存储403禁止使用服务帐户-在本地工作,但部署为云功能时不起作用,google-cloud-platform,google-cloud-functions,google-cloud-storage,Google Cloud Platform,Google Cloud Functions,Google Cloud Storage,我有一个脚本,它从第三方API提取数据并将其写入一个大的查询表。我每次执行时都会覆盖BQ表,以包含最新的数据,但我希望将历史数据存储在云存储中 我已经看到了关于这个错误的多个主题,但是我没有看到任何与我有相同问题的主题。我已授予服务帐户创建对象的权限,并且在本地运行该功能时,已成功将多个对象上载到bucket。然而,当我尝试将其部署为云函数(使用“测试函数”功能)时,我收到403禁止错误。云功能使用相同的服务帐户访问其他GCP服务(包括BQ)。我收到的错误是“请求失败,状态代码为”,403,“应

我有一个脚本,它从第三方API提取数据并将其写入一个大的查询表。我每次执行时都会覆盖BQ表,以包含最新的数据,但我希望将历史数据存储在云存储中

我已经看到了关于这个错误的多个主题,但是我没有看到任何与我有相同问题的主题。我已授予服务帐户创建对象的权限,并且在本地运行该功能时,已成功将多个对象上载到bucket。然而,当我尝试将其部署为云函数(使用“测试函数”功能)时,我收到403禁止错误。云功能使用相同的服务帐户访问其他GCP服务(包括BQ)。我收到的错误是“请求失败,状态代码为”,403,“应为”,308中的一个

下面是我的代码的相关部分的示例

def insert_stats(request):

    environment = os.environ.get('env', 'none')
    project_id="proj_id"

    #if dev environment obtain credentails locally, else retrieve from cloud funciton environment
    if(environment == 'dev'):
        credentials = service_account.Credentials.from_service_account_file(
        "path"
        )
        pandas_gbq.context.credentials = credentials
        secret_client = secretmanager.SecretManagerServiceClient(credentials=credentials)
        storage_client = storage.Client(project=project_id, credentials=credentials)
        
    elif environment=="prod":
        secret_client = secretmanager.SecretManagerServiceClient()
        logging_client = logging.Client()
        storage_client = storage.Client(project=project_id)
        logger = logging_client.logger("ingest_log")
我将env=dev设置为本地环境变量,并将env=prod设置为云函数

    #json_file = json.dumps(list, indent=4)
    
    #bucket = storage_client.bucket("bucket")
    #blob = bucket.blob("list_"+ str(rpt_strt.date()) + "_" + str(rpt_strt.hour) + "-00.json")
    #blob.upload_from_string(json_file)


任何帮助都将不胜感激。

首先,我不建议您在代码中使用if。特别是因为在本地和云中的行为是不同的,因为IF和you都有这种错误。要解决此问题,请创建一个环境变量
GOOGLE\u APPLICATION\u CREDENTIALS
设置为本地文件的路径。只保留一段产品代码。在本地测试它,当它工作时,它应该在云功能上工作感谢回复@guillaumeblaquiere。我以前在本地将其设置为环境变量时遇到问题,这就是为什么我一直在使用
service\u account.Credentials.from\u service\u account\u file
。我会再次尝试,但只是想检查一下,我会不会遇到同样的问题?也就是说,在本地,在VS中,我必须显式地声明凭据,而在云函数中,凭据是从正在使用的服务帐户推断出来的,而不是显式地声明。感谢您的帮助,我对使用gcp还不熟悉,所以非常感谢您提供的最佳实践建议。我。总之,当你避免存储秘密时,它会更好!我只发现了两个需要服务帐户密钥文件的用例。在你的情况下,你不需要一个!您好,我还认为检查有关此功能的文档会很好,如果您需要为云功能的服务帐户设置更多角色/权限,这会很有帮助。