GCP のサーバーレスコンピューティングサービスである、 Cloud Functions について、 Python で動作させるためのチュートリアル、Python クイックスタートについて解説していきます。
事前準備1、事前準備2が完了していることが前提となりますので、そちらがまだの場合は是非先にご参照ください。
なお、各見出しに対応するチュートリアルページへのリンクを設定しています。
関数を作成する
GCP コンソール左上のハンバーガーメニューを下にスクロールしていくと、「サーバーレス」セクションの中に「Cloud Functions」がありますので、これをクリックして、 Cloud Functions を作成していきます。
余談ですが、ピンアイコンをクリックすることで、そのサービスがリストの上に固定表示されるようになります。GCP のサービスは数も多いので、よく使うサービスの場合はピン留めしておくと便利です。
「関数を作成」をクリックします。
次に、関数の基本情報を設定します。チュートリアルに記載されている内容に従って必要な項目を埋めていきます。チュートリアル上の手順6番までを実施することになります。
「リージョン」に関しては、後から変更できないため、適切なものを検討した上で選択してください。
なお「ランタイム、ビルド、接続の設定」はこのタイミングでは特に変更する必要はありません。「保存」をクリックした後、画面の一番下に出現する「次へ」ボタンをクリックして関数のコードを記載する画面を表示します。
ここでは、チュートリアルの残りの手順(7、8)を実施していきます。
手順が前後してしまいますが、まずは「ランタイム」プルダウンから使用したいランタイムを選択します。ここでは、Python 3.9 を選択して進めていきます。
ランタイム選択前はデフォルトの Node.js 14 に関するコードが表示されていましたが、Python 3.9 選択後は Python 3.9 のものに更新されます。
サンプルコードの内容
チュートリアルでは触れられていませんが、ここで簡単にサンプルコードの内容を見ていきます。
main.py
# main.py def hello_world(request): 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 の関数は基本的に Web の API として動作することを想定していて、デフォルトで用意されているものはFlaskフレームワークを用いています。このチュートリアルでは ここで定義した hello_world というエンドポイントをデプロイすることになり、API 呼出し時の情報は request 変数に格納されることになります。
最初に、 request_json 変数に、呼出し時の情報を JSON化します。
次に、API呼出し情報にパラメータがあり、そのパラメータ名が message なら、そのmessageパラメータに指定された内容をそのまま呼出し元に返すようにしています。
同様に、JSON化した際に、message が存在した場合にも同様の処理を施すようにしています。前者がGETによるクエリパラメータへの対応で、後者がJSON形式でのPOSTへの対応となっています。(後ほど、それぞれテスト動作させてみます)
API呼出し情報に message パラメータが存在しない場合は、Hello World! を返します。
requirements.txt
初期段階では本ファイルはコメント行があるのみの状態です。
関数をデプロイする
デプロイするには画面下部の「デプロイ」をクリックします。
デプロイには1〜2分ほどかかります。デプロイが完了すると、以下の様にリスト表示されます。それでは、デプロイした関数をテストして動作をみていきます。「操作」列の3点リーダーをクリックして、「関数をテスト」をクリックします。
関数をテストする
テスト画面が表示されます。まずは、そのまま、「関数をテストする」をクリックしてみます。これは、パラメータなしで関数を呼び出すことになりますので、さきほどコードを見たとおり、 Hello World! が返ってくることが期待値になります。
テストが完了すると、「出力」と「実行ログ」が表示されます。期待値通り、 Hello World! と表示されていることが確認できます。
JSON形式POST
次に、JSON形式のPOSTをした場合の動作をテストしてみます。message パラメータに指定された内容がそのまま返ってくることが期待値になります。
こちらも期待どおりの動作が確認できます。
エンドポイントへのGET確認
チュートリアルには言及がありませんが、ブラウザでエンドポイントにアクセスして動作を確認してみます。
関数一覧から、関数名をクリックして「関数の詳細」を表示します。
「トリガー」タブを選択すると、エンドポイントのURLが記載されていますので、これをコピーしてブラウザに貼りつます。
パラメータ指定がないため、 期待値の Hello World! が表示されました。
パラメータを指定してみます。こちらも期待通りの結果となりました。
ログを表示する
テスト実施時のログを確認してみます。関数一覧のページの操作列、「ログを表示」をクリックします。
各種ログが表示されます。赤枠で囲った「クエリ」部分に、プロジェクトやCloud Functions といった情報であらかじめフィルタリングされた状態でログが表示されています。
関数を削除する
最後に、チュートリアルには言及がありませんが、関数を削除します。チュートリアルということもあり、未認証でもアクセスできてしまう状態で進めていますので、忘れない内に削除しておかないと、何かがきっかけで想定外の請求が来てしまいかねないリスクは回避したいところです。Cloud Functions では、有効・無効を切り替えるようなことはできないようなので、削除することにします。
関数一覧のページの、操作列「削除」をクリックします。
「削除」をクリックします。削除してしまうと関数内のコードは失われてしまうので、必要に応じて手元にコピーするなどバックアップ対策を講じてください。
なお、一時的に無効化する Tips としては、単純にコード全体をコメントアウトするのが現実解のようです。
参考:
まとめ
Cloud Functions に関して、事前準備〜関数の作成、デプロイ、テスト、ログ確認〜関数の削除、といった一連の流れを試してきました。私自身、Python クイックスタートを見た際、「分量も少ないし簡単そう」と思っていましたが、いざイチから始めようとすると、行間に散りばめられた諸々に思ったより苦労しました。一度流れを理解してしまえば、その後はスムーズに開発できるようになると思いますので、私自身が苦労した点が(特に初めて Cloud Functions にふれる方の)参考になれば幸いです。