OAuth2.0にてappcfg.py download_data が実行できません。

489 views
Skip to first unread message

山口誠

unread,
Apr 22, 2016, 4:59:03 AM4/22/16
to Google-App-Engine-Japan
appcfg.py download_data にて(内部的に bulkloader.pyを実行し)
Datastoreの内容を
定期的に社内PCで所得しておりましたが4月12日リモートAPIのClientLoginが廃止され
oauth2.0による接続を試してますがError 302となり上手く行きません。

もし問題無く使えているという方おられれば解決方法をご教授頂けないでしょうか?

自分が試した手順は下記のとおりです。

①GOOGLE_APPLICATION_CREDENTIALSを設定

https://developers.google.com/identity/protocols/application-default-credentials#whentouse

を参考に環境変数 GOOGLE_APPLICATION_CREDENTIALS に json ファイルを設定して実行!

下記の如く 
Error 302 が発生しました。

>appcfg.py download_data --url=https://hogehoge.appspot.com/remote_api --filename
hogehoge.dump --email=xx...@xxxxx.co.jp
03:47 PM Downloading data records.
[INFO    ] Logging to bulkloader-log-20160422.154741
[INFO    ] Throttling transfers:
[INFO    ] Bandwidth: 250000 bytes/second
[INFO    ] HTTP connections: 8/second
[INFO    ] Entities inserted/fetched/modified: 20/second
[INFO    ] Batch Size: 10
2016-04-22 15:47:41,381 INFO client.py:677 access_token is expired. Now: 2016-04
-22 06:47:41.381000, token_expiry: 2016-04-20 00:00:23
Error 302: --- begin server output ---

--- end server output ---

② oauth2_refresh_tokenやoauth2_access_tokenを設定してみましたがダメでした。

https://accounts.google.com/o/oauth2/v2/auth?response_type=code&client_id=$CLIENT_ID&redirect_uri=$REDIRECT_URI&scope=https://www.googleapis.com/auth/admin.datatransfer&access_type=offline

※scopeが良くないでしょうか?

にて
refresh_token を所得し

curl --data "code=$AUTHORIZATION_CODE" --data "client_id=$CLIENT_ID" --data "client_secret=$CLIENT_SECRET" --data "redirect_uri=$REDIRECT_URI" --data "grant_type=authorization_code" --data "access_type=offline" https://www.googleapis.com/oauth2/v4/token

にて
access_token を所得

>appcfg.py download_data --url=https://hogehoge.appspot.com/remote_api --filename hogehoge.dump --email=xx...@xxxxx.co.jp --oauth2_access_token=$access_token --oauth2_refresh_token=$refresh_token

とし実行してもみましたがやっぱり Error 302 が発生しました。

ご返答お待ちしております。

Message has been deleted

山口誠

unread,
Apr 26, 2016, 9:59:48 AM4/26/16
to Google-App-Engine-Japan
ご教授ありがとうございます。
いろいろと試してみてたので返答が遅くなりました。
すいません。

ご説明通り認証部分が間違ってました。

環境変数GOOGLE_APPLICATION_CREDENTIALSを削除してg
cloudで認証を掛けたところPythonのプロジェクトでは問題なく通りました。
(bulkloader.yaml修正後のappset.pyはcreate_bulkloader_configでは無くdownload_dataとしました。)


ただ当方Javaのプロジェクトに対してappset.pyを実行してるのですがそちらの方は

[INFO    ] Logging to bulkloader-log-20160426.150203
[INFO    ] Throttling transfers:
[INFO    ] Bandwidth: 250000 bytes/second
[INFO    ] HTTP connections: 8/second
[INFO    ] Entities inserted/fetched/modified: 20/second
[INFO    ] Batch Size: 10
[INFO    ] Opening database: bulkloader-progress-20160426.150203.sql3
[INFO    ] Opening database: bulkloader-results-20160426.150203.sql3
2016-04-26 15:02:03,266 INFO client.py:546 Attempting refresh to obtain initial
access_token
2016-04-26 15:02:03,266 INFO client.py:804 Refreshing access_token
Error 404: --- begin server output ---
<html><head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<title>404 NOT_FOUND</title>
</head>
<body text=#000000 bgcolor=#ffffff>
<h1>Error: NOT_FOUND</h1>
</body></html>
--- end server output ---

となり Error 404 が表示されてしまいます。 

web.xml

のremoteapiに対する<security-constraint>がClientLoginの当時の古いまま

<security-constraint>
<web-resource-collection>
<web-resource-name>remoteapi</web-resource-name>
<url-pattern>/remote_api</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>admin</role-name>
</auth-constraint>
</security-constraint>

と成ってたのでドキュメントに記載どおり
<security-constraint>~</security-constraint>
を削除してみましたが404が取れません。

試しに<auth-constraint>~</auth-constraint>や<role-name>admin</role-name>
の部分だけを削除したりもしましたが状況に変化が無く困っております。

あと少しで解決しそうなんですが…(汗)



2016年4月24日日曜日 17時21分26秒 UTC+9 nagai:
認証方法が違うのだと思います(GOOGLE_APPLICATION_CREDENTIALSの設定とかいらない)

僕がやったことは

* https://console.developers.google.com/apis/credentials よりサービスアカウントキーを作成
** サービスアカウントタイプは AppEngine default service account
** キータイプは JSON

* サービスアカウントキーを作るとJSONがダウンロードされる(projectid-xxxxxx.jsonとします)

* サービスアカウントの管理(https://console.developers.google.com/permissions/serviceaccounts?project=XXXXXX) より、サービスアカウントID(x...@appspot.gserviceaccount.com)を覚える

* 自分のPCに Google Cloud SDK ( https://cloud.google.com/sdk/ )をインストール
* 自分のPCのターミナルから以下のコマンドを実行
** gcloud auth activate-service-account x...@appspot.gserviceaccount.com --key-file ./projectid-xxxxxx.json
** これで認証が通る

* bulkloader を実行してダウンロードする
** appcfg.py create_bulkloader_config --filename=bulkloader.yaml --url=http://xxx.appspot.com/_ah/remote_api --application=s~xxx APPLICATION_ROOT
** bulkloader.yaml をダウンロードしたい形式に修正
** appcfg.py create_bulkloader_config --filename=bulkloader.yaml --url=http://xxx.appspot.com/_ah/remote_api --application=s~xxx APPLICATION_ROOT

これでダウンロードできました。



2016年4月22日(金) 17:59 山口誠 <tocom...@gmail.com>:
--
このメールは Google グループのグループ「Google-App-Engine-Japan」に登録しているユーザーに送られています。
このグループから退会し、グループからのメールの配信を停止するには google-app-engine-japan+unsub...@googlegroups.com にメールを送信してください。
このグループに投稿するには google-app-...@googlegroups.com にメールを送信してください。
https://groups.google.com/group/google-app-engine-japan からこのグループにアクセスしてください。
その他のオプションについては https://groups.google.com/d/optout にアクセスしてください。
--
----------------------------------
永井友之( nagai tomoyuki)
tel:08030962221
Message has been deleted

山口誠

unread,
Apr 27, 2016, 5:56:29 AM4/27/16
to Google-App-Engine-Japan
コメントありがとうございます。

>レスポンスが404 なので、remote apiが組み込まれていない可能性があります。

ご指摘通りで Java module では remote api が正常に組み込まれていないと状態だと思います。
たぶん web.xml 等の記載方法(変わった?)に問題があると思うのですが修正方法がわかりません。
シンプルに remote api が動作している web.xml のサンプルとかあるとありがたいのですが…。

取り敢えずの回避策として python moduleを別のバージョンでデプロイして

appcfg.py download_data --config_file=xxxx.yaml --kind=xxx --url=http://pythonmodule.xxx.appspot.com/_ah/remote_api --filename download_file --application=s~gf-○○○

urlでpython moduleを入り口としてエンティティのダウンロードを行う様にしました。

これで大体はダウンロード出来るのですが特定のkindのエンティティーをダウンロードしようとすると下記の用なエラーが発生してしまいます。
どう対応しようか悩んでおります。


.................[ERROR   ] [WorkerThread-3] WorkerThread:
Traceback (most recent call last):
  File "C:\cron_pj029\google_appengine\google\appengine\tools\adaptive_thread_pool.py", line 172, in WorkOnItems
    status, instruction = item.PerformWork(self.__thread_pool)
  File "C:\cron_pj029\google_appengine\google\appengine\tools\bulkloader.py", line 750, in PerformWork
    transfer_time = self._TransferItem(thread_pool)
  File "C:\cron_pj029\google_appengine\google\appengine\tools\bulkloader.py", line 1156, in _TransferItem
    self, retry_parallel=self.first)
  File "C:\cron_pj029\google_appengine\google\appengine\tools\bulkloader.py", line 1460, in GetEntities
    results = self._QueryForPbs(query)
  File "C:\cron_pj029\google_appengine\google\appengine\tools\bulkloader.py", line 1404, in _QueryForPbs
    result_pb)
  File "C:\cron_pj029\google_appengine\google\appengine\api\apiproxy_stub_map.py", line 95, in MakeSyncCall
    return stubmap.MakeSyncCall(service, call, request, response)
  File "C:\cron_pj029\google_appengine\google\appengine\api\apiproxy_stub_map.py", line 329, in MakeSyncCall
    rpc.CheckSuccess()
  File "C:\cron_pj029\google_appengine\google\appengine\api\apiproxy_rpc.py", line 157, in _WaitImpl
    self.request, self.response)
  File "C:\cron_pj029\google_appengine\google\appengine\ext\remote_api\remote_api_stub.py", line 286, in MakeSyncCall
    handler(request, response)
  File "C:\cron_pj029\google_appengine\google\appengine\ext\remote_api\remote_api_stub.py", line 318, in _Dynamic_RunQuery
    'datastore_v3', 'RunQuery', query, query_result)
  File "C:\cron_pj029\google_appengine\google\appengine\ext\remote_api\remote_api_stub.py", line 201, in MakeSyncCall
    self._MakeRealSyncCall(service, call, request, response)
  File "C:\cron_pj029\google_appengine\google\appengine\ext\remote_api\remote_api_stub.py", line 227, in _MakeRealSyncCall
    encoded_response = self._server.Send(self._path, encoded_request)
  File "C:\cron_pj029\google_appengine\google\appengine\tools\appengine_rpc_httplib2.py", line 247, in Send
    url, method=method, body=payload, headers=headers)
  File "C:\cron_pj029\google_appengine\google\appengine\ext\remote_api\throttle.py", line 665, in request
    uri, method, body, headers, redirections, connection_type)
  File "C:\cron_pj029\google_appengine\lib\httplib2\httplib2\__init__.py", line1584, in request
    (response, content) = self._request(conn, authority, uri, request_uri, metho
d, body, headers, redirections, cachekey)
  File "C:\cron_pj029\google_appengine\lib\httplib2\httplib2\__init__.py", line1332, in _request
    (response, content) = self._conn_request(conn, request_uri, method, body, he
aders)
  File "C:\cron_pj029\google_appengine\lib\httplib2\httplib2\__init__.py", line1302, in _conn_request
    response = conn.getresponse()
  File "C:\Python27\lib\httplib.py", line 1030, in getresponse
    response.begin()
  File "C:\Python27\lib\httplib.py", line 407, in begin
    version, status, reason = self._read_status()
  File "C:\Python27\lib\httplib.py", line 365, in _read_status
    line = self.fp.readline()
  File "C:\Python27\lib\socket.py", line 430, in readline
    data = recv(1)
error: [Errno 10057] ソケットが接続されていないか、sendto 呼び出しを使ってデータグラム ソケットで送信するときにアドレスが指定されていないため、データの送受信を要求することは禁じられています。
[INFO    ] An error occurred. Shutting down.......[ERROR   ] [WorkerThread-0] WorkerThread:
Traceback (most recent call last):
  File "C:\cron_pj029\google_appengine\google\appengine\tools\adaptive_thread_pool.py", line 172, in WorkOnItems
    status, instruction = item.PerformWork(self.__thread_pool)
  File "C:\cron_pj029\google_appengine\google\appengine\tools\bulkloader.py", line 750, in PerformWork
    transfer_time = self._TransferItem(thread_pool)
  File "C:\cron_pj029\google_appengine\google\appengine\tools\bulkloader.py", line 1156, in _TransferItem
    self, retry_parallel=self.first)
  File "C:\cron_pj029\google_appengine\google\appengine\tools\bulkloader.py", line 1460, in GetEntities
    results = self._QueryForPbs(query)
  File "C:\cron_pj029\google_appengine\google\appengine\tools\bulkloader.py", line 1404, in _QueryForPbs
    result_pb)
  File "C:\cron_pj029\google_appengine\google\appengine\api\apiproxy_stub_map.py", line 95, in MakeSyncCall
    return stubmap.MakeSyncCall(service, call, request, response)
  File "C:\cron_pj029\google_appengine\google\appengine\api\apiproxy_stub_map.py", line 329, in MakeSyncCall
    rpc.CheckSuccess()
  File "C:\cron_pj029\google_appengine\google\appengine\api\apiproxy_rpc.py", line 157, in _WaitImpl
    self.request, self.response)
  File "C:\cron_pj029\google_appengine\google\appengine\ext\remote_api\remote_api_stub.py", line 286, in MakeSyncCall
    handler(request, response)
  File "C:\cron_pj029\google_appengine\google\appengine\ext\remote_api\remote_api_stub.py", line 318, in _Dynamic_RunQuery
    'datastore_v3', 'RunQuery', query, query_result)
  File "C:\cron_pj029\google_appengine\google\appengine\ext\remote_api\remote_api_stub.py", line 201, in MakeSyncCall
    self._MakeRealSyncCall(service, call, request, response)
  File "C:\cron_pj029\google_appengine\google\appengine\ext\remote_api\remote_api_stub.py", line 227, in _MakeRealSyncCall
    encoded_response = self._server.Send(self._path, encoded_request)
  File "C:\cron_pj029\google_appengine\google\appengine\tools\appengine_rpc_httplib2.py", line 247, in Send
    url, method=method, body=payload, headers=headers)
  File "C:\cron_pj029\google_appengine\lib\oauth2client\oauth2client\client.py", line 569, in new_request
    redirections, connection_type)
  File "C:\cron_pj029\google_appengine\google\appengine\ext\remote_api\throttle.
py", line 665, in request
    uri, method, body, headers, redirections, connection_type)
  File "C:\cron_pj029\google_appengine\lib\httplib2\httplib2\__init__.py", line 1584, in request
    (response, content) = self._request(conn, authority, uri, request_uri, metho
d, body, headers, redirections, cachekey)
  File "C:\cron_pj029\google_appengine\lib\httplib2\httplib2\__init__.py", line 1332, in _request
    (response, content) = self._conn_request(conn, request_uri, method, body, he
aders)
  File "C:\cron_pj029\google_appengine\lib\httplib2\httplib2\__init__.py", line 1302, in _conn_request
    response = conn.getresponse()
  File "C:\Python27\lib\httplib.py", line 1030, in getresponse
    response.begin()
  File "C:\Python27\lib\httplib.py", line 407, in begin
    version, status, reason = self._read_status()
  File "C:\Python27\lib\httplib.py", line 371, in _read_status
    raise BadStatusLine(line)
BadStatusLine: ''
[ERROR   ] Error in WorkerThread-0: ''
[ERROR   ] Error in WorkerThread-3: [Errno 10057] ソケットが接続されていないか、sendto 呼び出しを使ってデータグラム ソケットで送信するときにアドレスが指定されていないため、データの送受信を要求することは禁じられています。

[INFO    ] Have 256 entities, 0 previously transferred
[INFO    ] 256 entities (277056 bytes) transferred in 250.1 seconds


2016年4月27日水曜日 13時36分44秒 UTC+9 nagai:

レスポンスが404 なので、remote apiが組み込まれていない可能性があります。
remote_apiがあるurl (xxx.appspot.com/_ah/remote_api だったかな?)をブラウザで開いてみて、404だったら組み込まれていないとおもいます


2016年4月26日(火) 22:59 山口誠 <tocom...@gmail.com>:

山口誠

unread,
Apr 27, 2016, 8:09:40 AM4/27/16
to Google-App-Engine-Japan
次々にトラブルがあるので長々と書いてしまいましたがnagaiさまのお陰でOAuth2.0にてappcfg.py download_data が実行できないという件は解決しました。

①java環境下でのWeb.xmlのremote api設定
②download_data時のErrno 10057発生

に関しては表題と内容がズレておりますのでもう少し調べてわからなければ
別途スレッドを立て問い合わせた方が良さそうですね。

nagaiさまありがとうございました。


2016年4月27日水曜日 18時56分29秒 UTC+9 山口誠:
Message has been deleted

山口誠

unread,
Apr 28, 2016, 5:51:36 AM4/28/16
to Google-App-Engine-Japan
nagaiさまコメントありがとうございます。

>1の方作ってみました。
>実際にblukloaderが動くかはわからないです。

お手数をおかけしました。

サンプルの方クーロンさせて頂きましたが僕は普段eclipseでjavaを使っててコマンドラインの動作は不得手で一応やってみましたが上手く動作しませんでした。

web.xmlを参考にremote_api関連の設定を再優先(先頭の方)に記載し直し

>appcfg.py download_data --config_file=xxxx.yaml --kind=xxx --url=http://pythonmodule.xxx.appspot.com/_ah/remote_api --filename download_file --application=s~gf-○○○



と変更すればjavaでも正常動作する様になりました。

ClientLoginの頃はここをhttpsとしてましたがhttpで無ければダメなようです。

あと

>②download_data時のErrno 10057発生

これは相交わず発生ししているのですが終了結果を見てみると
きちんとデータは落ちてるみたいなので運用上は問題無いようです。

未検証ですがもしかしたら壊れたインスタンスがあり削除すれば治るかもしれません。

ひとまず解決致しましたので長らくお付き合いくださいましてお礼申し上げます。
ありがとうございました。


2016年4月27日水曜日 23時46分53秒 UTC+9 nagai:
1の方作ってみました。
実際にblukloaderが動くかはわからないです。

2の方はわからないです。


2016年4月27日(水) 21:09 山口誠 <tocom...@gmail.com>:
Reply all
Reply to author
Forward
0 new messages