403 Ошибка загрузки данных в Google Storage с Python SDK после вызова fork () - PullRequest
0 голосов
/ 30 апреля 2019

Я пытаюсь загрузить контент в корзину Google с помощью Python SDK в раздвоенном процессе на хосте Linux (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, из-за OAuth2? без блокировки.

Как это можно решить?

Ответы [ 2 ]

1 голос
/ 30 апреля 2019

Кажется, проблема не в fork(), а в аутентификации с использованием учетной записи службы. Это работает для вас без fork()?

Я запустил ваш код и смог загрузить и прочитать содержимое файла, как с, так и без fork().

Для аутентификации с помощью служебной учетной записи json key я сделал следующее:

  1. Зайдите в Консоль -> IAM & admin -> Сервисные учетные записи -> Создать сервисную учетную запись
  2. Предоставьте ему роль администратора хранилища -> хранилища
  3. Создайте ключ (json) и сохраните его в файле key.json в той же папке с моим кодом
  4. Сконфигурируйте код для аутентификации, прочитав ключ этого файла client = storage.Client.from_service_account_json("key.json")

И это сработало. Когда я изменил роль учетной записи службы, чтобы у нее было меньше разрешений, он не смог выдать мне ошибку, аналогичную вашей, только он также сообщил мне, что используемая учетная запись службы не имеет доступа storage.buckets.get в этом сегменте.

0 голосов
/ 30 апреля 2019

Не удивительно, оказывается, я источник проблемы.После разветвления процесса случайное имя файла, созданное random_file_name, остается тем же (вероятно, связано с тем, как генерируется начальное число). Поскольку у учетной записи нет разрешения переопределять файл, она получает ответ 403.

Если я поменяю random_file_name на:

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

Все работает как положено.

Я, вероятно, все еще буду искать решение, если оно не для @TasosZG, советуем использоватьоболочка облака.

...