以前報告した、PharmaQRシステム:薬剤効果等の簡易アンケート収集システム、の提案
https://qiita.com/tkoji3744/items/7f4a3b5c940d75616b63
というFlaskアプリを、Google Cloud Runで、デプロイしてみた。
*なお、今まで、Flaskアプリを、Pythonanywhereでデプロイしたことはあった(みんなで作るさくら情報マップ|kojikoji)が、ぼくにとってこのアプローチははじめてのことだったので、備忘録としてここに記す。
準備(初回だけ)
1:Google Cloud のサイトでプロジェクト作成
https://console.cloud.google.com/
左上 黒丸3つ、から
https://console.cloud.google.com/
プロジェクト名:kojikoji-qr-cloud
2:Google Cloud SDK(gcloud CLI)インストール
https://cloud.google.com/sdk/docs/install
ここから、Windows用.exeファイルをダウンロード後、インストール。
コマンドプロンプト(またはPowerShell)で:
gcloud init
→ Google アカウントでログイン
→ プロジェクト選択(上で作ったもの)
→ デフォルトリージョン:
asia-northeast1(東京)
3:API 有効化
コマンドプロンプトで:
gcloud services enable run.googleapis.com
gcloud services enable cloudbuild.googleapis.com
gcloud services enable storage.googleapis.com
4: Cloud Storage バケットを作る
例 バゲット名:kojikoji-qr-app
コマンドプロンプト:
4-1:バケット作成
gsutil mb -l asia-northeast1 gs://kojikoji-qr-app/
4-2:バケットの公開(QR画像などを外部から見れるように)
gsutil iam ch allUsers:objectViewer gs://kojikoji-qr-app
4-3:バケット内のファイル一覧を見る(確認)
gsutil ls gs://kojikoji-qr-apphttps://console.cloud.google.com/
ファイルのデプロイ方法
5: 現在の Flask アプリ:
pharmacist_qr_full_app_utf8sig/
├── app.py
├── answers.csv
└── static/
└── qr_codes/
を次の構成に変える:
qr_cloudrun_updated/
├─ main.py
├─ requirements.txt
├─ Dockerfile
├─ openapi.json
このファイルをC:\Users\koji3\qr_cloudrun_updated とおく
*細かい方法の説明は省くが、ここのファイルのかきかえや追加(特にDockerfile)にChatGPTの助けを多くかりた。
一般論をいえば、PythonAnywhere は “Flask をそのまま載せる場所”
Cloud Run は “Flask を動かす世界そのもの(コンテナ)を自分で作って載せる”
PythonAnywhere: Flask アプリだけを渡せば運用環境が全部用意されている
Cloud Run(Docker): Flask が動く環境を全部自分で作る(Dockerfile) → その丸ごとをアップ
6:Google Cloud(https://console.cloud.google.com/ )
に(kojikoji-qr-cloud を作ったアカウント)でログインしていることを確認
*コマンドプロンプトでも確認できる:
gcloud config get-value account
→ここに表示されるメールが kojikoji(請求アカウントのオーナー)のもの
gcloud config get-value project
→ kojikoji-qr-cloud
7: ビルド
コマンドプロンプト:
cd C:\Users\koji3\qr_cloudrun_updated
gcloud builds submit --tag gcr.io/kojikoji-qr-cloud/qr-api
8: デプロイ
コマンドプロンプト:
gcloud run deploy qr-api ^
--image gcr.io/kojikoji-qr-cloud/qr-api ^
--platform managed ^
--region asia-northeast1 ^
--allow-unauthenticated
*この意味は:すでにビルドしたイメージgcr.io/kojikoji-qr-cloud/qr-api
を Cloud Run のサービス名 qr-api として
東京リージョン(asia-northeast1)に
認証なしで公開
これをはりつける(実行する)と
Cloud Run が「前回の API を上書き更新」。30秒ほどでデプロイ完了。最後に Service URL が表示される。
最後にみえている: https://qr-api-64824712508.asia-northeast1.run.app
が公開ページ
(参考追記)ChatGPTの助けがあれば、この「Cloud Runによる、ビルド⇒デプロイ」もそうむずかしくなかったが、逆にChatGPTの助けがないとかなりぼくにはむずかしい(とはいえ、現状、ChatGPTがあるのでこれでもいい印象)。
*Cloud Run のログを見る手順 Google Cloud Console を開く
https://console.cloud.google.com/
1.Google Cloud Console ( https://console.cloud.google.com/ )を開く
2.左上本線→CloudRun→サービス→ログ
**Cloud Run は「読み取り専用のコンテナ」で動くので、
デプロイ時に置いたファイルだけが入る
実行中に生成したファイルは /tmp にしか永続化されない
次のリビルド・デプロイで static フォルダは初期化される(上書きされる):static/qr_codes/ は Cloud Run 実行中に作っても 永続しません ⇒もともとのFlaskファイルにあった記録保存場所「static が消えた」状態になる
⇒Cloud Storage(GCS)に QR画像やアンケート結果等を保存する必要がある
https://console.cloud.google.com/storage/browser
Cloud Storageは、GoogleCloud内の、Cloud Runの並びにある

***requirements.txt は “必要なパッケージの買い物リスト”
Dockerfile は “その買い物リストを使って台所をつくるレシピ(=調理場の構築手順)”
■ requirements.txt
Flask==3.0.3
qrcode==7.4.2
gunicorn==23.0.0
つまり「アプリがこう動くためには、これだけの材料(ライブラリ)が必要です」と言っているだけで、アプリ自身は “どうやって材料を準備するか” は知らない。材料の名前を書いているだけ。
■ Dockerfile
→ その材料を使うための “調理場そのものを準備する手順書”
どの OS イメージを使う? どこにアプリを置く? requirements.txt をどう解釈して pip install する? 起動コマンドは何? 不要ファイルは作らない? 環境変数は?FROM python:3.11-slim






