Я отправляю некоторые файлы из GCS через приложение GAE (используя flask), недавно я достиг предела в 32 МБ. Согласно документации, должно быть возможно обслуживать файлы из GCS размером более 32 МБ, но я не могу найти правильный API-интерфейс python3.
Response limits Dynamic responses are limited to 32MB. If a script handler generates a response larger than this limit, the server sends back an empty response with a 500 Internal Server Error status code. This limitation does not apply to responses that serve data from the Blobstore or Cloud Storage.
Я нашел API-интерфейс blobstore, который может обслуживать файлы из GCS, но, к сожалению, эта библиотека устарела и не совместима с python3. Вот как, я думаю, код выглядел бы при таком подходе
blobstore_filename = '/gs/{}/{}'.format(CLOUD_STORAGE_BUCKET, path)
blob_key = blobstore.create_gs_key(blobstore_filename)
response = Response("This should be overriden by App Enginge")
response.headers['Access-Control-Allow-Origin'] = '*'
response.headers['X-AppEngine-BlobKey'] = blob_key
return response
Я думаю, что в PHP есть определенный метод API, который делает именно то, что мне нужно. CloudStorageTools#serve
Я видел несколько предложений по использованию Подписанные URL для подобных проблем, но это больше похоже на обходной путь, а не на фактическое решение проблемы.
Я ожидал найти метод для обслуживания контента из GCS, я не знаю, подводят ли меня мои навыки поиска или метод, который мне нужен, не существует для среды python3.
У вас может быть маршрут в вашем приложении, который возвращает перенаправление на URL-адрес, подписанный GCS.
Таким образом, вы можете контролировать доступ к маршруту, но сам контент не обслуживается вашим приложением.
Обслуживание через ваше приложение повысит ваши затраты и снизит производительность, поскольку динамический запрос не кэшируется по умолчанию, а время экземпляра AppEngine и исходящие данные дороже, чем обслуживание из GCS.
Стандартные среды App Engine, в которых есть эта функция, такие как PHP и Python 2, делают это перенаправление внутри, поэтому клиент не видит доступ к GCS, но это происходит аналогичным образом.
Ни один из конкретных API-интерфейсов AppEngine не доступен в стандарте Python 3, посмотреть здесь.
Чтобы создать подписанный URL-адрес в стандартном Python 3 App Engine, вам потребуется вручную создать ключ служебной учетной записи. Учетные данные приложения по умолчанию, предоставленные в Compute Engine и App Engine, нельзя использовать для цифровой подписи. Python 2, Java, Go и PHP допускают это, потому что они используют внутренний API-интерфейс App Identity для создания подписи.
Хотя они еще недоступны, единственное замечание Google по этому поводу, которое я видел:
At this time, App Engine APIs are not available in the Python 3.7 runtime
Так что у нас еще есть надежда.
Это тот, кто приводит к ошибке > AttributeError: вам нужен закрытый ключ для подписи учетных данных. Учетные данные, которые вы сейчас используете, <class 'google.auth.compute_engine.credentials.Credentials'> просто содержат токен. см. google-cloud-python.readthedocs.io/en/latest/core/… для более подробной информации. Но очевидно ли, что он работает как учетная запись службы, и из примеров, которые я нашел в Интернете, мне не нужно больше ничего предоставлять при работе в GAE. Что мне не хватает?
Тот факт, что в документации говорится, что он не работает для Compute Engine (но работает для App Engine), заставляет меня немного беспокоиться о том, что в ошибке указано <class 'google.auth.compute_engine.credentials.Credentials'>. сообщение.
Учетные данные приложения по умолчанию нельзя использовать для цифровой подписи. Это возможно в стандарте App Engine для некоторых языков из-за App Identity API. Вам нужно использовать управляемый вручную ключ служебной учетной записи для создания подписанных URL-адресов на Python 3. Я добавил это в ответ на случай, если кто-то попытается сделать то же самое.
Существует два варианта обслуживания файлов:
1.-Вы можете использовать возобновляемую загрузку для загрузки объектов в ваш ведро. Вам нужно только использовать подписанный URL-адрес в начальном запросе POST.
2.-Вы можете создать документ политики (документ политики определяет, что пользователь (с учетной записью Google или без нее) может загружать с помощью формы POST, и предоставляет авторизацию, чтобы гарантировать, что форма может загружать файлы в целевую корзину) и использовать обычные HTML-формы для выполнения загрузить.
Пожалуйста, дайте мне знать ваши мысли и как это происходит.
Я действительно заинтересован только в обслуживании файлов, которые у меня уже есть в ведре, поэтому GET, а не POST
Большое спасибо за ваше разъяснение. В этой документации [1] рассказывается о получении объекта из корзины. Вы можете взглянуть на него, чтобы убедиться, что это то, что вам нужно, вы также можете использовать HTML-форму для загрузки. [1] cloud.google.com/storage/docs/xml-api/get-object-download
Я решил попробовать подписанный URL-адрес, код кажется довольно простым. ' # Создайте клиент облачного хранилища. gcs = storage.Client() Bucket = gcs.get_bucket(CLOUD_STORAGE_BUCKET) blob = Bucket.get_blob(path) url = blob.generate_signed_url(int(time.time() + 10)) return redirect(url) '