Облачное хранилище Google на dev_appserver в Cloud Shell

Я пытаюсь использовать Google Cloud Storage от GAE, и все работает нормально при развертывании. Однако я не могу заставить хранилище работать на сервере разработки, который работает в Google Cloud Shell.

Я использую API облачного хранилища и понимаю, что dev_appserver должен иметь доступ к тем же сегментам, что и развернутое приложение. Для меня тоже было бы хорошо работать с локальными данными.

Сервер разработки вызывается dev_appserver.py .

Я поигрался с недокументированным флагом default_gcs_bucket_name, но безуспешно.

Я настроил облачную оболочку для работы с правильным проектом с помощью gcloud init. Я также безуспешно пытался использовать новый google.cloud.storage API.

Та же ошибка, о которой говорится ниже, возникает, если я запускаю образец, представленный здесь: Образец App Engine и Google Cloud Storage.

Кто угодно?

Изменить: я получаю одну и ту же ошибку независимо от того, указываю ли я действительное или недействительное имя сегмента.

app.yaml

runtime: python27
api_version: 1
threadsafe: true

builtins:
- remote_api: on

handlers:
- url: /.*
  script: main.app

main.py

import logging
import cloudstorage as gcs
import webapp2
from google.appengine.api import app_identity

class MainPage(webapp2.RequestHandler):
    def get(self):
        self.response.headers['Content-Type'] = 'text/plain'
        bucket_name = "xxxx-xxxxxx.appspot.com"     
        stats = gcs.listbucket('/'+bucket_name) 
        for stat in stats:
          self.response.write(repr(stat) + '')        

app = webapp2.WSGIApplication([
    ('/', MainPage),
], debug=True)

Бревно

INFO     2017-06-07 20:36:42,068 devappserver2.py:116] Skipping SDK update check.
INFO     2017-06-07 20:36:42,105 api_server.py:297] Starting API server at: http://0.0.0.0:38829
INFO     2017-06-07 20:36:42,110 dispatcher.py:209] Starting module "default" running at: http://0.0.0.0:8080
INFO     2017-06-07 20:36:42,111 admin_server.py:116] Starting admin server at: http://0.0.0.0:8000
ERROR    2017-06-07 20:36:54,836 api_server.py:374] Exception while handling service_name: "app_identity_service"
method: "GetAccessToken"
request: "\n7https://www.googleapis.com/auth/devstorage.full_control"
request_id: "QBrGUwjoJT"

Traceback (most recent call last):
  File "/google/google-cloud-sdk/platform/google_appengine/google/appengine/tools/devappserver2/api_server.py", line 349, in _handle_POST
    api_response = _execute_request(request).Encode()
  File "/google/google-cloud-sdk/platform/google_appengine/google/appengine/tools/devappserver2/api_server.py", line 225, in _execute_request
    make_request()
  File "/google/google-cloud-sdk/platform/google_appengine/google/appengine/tools/devappserver2/api_server.py", line 220, in make_request
    request_id)
  File "/google/google-cloud-sdk/platform/google_appengine/google/appengine/api/apiproxy_stub.py", line 131, in MakeSyncCall
    method(request, response)
  File "/google/google-cloud-sdk/platform/google_appengine/google/appengine/api/app_identity/app_identity_defaultcredentialsbased_stub.py", line 195, in _Dynamic_GetAccessToken
    'expires': now + token.expires_in,
TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'

WARNING  2017-06-07 20:36:54,838 tasklets.py:468] suspended generator _make_token_async(rest_api.py:55) raised RuntimeError(TypeError("unsupported operand type(s) for +: 'int' and 'NoneType'",))
WARNING  2017-06-07 20:36:54,839 tasklets.py:468] suspended generator get_token_async(rest_api.py:224) raised RuntimeError(TypeError("unsupported operand type(s) for +: 'int' and 'NoneType'",))
WARNING  2017-06-07 20:36:54,839 tasklets.py:468] suspended generator urlfetch_async(rest_api.py:259) raised RuntimeError(TypeError("unsupported operand type(s) for +: 'int' and 'NoneType'",))
WARNING  2017-06-07 20:36:54,839 tasklets.py:468] suspended generator run(api_utils.py:164) raised RuntimeError(TypeError("unsupported operand type(s) for +: 'int' and 'NoneType'",))
WARNING  2017-06-07 20:36:54,839 tasklets.py:468] suspended generator do_request_async(rest_api.py:198) raised RuntimeError(TypeError("unsupported operand type(s) for +: 'int' and 'NoneType'",))
WARNING  2017-06-07 20:36:54,839 tasklets.py:468] suspended generator do_request_async(storage_api.py:137) raised RuntimeError(TypeError("unsupported operand type(s) for +: 'int' and 'NoneType'",))

comment
Проверьте свою локальную учетную запись с помощью gcloud init. Возможно, вы не используете одну и ту же учетную запись Google для доступа к Хранилищу из продукта и локально.   -  person Rad Apdal    schedule 15.06.2017
comment
Спасибо! В облачной оболочке я вошел в систему как myslef, а в GCE это учетная запись службы. Я являюсь владельцем проекта и имею права на ведро, так что это не должно быть проблемой.   -  person Arne S    schedule 15.06.2017
comment
Большой. Я добавлю ответ, который включает настройку разрешений.   -  person Rad Apdal    schedule 15.06.2017
comment
Привет, Арне, льготный период заканчивается через 3 часа, не могли бы вы просмотреть мой ответ? Спасибо   -  person Mar Cial R    schedule 18.06.2017


Ответы (3)


Следуйте инструкциям в разделе Как работают учетные данные приложения по умолчанию ( условие 1.)

Он включает в себя установку переменной env GOOGLE_APPLICATION_CREDENTIALS, чтобы она указывала на действительный файл учетных данных json. Для этих тестов я просто создал новый, выбрав учетную запись службы App Engine по умолчанию:

Сервисный аккаунт App Engine по умолчанию

... и это прекрасно сработало.

Согласно Как работают учетные данные приложения по умолчанию запущено gcloud auth application-default login (условие 2.) также должно решить проблему, но мне не удалось заставить его работать в Cloud Shell, он не работает с той же ошибкой ", связанной с токеном доступа" :-(

person Mar Cial R    schedule 17.06.2017
comment
Привет, Мар, спасибо, но я не понимаю, как этот ответ соотносится с моим вопросом. Я использую Cloud Shell и вошел в систему как владелец проекта. Насколько я понимаю, авторизация dev_servers осуществляется средой облачной оболочки. - person Arne S; 18.06.2017
comment
Привет, Арне, я не могу объяснить, почему это не работает из простой Cloud Shell. Это также кажется мне какой-то ошибкой или необъяснимой функцией. Я бы по-прежнему рекомендовал использовать условие более высокого приоритета для установки переменной env GOOGLE_APPLICATION_CREDENTIALS. Таким образом, ваш код должен работать независимо от того, где вы его выполняете. Попробуйте и дайте мне знать, решит ли он вашу проблему. - person Mar Cial R; 18.06.2017
comment
Спасибо, Мар - я действительно пробовал, и это не имело значения - person Arne S; 18.06.2017
comment
Я не использовал в своих тестах точно такой же код, как тот, на который вы ссылались в github (github.com/GoogleCloudPlatform/python-docs-samples/blob/master/). Я начал с той же ошибки, затем попробовал условие 2., а затем установка env var решила ее. Теперь я склонен полагать, что либо: 1 вы неправильно устанавливаете переменную env, 2 в вашем коде чего-то не хватает (например, не используется app_identity или неправильный путь к ведру gs) - person Mar Cial R; 18.06.2017
comment
Я только что все перепроверил. Попробуйте использовать код appengine-client [1] как есть и используйте: export GOOGLE_APPLICATION_CREDENTIALS = / home / ‹PATH-TO-CREDENTIALS› .json [1] github.com/GoogleCloudPlatform/python-docs-samples/blob/master/ - person Mar Cial R; 18.06.2017
comment
Я рад, что вы наконец приняли мой ответ. Спасибо. В качестве последнего запроса, похоже, осталось несколько минут, чтобы забрать эти 100 очков репутации ... ;-) - person Mar Cial R; 18.06.2017
comment
Спасибо за вашу настойчивость. Я повторно посетил ваше решение и, используя шаги, при условии, что смог заставить его работать. Я не понял, что теперь он работает путем чтения и сохранения в локальном ведре (в облачной оболочке), а не в развернутом ведре. Как указано в вопросе - это работает для меня. - person Arne S; 18.06.2017

dev_appserver.py использует конфигурации, установленные в вашей локальной среде. Убедитесь, что настройки, установленные на gcloud init, также подходят для развертывания в производственной среде.

Чтобы установить разрешения учетной записи Cloud Storage, перейдите в Cloud Console, затем:

Хранилище> Браузер> Правая кнопка корзины> Изменить разрешения корзины

Добавьте свою учетную запись в качестве администратора хранилища или им подобных.

person Rad Apdal    schedule 15.06.2017
comment
Еще раз спасибо, но, как указано в комментарии выше, я запускаю dev_appserver, используя учетную запись, которая является владельцем проекта, и я подтвердил, что его пользователь имеет полные права на ведро. - person Arne S; 15.06.2017

Убедитесь, что вы вошли в систему и авторизовали учетные данные службы по умолчанию.

% gcloud auth login
% gcloud auth application-default login
person Manfred Georg    schedule 21.10.2020