Google cloud platform 403调用fork()后,使用Python SDK将数据上载到Google存储时出错

Google cloud platform 403调用fork()后,使用Python SDK将数据上载到Google存储时出错,google-cloud-platform,google-cloud-storage,fork,python-3.6,Google Cloud Platform,Google Cloud Storage,Fork,Python 3.6,我正试图在Linux主机(Ubuntu18.04)上使用PythonSDK在一个分叉进程中将内容上传到Google bucket 操作失败,状态代码403: google.api_core.exceptions.probled:403 POST:('Request failed with status code',403','Expected one of',) 示例代码: import random import string import json import os import requ

我正试图在Linux主机(Ubuntu18.04)上使用PythonSDK在一个分叉进程中将内容上传到Google bucket 操作失败,状态代码403:

google.api_core.exceptions.probled:403 POST:('Request failed with status code',403','Expected one of',)

示例代码:

import random
import string
import json
import os
import requests
from datetime import datetime, timedelta
from google.cloud import storage

def upload_to_bucket(plainText):
    gcp_client = storage.Client.from_service_account_json("/path/to/google-bucket-credentials.json")
    bucket = gcp_client.get_bucket('bucket_name')
    bucket_file_name = random_file_name('json', 10)
    blob = bucket.blob(bucket_file_name)
    blob.upload_from_string(plainText)
    url = blob.generate_signed_url(expiration=datetime.utcnow() + timedelta(hours=48), method="GET")
    return url

def random_file_name(ext, length):
    return "%s.%s" % (''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(length)), ext)


if __name__ == "__main__":
    os.fork()
    url = upload_to_bucket("just for test")
    res = requests.get(url)
    print(res.content.decode('utf8'))
我尝试过使用中提供的解决方案,但没有锁定


如何解决这个问题?

问题似乎不在于
fork()
,而在于服务帐户的身份验证。没有
fork()
,它对您有用吗

我运行了您的代码,并设法上传和读取了文件的内容,包括有无
fork()

对于使用服务帐户json密钥的身份验证,我执行了以下操作:

  • 转到控制台->IAM和管理->服务帐户->创建服务帐户
  • 授予它存储->存储管理员角色
  • 创建密钥(json)并将其保存在与我的代码位于同一文件夹中的文件
    key.json
  • 通过读取文件
    client=storage.client.from\u service\u account\u json(“key.json”)

  • 它成功了。当我将服务帐户的角色更改为具有较少权限时,它没有给我一个与您类似的错误,只是它还告诉我,我使用的服务帐户没有
    存储.bucket.get
    访问该bucket。

    问题似乎与
    fork()无关
    但需要使用服务帐户进行身份验证。没有
    fork()
    ,它对您有用吗

    我运行了您的代码,并设法上传和读取了文件的内容,包括有无
    fork()

    对于使用服务帐户json密钥的身份验证,我执行了以下操作:

  • 转到控制台->IAM和管理->服务帐户->创建服务帐户
  • 授予它存储->存储管理员角色
  • 创建密钥(json)并将其保存在与我的代码位于同一文件夹中的文件
    key.json
  • 通过读取文件
    client=storage.client.from\u service\u account\u json(“key.json”)

  • 它成功了。当我将服务帐户的角色更改为具有较少权限时,它没有给我一个与您类似的错误,只是它还告诉我,我使用的服务帐户没有存储.bucket。获取对该bucket的访问权。

    毫不奇怪,我是问题的根源。 分叉进程后,
    random\u file\u name
    创建的随机文件名是相同的(可能与种子的生成方式有关) 由于该帐户没有覆盖该文件的权限,因此会收到403响应

    如果我将
    random\u file\u name
    更改为:

    def random_file_name(ext, length):
        import uuid
        return  str(uuid.uuid4())[0:length]+"."+ext
    
    一切如期进行


    如果@TasosZG不建议使用云shell,我可能仍在寻找解决方案。

    毫不奇怪,我是问题的根源。 分叉进程后,
    random\u file\u name
    创建的随机文件名是相同的(可能与种子的生成方式有关) 由于该帐户没有覆盖该文件的权限,因此会收到403响应

    如果我将
    random\u file\u name
    更改为:

    def random_file_name(ext, length):
        import uuid
        return  str(uuid.uuid4())[0:length]+"."+ext
    
    一切如期进行


    如果@TasosZG不建议使用云shell,我可能仍在寻找解决方案。

    当我注释fork()时,它是有效的。如果只有一个分叉进程尝试上载,它甚至可以工作。您是从linux主机还是windows主机上尝试的?我可能应该在一开始就说这个问题来自Linux——它不会在windows上重现(我认为python fork并没有真正在windows上实现),而且,我很确定这个问题与SDK使用的某个加密库有关,该库不能与fork一起使用。@ErezBenHarush我在linux计算引擎VM和云Shell中尝试过它。我使用的库版本是这个
    谷歌云存储==1.13.2
    。您使用的是哪个版本?你试过云Shell吗?我刚用最新版本(1.15.0)试过,它又成功了。我从零开始。使用Ubuntu19.04创建虚拟机,设置,安装库,复制密钥并运行代码。您是否可以尝试从其他环境(如计算引擎虚拟机或云Shell)查看它是否有效?首先,我感谢您的帮助。我使用的是谷歌云存储=1.15.0。在使用google cloud storage=1.14.0的cloud shell上,当我注释掉fork()时,它也会失败(失败是指从一个fork进程上传是可以的,第二个是403)。如果只有一个分叉进程尝试上载,它甚至可以工作。您是从linux主机还是windows主机上尝试的?我可能应该在一开始就说这个问题来自Linux——它不会在windows上重现(我认为python fork并没有真正在windows上实现),而且,我很确定这个问题与SDK使用的某个加密库有关,该库不能与fork一起使用。@ErezBenHarush我在linux计算引擎VM和云Shell中尝试过它。我使用的库版本是这个
    谷歌云存储==1.13.2
    。您使用的是哪个版本?你试过云Shell吗?我刚用最新版本(1.15.0)试过,它又成功了。我从零开始。使用Ubuntu19.04创建虚拟机,设置,安装库,复制密钥并运行代码。您是否可以尝试从其他环境(如计算引擎虚拟机或云Shell)查看它是否有效?首先,我感谢您的帮助。我使用的是谷歌云存储=1.15.0。它在使用google cloud storage=1.14.0的cloud shell上也会失败(失败的意思是从一个分叉进程上传是可以的,第二个是403)。Python有一个“伪随机”数字生成器