とりゅふの森

GCPデータエンジニアとして生きる

【Google Cloud Functions】Pythonでサーバレスサービスに入門してみる【FaaS】

f:id:true-fly:20210824230745p:plain

プログラムを外部に公開する時、必ず必要なものって何でしょうか?
そう、実行環境、つまりはサーバーです!

しかし、サーバを用意しなくてもプログラムを実行する環境を、GCPやAWSなどのパブリッククラウドサービスは提供してくれます。それがサーバレスサービスです。
サーバレスで関数を単体で実行できるサービスなので、Function as a Service、略してFaaSとも呼ばれます。

今回のテーマはこちら!

GCPのサーバレスサービス、Google Cloud Functionsを使って、PythonのHTTP関数を実行してみよう

今回はGCPの無料枠で、Pythonをサーバレスで実行してみようと思います。

Cloud Functions HTTP関数の作成

以下をクリックして、Cloud Functionsの画面を開き、関数を作成します。

console.cloud.google.com

以下を設定します。

  • 名前:好きな名前
  • リージョン:asia-northeast1(Tokyo)
  • トリガー: HTTP 、未認証の呼び出しを許可にチェック

f:id:true-fly:20210823225925p:plain

次へをクリックして、

  • ランタイム: Python3.7

を選択します。
以下のような雛形ができればOKです!

f:id:true-fly:20210823231434p:plain

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の以下の画面に作成した関数が表示されればデプロイ成功です!

f:id:true-fly:20210824222817p:plain

Cloud Functions HTTP関数を呼び出ししてみる。

関数一覧から関数名をクリックし、[トリガー]タブをクリックします。
以下の画面でHTTP関数のトリガーURLを確認しましょう。
https://[リージョン]-[GCPプロジェクトID].cloudfunctions.net/[関数名]という規則のURLです。

f:id:true-fly:20210824223019p:plain

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の関数の画面の[ログ]タブで、アクセスログが確認できました! f:id:true-fly:20210824224055p:plain

未認証の呼び出しを許可しているので、悪意のあるリクエストを受け取らないように、
確認が取れたらHTTP関数は削除しておきましょう!

どこがサーバレスなの?

以上、簡単にHTTP関数を実装できるのがわかりましたが、どの辺がサーバレスなのでしょうか? Cloud Functionsの特徴について見ていきましょう!

簡単な設定とプログラムをデプロイするだけでよい

使う側は、HTTPなどのトリガーと、Python3.7などのランタイム、他割り当てメモリ、タイムアウト、ネットワーク、環境変数などの簡単な設定のみをするだけでプログラムを公開することができます!
サーバ公開時の面倒なOS内の設定、ミドルウェアのインストールが不要で、高速でプログラムをデプロイできるのが利点です

トリガーされた時だけ稼働する

関数は呼び出されたときだけインスタンスがアクティブとなります。呼び出しされていない時間は非アクティブってことですね。一方で通常のサーバは、いつアクセスが来てもいいように常時起動をしていなければなりません。

通常はサーバが起動していない状態ですが、トリガーされた時だけ処理が走り、トリガーされた時だけ課金が発生する(無料枠あり)のが、サーバレスと言われるサービスの特徴です!

f:id:true-fly:20210824224625p:plain

どういう時に使えそう?

私がCloud Functionsを利用してよく実装するのは以下の3つです!

HTTPのAPIの作成

HTTPをトリガーに、リクエストのパラメータを受け取り、値を返すことができるHTTP関数は、Webサーバがなくても単体のAPIを実装して公開できるのでとっても便利です!

GCPのIAMや、サーバレスVPCコネクタという、VPCネットワークに接続できる機能を用いると、内部向けのHTTP APIとしても安全に利用できます。

ストレージのファイナライズトリガーでバッチ処理

GCPのストレージサービス、Cloud Storageの指定したバケットにファイルが置かれると、関数を実行 するといったトリガー設定ができます。

例えば外部からデータをCloud Storageに連携してもらったタイミングでCloud Functionsを実行し、置かれたファイルをCloud SQLやBigQueryといったデータストレージにロードする、といった使い方ができます!

特に不定期にデータが連携されるのであれば、スケジュール実行よりもイベントトリガーのほうが実装もしやすくなります。

スケジュール実行の簡単な処理

Cloud Functionsは、Clous Schedulerなどの別のスケジュール実行処理から呼び出しすることで、決められたタイミングで処理を実行することができます。個人利用で毎日、毎時プログラムを実行したいといったときは、Cloud Functionsを無料枠の範囲で利用できるのが非常に重宝しています。

まとめ

今回はサーバレスの入門ということで、GCPのCloud FunctionsにPythonのHTTP関数をデプロイするというチュートリアルをご紹介しました。
実際はサーバは稼働しているのに、サーバがないかのようにうごくサーバレスサービスは、まさにクラウドサービスの醍醐味の一つです。
次回以降は、 - Cloud Schedulerによるスケジュール実行方法 - Cloud Functionsを使って実際に自分で作ったアプリケーションをデプロイするして活用する方法

についてご紹介します!