FlaskアプリをGCP Cloud Functionsで動かす!初心者向けサーバーレス公開ガイド
生徒
「PythonのFlaskで小さなプログラムを作ったのですが、これをサーバーレスで動かしたいです。GCPのCloud Functionsって初心者でも使えますか?」
先生
「Cloud Functionsは、サーバーの管理を一切気にせずに、特定の処理だけをサッと動かせる魔法のようなサービスです。Flaskとの相性も抜群ですよ。」
生徒
「サーバーレスって、サーバーがないってことですか?」
先生
「物理的なサーバーがないわけではなく、私たちがその存在を意識しなくていいという意味です。早速、仕組みと使い方を学んでいきましょう!」
1. GCPとCloud Functionsの基本をマスターしよう
まずは、今回登場する主役たちの紹介です。GCP(ジーシーピー)とは「Google Cloud Platform」の略で、Googleが使っているのと同じ高性能なコンピューター設備を、私たちも借りることができるサービスのことです。検索エンジンやYouTubeを支えている巨大なシステムの一部を使わせてもらうイメージですね。
その中にあるCloud Functions(クラウド・ファンクションズ)は、サーバーレスと呼ばれる仕組みの代表格です。通常のWebサーバーは、誰もアクセスしていない時もずっと動いていて料金がかかりますが、Cloud Functionsは「誰かがアクセスした瞬間だけパッと起動して、仕事が終わればすぐに眠りにつく」という特徴があります。これにより、無駄な電気代(料金)を極限まで抑えることができるのです。
2. Flaskアプリを関数として定義する準備
Cloud FunctionsでFlaskを動かすとき、少しだけ書き方にコツがあります。普段のFlaskアプリは自分自身がサーバーとして動こうとしますが、Cloud Functionsでは「リクエスト(お願い)」を受け取って「レスポンス(お返事)」を返す一続きの関数として定義します。
まず、メインとなるプログラム「main.py」を作成しましょう。ここでは、誰かがアクセスしたときに挨拶を返すプログラムを作ります。
import functions_framework
from flask import Flask, request
# クラウド上で動くための特別な設定です
@functions_framework.http
def hello_world(request):
"""
リクエストを受け取って挨拶を返すだけのシンプルな関数
"""
# ブラウザから送られてきたデータを確認することもできます
request_json = request.get_json(silent=True)
request_args = request.args
if request_json and 'name' in request_json:
name = request_json['name']
elif request_args and 'name' in request_args:
name = request_args['name']
else:
name = 'ゲスト'
return f"こんにちは、{name}さん!これはGCP Cloud Functionsから届いたメッセージです。"
このプログラムでは、hello_worldという関数を作りました。これがCloud Functionsにおける「入り口」になります。functions_frameworkという道具を使うことで、Flaskの便利な機能をそのままクラウドに持ち込むことができます。
3. 必要な道具リスト requirements.txt の作成
次に、Googleのコンピューターに「このプログラムを動かすにはこれらの材料が必要です」と伝えるためのリストを作ります。ファイル名は必ず「requirements.txt」にする必要があります。これがないと、Googleは「Flaskって何?」と困ってしまいます。
functions-framework==3.*
Flask==3.0.0
このように、使いたい道具(ライブラリ)の名前とバージョンを書いておきます。これをプログラムと同じフォルダに入れておくだけで、デプロイ時にGoogleが自動的にすべてを揃えてくれる仕組みになっています。初心者の方でも、これなら簡単ですね!
4. データの受け取りと計算を行うプログラム例
せっかくなので、もう少し実用的なプログラムも見てみましょう。例えば、送られてきた数字を足し算して結果を返すアプリを作ってみます。Cloud Functionsは、こうした「ちょっとした計算処理」をさせるのに非常に向いています。
import functions_framework
from flask import jsonify
@functions_framework.http
def add_numbers(request):
# パラメータからaとbという数字を受け取ります
params = request.args
num1 = int(params.get('a', 0))
num2 = int(params.get('b', 0))
kekka = num1 + num2
# JSONという形式で整えて返します
data = {
"ans": kekka,
"message": "計算が完了しました!"
}
return jsonify(data)
このように、URLの末尾に「?a=10&b=20」と付けてアクセスすると、自動的に計算して結果を返してくれるようになります。これがクラウド連携の第一歩です。自分のパソコンだけでなく、インターネットを介して世界中のどこからでも計算を依頼できるようになるのです。
5. GCPコンソールから手動でデプロイする方法
デプロイとは、自分の作ったプログラムをGoogleのサーバーへ配置して、本番公開することです。一番簡単な方法は、ブラウザでGCPの管理画面(コンソール)を開いて操作する方法です。
まず、GCPコンソールで「Cloud Functions」を検索し、「関数を作成」ボタンを押します。関数の名前を決め、リージョン(サーバーの場所)を「asia-northeast1(東京)」に設定しましょう。次に「ランタイム」でPythonを選択します。すると、コードを直接貼り付ける画面が出てくるので、先ほど作ったプログラムをコピーして貼り付けるだけです!
最後に「デプロイ」ボタンを押して、緑色のチェックマークが出るまで待ちます。これで、世界に一つだけのURLが発行されます。そのURLをブラウザに貼り付ければ、あなたの作ったFlaskアプリが動いているのが確認できるはずです。
6. 条件分岐を使った賢いお返事アプリ
プログラムの面白さは、条件によって動きを変えられることです。今度は、時間帯によって挨拶を変えるような少しだけ複雑なコードを作ってみましょう。これもCloud Functionsで動かすことができます。
import functions_framework
from datetime import datetime
import pytz
@functions_framework.http
def time_greeting(request):
# 日本時間を取得します
tokyo = pytz.timezone('Asia/Tokyo')
now = datetime.now(tokyo)
hour = now.hour
if 5 <= hour < 11:
aisatsu = "おはようございます!朝の作業は捗りますね。"
elif 11 <= hour < 18:
aisatsu = "こんにちは!午後のひととき、いかがお過ごしですか?"
else:
aisatsu = "こんばんは!今日もお疲れ様でした。"
return f"現在の東京の時刻は {hour}時です。{aisatsu}"
このように、外部のライブラリ(pytzなど)を使って時刻を取得し、それに応じてメッセージを切り替えることも可能です。もちろん、requirements.txtに「pytz」を追加するのを忘れないようにしましょう。こうした小さな工夫が、ユーザーにとって使いやすいアプリにつながります。
7. セキュリティと認証の設定に注意!
クラウドに公開する際に絶対に忘れてはいけないのが、セキュリティの設定です。Cloud Functionsを作成するとき、デフォルトでは「認証が必要」という設定になっていることがあります。これは「許可された人しか見られませんよ」という鍵がかかった状態です。
もし、誰でも見られる公開サイトにしたい場合は、設定の「未認証の呼び出しを許可」にチェックを入れる必要があります。ただし、悪意のある人に勝手に使われて料金が高くならないよう、テストが終わったら設定を見直したり、関数の実行回数に制限をかけたりすることも大切です。初心者の方は、まずは「誰でも見られる設定」で動く喜びを知り、次に「守る方法」を学ぶのがおすすめです。
8. HTMLを返してWebページらしく見せる技
これまでは文字だけを返してきましたが、Flaskの力を使えば、色鮮やかなWebページ(HTML)を表示させることもできます。Cloud Functionsの中でも、HTMLのコードを書いて戻り値として渡すことが可能です。
import functions_framework
@functions_framework.http
def colorful_page(request):
html_content = """
<div style="background-color: #f0f8ff; padding: 20px; border-radius: 10px; font-family: sans-serif;">
<h1 style="color: #ff4500;">Cloud Functions 公開中!</h1>
<p>Flaskを使えば、こんな風にデザインしたページも表示できるんです。</p>
<button onclick="alert('クリックされました!')">ここを押してね</button>
</div>
"""
return html_content
このように記述すれば、アクセスした瞬間にボタン付きのきれいな画面が表示されます。本格的なWebサイトを作りたい場合は、テンプレートファイルという仕組みを使いますが、まずはこのようにプログラムの中にHTMLを直接書いてみることから始めると、仕組みがよく分かります。
9. エラーが出たときの対処法(ログの読み方)
もしデプロイに失敗したり、アクセスしても「Error」とだけ表示されたりしても、パニックにならないでください。クラウドの世界にはログという、コンピューターの活動記録が残っています。GCPコンソールの「ログを表示」という項目をクリックしてみましょう。
そこには、どこでプログラムが止まったのかが詳しく記されています。例えば「ImportError」なら道具が足りないサイン、「SyntaxError」なら書き間違いのサインです。初心者にとってログを読むのは少し大変ですが、このエラーメッセージをコピーして検索エンジンで調べれば、世界中の誰かが解決策を教えてくれています。こうしたトラブル解決の経験こそが、あなたを一人前のエンジニアへと成長させてくれるのです。