Cloud Functions概要【GCP】
Cloud Functionsとは
イベント駆動なサーバレス実行環境です。
指定したイベントの発生に呼応して、軽量な関数を、フルマネージド環境で実行させることができます。サーバのメンテナンスは不要です。
対応言語は、「Node.js(JavaScript)」「Python」「Go」です。(2019年8月時点)
複数のGoogle Cloudサービスと接続することが可能で、Cloud Functions自体がGoogleアカウントの認証にアクセスできるため、他のGCPサービスの認証をシームレスに行えます。
課金体系は、実行回数に応じて請求金額を算出する方式であり、月200万回までは無料で利用できます。待機時間に対する課金もないのが特徴です。
ただし、Cloud Functionsには制限があり、実行時間は最大540秒、割り当てメモリは最大2048MBと指定されているため、重い処理を行う関数には向きません。
イベント
2種類のイベントに対応します。
- HTTPリクエスト
- バックグラウンド通信
デプロイ
関数はGoogle Cloud Storageにアップロードされて初めて実行対象となることができます。
関数をデプロイするために、3つの方法が提供されています。
- ローカルから
- gcloudコマンドを使います。
- 関数が書かれたファイルと同じ階層でコマンドを実行します。
gcloud beta functions deploy <NAME> <TRIGGER>
- ソース管理ツールから
- GCPコンソールから
コール
バックグラウンドの場合は、イベントとして登録したCloud Storageなどのトリガーに従って実行されます。
HTTPリクエストの場合、プログラムからのAPIキックはもちろん、curlコマンドにも対応しています。
curl -X POST https://<YOUR_REGION>-<YOUR_PROJECT_ID>.cloudfunctions.net/helloHttp -H "Content-Type:application/json" --data '{"name":"Keyboard Cat"}'
ログ
関数内で出力するログは、次の方法で確認することができます。
- GCPコンソール (Stackingdriver UI)
- gcloudコマンド
gcloud beta functions logs read <FUNCTION_NAME>
- 関数名を指定しないパターン、オプションを指定するパターンがあります。
- Logging API
Tips
HTTPリクエストの場合はHTTPレスポンスを必ず返す
HTTPリクエストによるトリガーの場合、HTTPレスポンスがないと、関数がタイムアウトするまで実行される可能性があります。
こうなると、タイムアウトまでの時間が課金され続けることになってしまいます。
グローバル変数を定義して、うまく再利用する
グローバルスコープに定義された変数は、キャッシュされます。
外部ライブラリの参照やネットワーク接続結果、内容の変わらない重い処理を代入する変数はグローバルに定義することで、パフォーマンスを大幅に改善できることがあります。
ただし、グローバルに変数を定義すると、初期化コードは常にコールドスタートの呼び出しによって実行されるため、関数の実行時間が長くなることがあります。
全てのコードパスで使用されていない変数の場合、遅延初期化を行うことを検討します。
そのほかは公式ドキュメントを参照。