调用 fork() 后使用 Python SDK 将数据上传到 Google Storage 时出现 403 错误

Ere*_*ush 1 fork google-cloud-storage google-cloud-platform python-3.6

我正在尝试在 Linux 主机 (Ubuntu 18.04) 上的分叉进程中使用 Python SDK 将内容上传到 Google 存储桶操作失败,状态代码为 403:

google.api_core.exceptions.Forbidden: 403 POST https://www.googleapis.com/upload/storage/v1/b/temp-compare/o?uploadType=multipart :('请求失败,状态码',403,'预期之一', )

示例代码:

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'))
Run Code Online (Sandbox Code Playgroud)

我曾尝试使用google-api-python-client 中提供的解决方案因 OAuth2 损坏?没有锁。

如何解决这个问题?

Ere*_*ush 7

毫不奇怪,事实证明我是问题的根源。在 fork 进程之后,创建的随机文件名random_file_name是相同的(可能与生成种子的方式有关)由于该帐户无权覆盖该文件,因此它会收到 403 响应。

如果我改为random_file_name

def random_file_name(ext, length):
    import uuid
    return  str(uuid.uuid4())[0:length]+"."+ext
Run Code Online (Sandbox Code Playgroud)

一切都按预期工作。

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