Облачное хранилище Google на dev_appserver в облачной оболочке

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

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

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

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

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

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

Кто-нибудь?

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

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'",))

2 ответа

Решение

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

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

Учетная запись службы App Engine по умолчанию

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

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

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

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

Хранилище> Браузер> Правая кнопка вашего сегмента> Редактировать разрешения блока

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

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

% gcloud auth login
% gcloud auth application-default login
Другие вопросы по тегам