Google cloud platform 403调用fork()后,使用Python SDK将数据上载到Google存储时出错
我正试图在Linux主机(Ubuntu18.04)上使用PythonSDK在一个分叉进程中将内容上传到Google bucket 操作失败,状态代码403: google.api_core.exceptions.probled:403 POST:('Request failed with status code',403','Expected one of',) 示例代码: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
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密钥的身份验证,我执行了以下操作:
key.json
client=storage.client.from\u service\u account\u json(“key.json”)
它成功了。当我将服务帐户的角色更改为具有较少权限时,它没有给我一个与您类似的错误,只是它还告诉我,我使用的服务帐户没有
存储.bucket.get
访问该bucket。问题似乎与fork()无关
但需要使用服务帐户进行身份验证。没有fork()
,它对您有用吗
我运行了您的代码,并设法上传和读取了文件的内容,包括有无fork()
对于使用服务帐户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有一个“伪随机”数字生成器