概要
2019年末くらいからGCPのCloud Shell上でPython開発してCloud Functionにデプロイする作業してました。
ある程度開発終わって数ヶ月放置した後、最近新しい開発案件が発生したのでちょろっといじってデプロイしてテストするかーと思ったらデプロイ時に色々エラーを吐き始めてしまいます。
エラー見つつ対処進めたけどまあうまくいかず、最終的に環境リセットしたらうまく行ったのでまとめます。
Pythonとpipのアップデートとバージョン切り替えが一番手詰まりポイントでした
手順
- バックアップをとる
- 公式の手順にしたがって環境をリセットする
- Pythonをpyenvでアップデートする
- pipをpip3に切り替えてアップデートする
- 公式の手順にしたがってgcloudをアップデートする
- 作業ファイルを復元する
- requirements.txtから更新する
- あとはdeployして適宜バグを潰す
1. バックアップをとる
pip freeze > requirements.txt
でインストール済みパッケージを書き出したのち、Cloud Sell Editor上にあるファイルを一括ダウンロードしておきましょう。
ファイルはtarで落ちてきます。後でtarのまま上げなおすので、解凍する必要は特にないです。
2. 公式の手順にしたがって環境をリセットする
Cloud Shell の無効化またはリセット
https://cloud.google.com/shell/docs/resetting-cloud-shell?hl=ja
曰く、
sudo rm -rf $HOME
でリセットのちShell再起動でいけるらしいです。
3. Pythonをpyenvでアップデートする
こちらのQiita参考になりました、書いた方ありがとうございます。
GCPのCloud Shellのpythonバージョンの更新方法
https://qiita.com/greenteabiscuit/items/cbecdf4f84f0b73ff96e
私はpython 3.7.9 で実行しています。
4. pipをpip3に切り替えてアップデートする
そのままpipするとpython v2だから気をつけてね的な表示がでます。
放置するとCloud Functionデプロイ時にエラー吐いたので多分ここもpip3にした方がよいと思われ。
下記サイトのコマンド参考に切り替え
https://www.it-swarm-ja.tech/ja/pip/pip3%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%92pip%E3%81%AB%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF%E3%81%A9%E3%81%86%E3%81%99%E3%82%8C%E3%81%B0%E3%82%88%E3%81%84%E3%81%A7%E3%81%99%E3%81%8B%EF%BC%9F/831723093/
alias pip=pip3
でいけます。
そのあとは、pip install -U pip
で最新版にしましょう。
5. 公式の手順にしたがってgcloudをアップデートする
さらにgcloudもアップデートしないとダメでした。
公式的にはこちらの手順です:
gcloud components update
https://cloud.google.com/sdk/gcloud/reference/components/update
gcloud components update
が当該コマンド。
しかしShell上だとこれでアップデートはできず、
sudo apt-get update && sudo apt-get --only-upgrade install google-cloud-sdk-app-engine-python-extras google-cloud-sdk-kpt google-cloud-sdk-minikube google-cloud-sdk-app-engine-java google-cloud-sdk-datalab google-cloud-sdk-kind google-cloud-sdk-app-engine-grpc google-cloud-sdk-firestore-emulator google-cloud-sdk-bigtable-emulator google-cloud-sdk-skaffold kubectl google-cloud-sdk-cbt google-cloud-sdk-pubsub-emulator google-cloud-sdk-anthos-auth google-cloud-sdk google-cloud-sdk-datastore-emulator google-cloud-sdk-app-engine-python google-cloud-sdk-spanner-emulator google-cloud-sdk-cloud-build-local google-cloud-sdk-app-engine-go
というvery longなコマンドを実行しろと言われます。
実行するとちゃんとアップデートされました。
6. 作業ファイルを復元する
1でDLしたtarをアップロードしましょう。
D&Dか、ファイル一覧の何もないところ右クリック→Upload Filesでいけます。
アップロード後、tarコマンドで解凍します。
やり方はこちらのQiitaを参考にしてました:
[Linux]ファイルの圧縮、解凍方法
https://qiita.com/supersaiakujin/items/c6b54e9add21d375161f
tar -xvf xxxx.tar
コマンド的には上記
7. requirements.txtから更新する
あとはpipパッケージを再インストールしましょう。
私は下記サイトを参考にしました。
Python, pipでrequirements.txtを使ってパッケージ一括インストール
https://note.nkmk.me/python-pip-install-requirements/
pip install -r requirements.txt
たまーに「別のパッケージないとこのパッケージインストールできんぞ」的なエラー出ますが、その時はパッケージ名指定してinstallすればなんとかなります。
ただbigqueryのapi使ってるのですが、関連のパッケージは以下でインストールしないとダメだった:
pip install google-cloud-bigquery
8. あとはdeployして適宜バグを潰す
あとは gcloud functions deploy
して無限にバグを産みましょう潰しましょう。
追記
もしかすると、Editor画面下の青いバーでバージョン変更したらめんどくさいことしなくてもいけるのかもしれない。