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

问题描述 投票:0回答:2

我正在尝试使用Python SDK在Linux主机上的分叉进程中将内容上传到Google存储桶(Ubuntu 18.04)操作失败,状态代码为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'))

我尝试过使用google-api-python-client broken because of OAuth2?提供的无锁解决方案。

怎么解决这个问题?

google-cloud-platform google-cloud-storage fork python-3.6
2个回答
1
投票

这个问题似乎与fork()无关,而是与服务帐户进行身份验证。没有fork()它对你有用吗?

我运行你的代码并设法上传和读取文件的内容,无论是否有fork()

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

  1. 转到控制台 - > IAM&admin - >服务帐户 - >创建服务帐户
  2. 授予它存储 - >存储管理员角色
  3. 创建密钥(json)并将其保存在与我的代码相同的文件夹中的文件key.json
  4. 通过读取该文件的密钥client = storage.Client.from_service_account_json("key.json")来配置要进行身份验证的代码

它奏效了。当我将服务帐户的角色更改为具有较少权限时,它未能向您提供类似的错误,只是它还告诉我我使用的服务帐户没有对该存储桶进行storage.buckets.get访问。


0
投票

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

如果我将random_file_name改为:

def random_file_name(ext, length):
    import uuid
    return  str(uuid.uuid4())[0:length]+"."+ext

一切都按预期工作。

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

© www.soinside.com 2019 - 2024. All rights reserved.