4

Google Cloud StorageをGAEから使用しようとしていますが、展開するとすべて正常に動作します。ただし、Google Cloud Shellで動作する開発サーバーでストレージを使用することはできません。クラウドシェルのdev_appserverにあるGoogle Cloudストレージ

私はcloudstorage APIを使用しており、dev_appserverはデプロイされたアプリケーションと同じバケットにアクセスする必要があることを理解しています。地元のデータを扱っている私にとってはうまくいくでしょう。

開発サーバは、私は非文書化default_gcs_bucket_nameフラグが、運と周り果たしているdev_appserver.py .

によって呼び出されます。

gcloud initを使用して、正しいプロジェクトで作業するためにクラウドシェルを設定しました。私も新しいgoogle.cloud.storage APIを運を使わずに使ってみました。

App Engine and 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'",)) 
+0

:-(同じ「アクセストークン関連」エラーで失敗します'gcloud init'を使ってあなたのローカルアカウントをチェックしてください.prodとローカルからStorageにアクセスするために同じGoogleアカウントを使用していないかもしれません。 –

+0

ありがとう!クラウドシェルではmyslefとしてログインしています.GCEではサービスアカウントです。私はプロジェクトの所有者であり、バケツに対する権利を持っているので、問題ではないはずです。 –

+0

私は許可を設定することを含む答えを追加します。 –

答えて

1

は、(条件1)

How the Application Default Credentials workで利用可能な指示に従ってくださいそれは有効なJSON資格情報ファイルを指すようにGOOGLE_APPLICATION_CREDENTIALSのENV変数を設定する必要。 は、これらのテストのために、私はApp Engineのデフォルトのサービスアカウントを選択し、新しいものを作成しました:

App Engine default service account

を...、それは美しく働きました。

gcloud auth application-default login(条件2)も、問題を解決する必要がありますが、私はそれがクラウドシェル上で動作させることができていない実行しているHow the Application Default Credentials workによると、それは

+0

こんにちはMar -thanksですが、私はこの答えが私の質問にどう関係しているのか分かりません。私はCloud Shellを使用しており、プロジェクトの所有者としてログインしています。 dev_serversの認可は、クラウドシェル環境によって世話を受けたものです。 –

+0

こんにちはアルネ、私はなぜそれがプレーンクラウドシェルから動作しないか説明することはできません。それはまた私にいくつかのバグや説明されない特徴として私を襲う。 GOOGLE_APPLICATION_CREDENTIALSのenv変数を設定する優先順位の高い条件を使用することをおすすめします。そうすれば、あなたのコードはあなたが実行した場所を考慮して動作するはずです。すばやく試してみて、問題が解決すれば教えてください。 –

+0

ありがとうMar - 私は試してみましたが、違いはありません –

0

dev_appserver.pyは、ローカル環境で設定された構成を使用しています。プロダクションにデプロイする場合は、gcloud initに設定されているコンフィグレーションも正しいことを確認してください。

ストレージ>ブラウザ>あなたのバケツの右ボタン>編集バケットの権限

ストレージ管理者または同類としてアカウントを追加します。

は、クラウドコンソールに行き、クラウドストレージアカウントの権限を設定します。

+0

もう一度おねがいしますが、上記のコメントに記載されているように、プロジェクトの所有者であるアカウントを使用してdev_appserverを実行し、そのユーザーにバケットに対する完全な権限があることを確認しました。 –

関連する問題