GAE/SE Pythonランタイムアップデートへの道


社内でGAE/SEのpy27(SEの1gen)のサービスが多くあり、py37(SE 2gen)への移行のために、軽いノリで整理した記事を書いたので、qiita用に整理し直しました。

少し古い情報や間違いもあるかもしれないので、ご指摘いただければと思います。

# Python2.7は2020年1月に死亡

https://pythonclock.org/
<img width="839" alt="スクリーンショット 2018-11-19 14.12.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/42594/e6345327-a539-8f23-1a23-28544100bebc.png">


それまでに移行する必要があります。

## python2からpython3へのアップデート！

- [2to3](https://docs.python.jp/3/library/2to3.html)
- [Python 2.7.x と 3.x の決定的な違いを例とともに](https://postd.cc/the-key-differences-between-python-2-7-x-and-python-3-x-with-examples/)
- [Python2からPython3.0での変更点](https://qiita.com/CS_Toku/items/353fd4b0fd9ed17dc152)
- （その他多くの参考記事があると思います）

# AppEngine SDKやpython2.7に依存した人の移行案

基本的にAppEngine SDKは完全廃止です :dizzy_face:  ！
もう `google.appengine` パッケージとは別れを告げよう！ :raised_hand_with_fingers_splayed: 
代替サービスが無い・開発される予定のないものを使っている人は、一緒に辛い道のりを歩もう！ :running: 

公式の違い解説: [Understanding differences between Python 2 and Python 3 on the App Engine standard environment ](https://cloud.google.com/appengine/docs/standard/python3/python-differences)

SE 2nd genには、1st genと比べて、

- プロプライエタリな仕様からの脱却
    - AppEngine専用SDKの廃止
    - 動く環境もGAEの内側でなく、外と同じ感じになる？
    - 自由だけど飼い慣らされた環境じゃない
- 環境依存の脱却
    - 普通のDockerぽくなる。(gVisor？)
    - テスト等も共通化できる

のような特徴があると感じました。

## TaskQueueのPush Queueで非同期処理 :two_men_holding_hands: 

[Cloud Tasks](https://cloud.google.com/tasks/), [AppEngine Queue](https://cloud.google.com/tasks/docs/creating-appengine-queues)がβです！

- 有料化したけど、無料範囲が十分大きいので安心！ :heart_eyes: 
- Pull Queueの場合やGAEのサービス間通信の場合はpub/subなども使えます。
   - [参考](https://cloud.google.com/tasks/docs/migrating?hl=en)

## App Engine Cronで定期実行 :school: 
[Cloud Schedulerがbeta中](https://cloud.google.com/scheduler/)

- 有料化 :money_with_wings: されましたが、だいぶ安いので問題なさそうです。
- まだβなのでバグはある？

## Memcache最高 :memo: 

- 廃止? :latin_cross: 
    - 検討中ではある？: `Stay tuned for updates as we're continuing to look into opening up Memcache to the rest of GCP.`
- ないと困る場合は[Cloud Memorystore(Redis)](https://cloud.google.com/memorystore/)に課金すべき？
    - GAEからアクセスできないらしい。

## `login: admin` で管理画面 :police_car:  
廃止予定 :skull_and_crossbones: 

- [IAPへ移行しよう :disappointed_relieved: ](https://cloud.google.com/iap/docs/app-engine-quickstart?hl=ja)
    - Users API自体が廃止なので、Googleアカウントでの認証も移行する必要がある。
    - [Google Identity Platform](https://developers.google.com/identity/)
        - GoogleのOAuth
- [Firebase Authentication](https://firebase.google.com/docs/auth/)
    - Facebook, Twitter, Email等の、その他ログインも使うならこっち。

## Mail APIでお手軽にメール送るっしょ :postbox: 
廃止 :mailbox_closed: 

- SendGrid, Mailgun, Mailjet等を使いましょう。

## Datastoreのpython用ラッパーndbを使っていた :snake: 
- 移行検討・開発中 :thinking: 
    - コメント: `We're currently actively exploring bringing ndb to Python 3. Note that this would be close to, but not 100%, API-compatible but would bring the magic of a good ORM to Datastore.`
- 待てないならGoogle Cloud Python client libraries を使うのが早い。

## 画像キャッシュ最強のImages API :framed_picture: 
廃止 :confounded: 

- 自分でGCSとPillowで頑張る

## Search APIで検索システム作ってた :microscope: 
検討中、おそらく廃止？ :cold_sweat: 

- GCEにElasticsearchたてる？

## dev_appserver.pyのDatastoreエミュレータでテストしていた :construction_worker:  
廃止 :angel: 

- Cloud Datastore Emulatorを起動するタイプにして書き直しましょう。
- もしくはモック。

## GAE/SEのLogはやっぱ見やすくて最高 :see_no_evil: 
そのままLoggingしても勝手にまとめてくれません！ :thermometer_face:  
自分で集めるようにしましょう。。

- [参考](https://qiita.com/chidakiyo/items/1452ab1ea83279a8e485)

## その他廃止 :rhinoceros: 
個人的に使っていないものですが、使っていた方は注意してください。

- Blobstore
    - バイナリが保存できるやつ
    - そもそもGCSに移行していると思います。。
- Capabilities
    - http://localhost:8888/_ah/admin で使えるやつ。
- Modules API
    - AppEngineのサービス（旧モジュール）を取得するAPI。
    - 複数サービスで同じコードを使ってたり、自サービスや他サービスと連携する場合は使っていた？
    - AppEngine Admin APIや環境変数で対応可。
- URL Fetch
    - 特に気にせず普通にアクセスできるようになる。
    - Requestsでいい。
- appcfg.py
    - そもそも現時点でも非推奨になって久しいので気にしなくていい？。


# いいところもいっぱいあるので頑張ろう！ :muscle: 
- Third partyライブラリが完全に使える
    - C Nativeなライブラリでも自由自在！ scikit-learn等も！
        - メモリとかマシンリソースは制限あるけど。。
        - 無料枠がある！ :pray: 
- Fileアクセス可能！
- バックグラウンドスレッドでも殺されない！
    - 今までもできたはできたけど。。
- Cloud Client Library使える！
    - ~~今までも使えたけど~~AppEngine SDKとぶつかって面倒だった。
- dev_appserver.pyは引き続き使える！
    - ただし、使うにはpython2が必要 （そのうち解消するはず。。）

# その他参考

- [GAE: second generation runtime の機能を有効活用しつつ、Python 3.7 の Web アプリを動かす](https://qiita.com/ao_log/items/a547d2bd91e903ab59cc)