0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Flaskアプリ(PharmaQRシステム)をPythonanywhereでなく、Google Cloud Runで、デプロイする

Last updated at Posted at 2025-11-27

以前報告した、PharmaQRシステム:薬剤効果等の簡易アンケート収集システム、の提案
https://qiita.com/tkoji3744/items/7f4a3b5c940d75616b63

というFlaskアプリを、Google Cloud Runで、デプロイしてみた。

*なお、今まで、Flaskアプリを、Pythonanywhereでデプロイしたことはあった(みんなで作るさくら情報マップ|kojikoji)が、ぼくにとってこのアプローチははじめてのことだったので、備忘録としてここに記す。

準備(初回だけ)
1:Google Cloud のサイトでプロジェクト作成
https://console.cloud.google.com/  
左上 黒丸3つ、から

image.png

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 を動かす世界そのもの(コンテナ)を自分で作って載せる”

image.png

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 が表示される。

image.png

最後にみえている: https://qr-api-64824712508.asia-northeast1.run.app
が公開ページ

image.png

(参考追記)ChatGPTの助けがあれば、この「Cloud Runによる、ビルド⇒デプロイ」もそうむずかしくなかったが、逆にChatGPTの助けがないとかなりぼくにはむずかしい(とはいえ、現状、ChatGPTがあるのでこれでもいい印象)。

*Cloud Run のログを見る手順 Google Cloud Console を開く
   https://console.cloud.google.com/

image.png

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

image.png

Cloud Storageは、GoogleCloud内の、Cloud Runの並びにある
image.png

***requirements.txt は “必要なパッケージの買い物リスト”
Dockerfile は “その買い物リストを使って台所をつくるレシピ(=調理場の構築手順)”

■ requirements.txt
Flask==3.0.3
qrcode==7.4.2
gunicorn==23.0.0

つまり「アプリがこう動くためには、これだけの材料(ライブラリ)が必要です」と言っているだけで、アプリ自身は “どうやって材料を準備するか” は知らない。材料の名前を書いているだけ。

■ Dockerfile
→ その材料を使うための “調理場そのものを準備する手順書”

image.png

どの OS イメージを使う? どこにアプリを置く? requirements.txt をどう解釈して pip install する? 起動コマンドは何? 不要ファイルは作らない? 環境変数は?FROM python:3.11-slim

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?