見出し画像

【GCP+Python】CloudRun for Anthosにアプリをデプロイする

ふつうのCloudRunは、CloudRunサービスにアプリだけぽーいってすれば動かせて簡単だけどお高いので、自分でKubernetes(GKE)を構築した上にCloudRunアプリを載っける、CloudRun for Anthosという仕組みを使ってアプリをデプロイします。

GKEを有効化してクラスタを作……らない

ここについては、今回はもう誰かがやってくれているところにデプロイするのですっ飛ばします。
必要になったらまた調べます。そういうことをやっているから時々変なところでつっかかるんですが。

GKEクラスタへのアクセス等々を確立する

いろいろ面倒なので、こちらの記事の上半分を参照のこと

flaskを使ってAPIを作る

起動用のpyファイルはmain.pyって名前にしておく。
またこの時、必ずapp.run()のところは

if __name__ == "__main__":
   app.run(debug=True, host="0.0.0.0", port=int(os.environ.get("PORT", 8080)))

という形式で書いておきます。
if-mainの中に入れずにべた書きしてしまうと、K8sに乗っけると「そのポートもう使ってるよばーかばーか」と怒られます。
main.pyが、内部で一度読み込まれた後、モジュールとしてもう一度読み込まれているらしくて。windowsローカルでは問題なく動くんですが。

DockerfileとDockerignoreを作る

python用のサンプルはここにあるので、コピペすればOK。
Dockerfile内でgunicornを使っているので、ビルドする前にrequirements.txtにgunicornを追記しておかないと「gunicornがありませーーん」って怒られます。使ってねーーーし!ってしばらく揉めました。使ってました。

ビルドする

プロジェクトフォルダのルートで

$ gcloud builds submit --tag gcr.io/PROJECT_ID/APP_NAME:VERSION

を実行する。PROJECT-IDはプロジェクトのID、APP_NAMEは任意のアプリ名、VERSIONも任意のバージョン(0.0.1とか22.8.24.1とか)

これで、コンテナイメージが「gcr.io/PROJECT_ID/APP_NAME:VERSION」という場所にアップロードされる。

デプロイする

$ gcloud run deploy APP_NAME --image gcr.io/PROJECT_ID/APP_NAME:VERSION ^
 --service-account GKE-NAME ^
 --namespace=NAMESPACE ^
 --set-config-maps=KEY=configmap:key

する。

二行目のservice-accountは、事前に作っておいたGKEアカウント名を設定する。GKEアカウントの作成は上記の記事にまとめてあります。

これでデプロイを行うと、GKEの管理画面の「ワークロード」のところにデプロイが作られる。一回デプロイすると一個出来て、何かのエラーが出たりして「あれれー?」って何度もデプロイするとうぞうぞ増えていく。

消すときは、「Anthos」メニュー>CloudRunForAnthos>サービス>リビジョン から一個ずつ消せます。デプロイの画面から消そうとしても消えないので注意。

で、デプロイした後ログを見守っていると、なんか30秒で勝手にシャットダウンしちゃっててあれぇぇ…??って半日あれこれやってたんですけど、単なるタイムアウトによるシャットダウンのようです……アクセスすれば再起動します。デプロイの横のチェックマークと、CloudRunForAnthosメニューのサービス一覧のところのチェックマークが緑になっていればOKです。

アクセステストをする

ドメインマッピングをしていないと、CloudRunForAnthosメニューの、サービス詳細画面に表示されているURL(~~~.sample.comになっているやつ)はアクセスできません。紛らわしい!!
表示されているURLの横の、インフォメーションアイコンをクリック>curlコマンドをコピーしてコマンドプロンプトからアクセスしてみてください。動きます。いえーい。

この記事が気に入ったらサポートをしてみませんか?