よっしー
こんにちは。よっしーです(^^)
今日は、terraformで作成したリソースにFlaskアプリをデプロイする方法について解説しています。
背景
terraformで作成したリソースにFlaskアプリをデプロイする方法について調査する機会がありましたので、その時の内容を備忘として記事に残しました。
Flaskアプリとは
Flaskは、Pythonで書かれた軽量なWebアプリケーションフレームワークです。以下にFlaskの主な特徴と基本的な使用方法を説明します:
- 特徴:
- マイクロフレームワーク:最小限の機能を持ち、必要に応じて拡張可能
- 軽量:コア機能が少なく、学習曲線が緩やか
- 柔軟性:開発者に多くの自由度を与える
- Werkzeug(WSGI ユーティリティ)とJinja2(テンプレートエンジン)を基盤としている
- 基本的な使用方法: 最小限のFlaskアプリケーション:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!'
if __name__ == '__main__':
app.run(debug=True)
- 主要な機能:
- ルーティング:URLパターンを関数にマッピング
- テンプレートレンダリング:Jinja2を使用
- リクエストハンドリング:GETやPOSTなどのHTTPメソッドの処理
- セッション管理:ユーザーセッションの処理
- エラーハンドリング:カスタムエラーページの作成
- 拡張機能:
- Flask-SQLAlchemy:データベース操作
- Flask-WTF:フォーム処理
- Flask-Login:ユーザー認証
- Flask-RESTful:RESTful API作成
- デプロイメント:
- 開発サーバー:
flask run
コマンドで起動 - 本番環境:Gunicorn、uWSGIなどのWSGIサーバーと組み合わせて使用
- 使用例:
- 小規模なWebアプリケーション
- RESTful API
- シングルページアプリケーションのバックエンド
- プロトタイピングや学習用プロジェクト
- 利点:
- 学習が容易
- 高速な開発
- カスタマイズ性が高い
- 大規模プロジェクトにも拡張可能
- 注意点:
- デフォルトでは一部の機能(ORM、フォーム検証など)が含まれていないため、必要に応じて拡張機能を追加する必要がある
- 大規模プロジェクトでは、適切な構造化とモジュール化が重要
Flaskは、その簡潔さと柔軟性から、多くの開発者に好まれています。特に、小規模から中規模のプロジェクトや、APIの開発に適しています。
デプロイ
先日作成したGCPリソースに対して、下記のコマンドを実行します。
# ssh接続
gcloud compute ssh flask-vm --zone=us-west1-a --project=terraform-20240707
# ファイル作成
nano app.py
app.pyのファイル内容は下記になります。
$ cat app.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_cloud():
return 'Hello Cloud!'
app.run(host='0.0.0.0')
# アプリの実行
python3 app.py
下記のように出力されていれば成功です。
$ python3 app.py
* Serving Flask app 'app'
* Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on all addresses (0.0.0.0)
* Running on http://127.0.0.1:5000
* Running on http://10.0.1.2:5000
Press CTRL+C to quit
動作確認
別のターミナルを起動して、下記のコマンドを実行します。
# ssh接続
gcloud compute ssh flask-vm --zone=us-west1-a --project=terraform-20240707
# アプリにリクエスト
curl http://0.0.0.0:5000
下記のような出力になれば成功です。
$ curl http://0.0.0.0:5000
Hello Cloud!
解説
app.py
このPythonコードは、基本的なFlaskウェブアプリケーションを作成しています。以下に各行の詳細な説明を提供します:
from flask import Flask
- Flaskフレームワークから
Flask
クラスをインポートしています。 - これはアプリケーションのメインオブジェクトを作成するために必要です。
app = Flask(__name__)
- Flaskアプリケーションのインスタンスを作成しています。
__name__
は現在のモジュールの名前を表すPythonの特殊変数です。- これにより、Flaskはテンプレートやスタティックファイルの場所を正しく特定できます。
@app.route('/')
- デコレータを使用して、ルートURL (‘/’)へのHTTPリクエストをこの関数にマッピングしています。
- つまり、ウェブサイトのホームページにアクセスした時にこの関数が呼び出されます。
def hello_cloud():
- ルートURLにアクセスした時に実行される関数を定義しています。
return 'Hello Cloud!'
- この関数は単純に文字列 ‘Hello Cloud!’ を返します。
- これがブラウザに表示されるコンテンツになります。
app.run(host='0.0.0.0')
- Flaskの開発用サーバーを起動します。
host='0.0.0.0'
は、サーバーがすべてのパブリックIPアドレスでリッスンすることを指定しています。- これにより、同じネットワーク上の他のデバイスからもアプリケーションにアクセスできるようになります。
注意点:
- このコードは開発環境用です。本番環境では、Gunicornなどの本格的なWSGIサーバーを使用するべきです。
- セキュリティ上の理由から、
app.run(host='0.0.0.0')
の使用は注意が必要です。本番環境では適切なセキュリティ設定が必要です。 - デフォルトでは、Flaskは5000番ポートで実行されます。
このアプリケーションを実行すると、ローカルネットワーク上のどのデバイスからでも、ブラウザでhttp://<サーバーのIP>:5000
にアクセスすることで “Hello Cloud!” というメッセージが表示されます。
おわりに
今日は、 terraformで作成したリソースにFlaskアプリをデプロイする方法について解説しました。
よっしー
何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
コメント