プログラムを外部に公開する時、必ず必要なものって何でしょうか?
そう、実行環境、つまりはサーバーです!
しかし、サーバを用意しなくてもプログラムを実行する環境を、GCPやAWSなどのパブリッククラウドサービスは提供してくれます。それがサーバレスサービスです。
サーバレスで関数を単体で実行できるサービスなので、Function as a Service、略してFaaSとも呼ばれます。
今回のテーマはこちら!
今回はGCPの無料枠で、Pythonをサーバレスで実行してみようと思います。
Cloud Functions HTTP関数の作成
以下をクリックして、Cloud Functionsの画面を開き、関数を作成します。
以下を設定します。
- 名前:好きな名前
- リージョン:asia-northeast1(Tokyo)
- トリガー: HTTP 、未認証の呼び出しを許可にチェック
次へをクリックして、
- ランタイム: Python3.7
を選択します。
以下のような雛形ができればOKです!
HTTPトリガーで、Python3.7ランタイムを選択すると、以下のようなプログラムがデフォルトで書かれています。
flask.Request
を用いて、HTTPのGETパラメータのmessage、またはPOSTパラメータからmessageを取得し、そのままreturnするプログラムです。パラメータにmessageがなければ、'Hello World!'を返しています。
def hello_world(request): """Responds to any HTTP request. Args: request (flask.Request): HTTP request object. Returns: The response text or any set of values that can be turned into a Response object using `make_response <http://flask.pocoo.org/docs/1.0/api/#flask.Flask.make_response>`. """ request_json = request.get_json() if request.args and 'message' in request.args: return request.args.get('message') elif request_json and 'message' in request_json: return request_json['message'] else: return f'Hello World!'
とりあえずこのままデプロイして、どのような結果になるのかを見ていきましょう!
画面下部の[デプロイ]をクリックします。
Cloud Functionsの以下の画面に作成した関数が表示されればデプロイ成功です!
Cloud Functions HTTP関数を呼び出ししてみる。
関数一覧から関数名をクリックし、[トリガー]タブをクリックします。
以下の画面でHTTP関数のトリガーURLを確認しましょう。
https://[リージョン]-[GCPプロジェクトID].cloudfunctions.net/[関数名]
という規則のURLです。
Cloud Shellなどのターミナルでcurlを実行して、関数を呼び出ししてみます。
$ # GET $ curl https://[リージョン]-[GCPプロジェクトID].cloudfunctions.net/[関数名] Hello World! $ # GET messageパラメータつき $ curl https://[リージョン]-[GCPプロジェクトID].cloudfunctions.net/[関数名]?message=Get_Truefly Get_Truefly $ # POST messageパラメータつき $ curl -X POST -H "Content-Type: application/json" -d'{"message":"Post Truefly"}' https://[リージョン]-[GCPプロジェクトID].cloudfunctions.net/[関数名] Post Truefly
GCPの関数の画面の[ログ]タブで、アクセスログが確認できました!
未認証の呼び出しを許可しているので、悪意のあるリクエストを受け取らないように、
確認が取れたらHTTP関数は削除しておきましょう!
どこがサーバレスなの?
以上、簡単にHTTP関数を実装できるのがわかりましたが、どの辺がサーバレスなのでしょうか? Cloud Functionsの特徴について見ていきましょう!
簡単な設定とプログラムをデプロイするだけでよい
使う側は、HTTPなどのトリガーと、Python3.7などのランタイム、他割り当てメモリ、タイムアウト、ネットワーク、環境変数などの簡単な設定のみをするだけでプログラムを公開することができます!
サーバ公開時の面倒なOS内の設定、ミドルウェアのインストールが不要で、高速でプログラムをデプロイできるのが利点です
トリガーされた時だけ稼働する
関数は呼び出されたときだけインスタンスがアクティブとなります。呼び出しされていない時間は非アクティブってことですね。一方で通常のサーバは、いつアクセスが来てもいいように常時起動をしていなければなりません。
どういう時に使えそう?
私がCloud Functionsを利用してよく実装するのは以下の3つです!
HTTPのAPIの作成
HTTPをトリガーに、リクエストのパラメータを受け取り、値を返すことができるHTTP関数は、Webサーバがなくても単体のAPIを実装して公開できるのでとっても便利です!
ストレージのファイナライズトリガーでバッチ処理
GCPのストレージサービス、Cloud Storageの指定したバケットにファイルが置かれると、関数を実行 するといったトリガー設定ができます。
特に不定期にデータが連携されるのであれば、スケジュール実行よりもイベントトリガーのほうが実装もしやすくなります。
スケジュール実行の簡単な処理
Cloud Functionsは、Clous Schedulerなどの別のスケジュール実行処理から呼び出しすることで、決められたタイミングで処理を実行することができます。個人利用で毎日、毎時プログラムを実行したいといったときは、Cloud Functionsを無料枠の範囲で利用できるのが非常に重宝しています。
まとめ
今回はサーバレスの入門ということで、GCPのCloud FunctionsにPythonのHTTP関数をデプロイするというチュートリアルをご紹介しました。
実際はサーバは稼働しているのに、サーバがないかのようにうごくサーバレスサービスは、まさにクラウドサービスの醍醐味の一つです。
次回以降は、
- Cloud Schedulerによるスケジュール実行方法
- Cloud Functionsを使って実際に自分で作ったアプリケーションをデプロイするして活用する方法
についてご紹介します!