【GCP】PythonでCloud Functions

はじめに

GCPのCloud FunctionsでPythonを実行する方法を紹介していきます。

Cloud Functionsとは

Cloud Functionsは、サーバーレスでコードを実行できるFaaS(Functions as a Service)です。

トリガー

関数を実行するトリガーは大きく2つのタイプがあります。

  • HTTPトリガー
  • イベントトリガー

HTTPトリガーは、関数のURLにリクエストを送ると実行されます。

イベントトリガーは、GCPのプロジェクト内のイベントに応じて実行されます。実行されるイベントは以下の通りです。

  • Cloud Pub/Sub
  • Cloud Storage
  • gcloud functions callコマンドによる直接呼び出し
  • Cloud Firestore
  • Firebase向けアナリティクス
  • Firebase Realtime Database
  • Firebase Authentication

料金

Cloud FunctionsはCloud Buildで実行可能イメージに変換、Container Registryにイメージを格納しています。そのため、以下の3つの料金を確認する必要があります。

  • Cloud Functions
  • Cloud Build
  • Container Registry
料金  |  Cloud Functions  |  Google Cloud
Cloud Functions の料金情報を確認する
Cloud Build の料金  |  Cloud Build のドキュメント  |  Google Cloud
料金  |  Container Registry  |  Google Cloud
Container Registry の料金を確認する

Cloud Functionsの無料枠は以下の条件になります。

  • 200万回/月の呼び出し
  • 400,000 GB 秒・200,000 GHz 秒のコンピューティング時間
  • 5GB/月の下りトラフィック

無料枠は変更されている可能性があるため、公式ドキュメントの確認をお願いします。

しかし、デプロイするとContainer Registryに保存されるのでので毎月多少の料金が発生します。デプロイの料金に関しては、以下を参照してください。

料金  |  Cloud Functions  |  Google Cloud
Cloud Functions の料金情報を確認する

利用する前に

利用するにはCloud FunctionsCloud BuildのAPIを有効化する必要があります。

関数の作成

こちらから「関数を作成」をクリックします。

関数の設定をします。

今回は以下のように設定しました。

  • 関数名:python-function
  • リージョン:asia-northeast1(東京)
  • トリガーのタイプ:HTTP
  • 認証:未認証の呼び出しを許可
  • HTTPS:HTTPS必須

リージョンごとで料金設定が変わるみたいです。

Cloud Functions のロケーション  |  Google Cloud Functions に関するドキュメント

次に実行する関数を実装します。

ランタイムを選択することでテンプレとなる関数が表示されます。「エントリポイント」に記載されているのが、このCloud Functionsで実行される関数になります。

下記がPythonを選択したときのテンプレコードになります。引数のrequestはFlaskのrequestオブジェクトです。

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 <https://flask.palletsprojects.com/en/1.1.x/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!'

Flaskのrequestオブジェクトについてはこちら

【Flask】簡単なAPIを実装
はじめにFlaskを使って簡単なAPIを実装したいと思います。フォーム、JSON、クエリストリングから値の取得方法についても紹介していきます。FlaskとはFlaskとは、Python製の軽量なWebアプリケーションフレームワークで...

デプロイ

関数の実装が完了したら「デプロイ」します。

デプロイが完了すると一覧に表示されます。

テスト

デプロイした関数をテストしてみます。

関数の一覧もしくは関数の詳細画面からテストを実行できます。実行すると下部に結果とログが表示されます。

実行

実際に外部から実行できるか試してみます。ここでは、Postmanを使って実行してみます。

まずはURLを関数の詳細画面から確認します。

Postmanを使って確認したURLを叩いてみます。

テストと同様の結果が返ってきました。

まとめ

GCPのCloud Functionsを使ってPythonの関数を実行してみました。

参考

タイトルとURLをコピーしました