GCPのコンピューティングリソースは3個あって、GCE(IaaS)、GAE(PaaS)を試していたけど、今回はGCF Google Cloud Functionsを試してみた。
GCPのコンピューティングリソースのおさらい。
GCE:仮想マシンまるごと。 自由度が高いが、OS以上のレイヤーは全てユーザが管理する必要があり、クラウドらしい利点が少ない。
GAE:アプリケーション実行環境。 自由度は下がるが、OSなど気にする必要が無く、アプリケーションディレクトリだけを投げ込む様なイメージ。
GCF:スクリプト実行環境。 GAEでは複数ファイルにより構成されたアプリケーションが実現できるのに対して、GCFは唯一のスクリプトを編集して実行させる。 自由度が下がるが、完全にコードを書くだけで良い。
そんなわけで、GCFはWebアプリケーション的なテンプレートとか画像リソースとかを持つことが出来ない。 やろうと思えば、ストレージリソースにファイルを配置してそれをコード中で利用するとかすれば出来るけど、そんなのするならGAEだろう。 と言う事で、その名の通りFunctionを実現するのに適している。
このFunctionは、HTTP経由以外にGCPの各種サービスでトリガできるので、StorageやFirebaseのRealtime Databaseとかのイベントで開始できる。 Storageにファイルがアップされたら自動で処理するとか、RDBに書き込まれたら通知するとかが出来る。
今回はシンプルにHTTPトリガで作成。
Cloud Functionsの管理画面で関数の作成を選ぶと、名前、割り当てメモリ、トリガー、ソースコード&ランタイム選択がある。 ランタイムはNode.js 6がプロダクトで、8とPython3.7がベータリリース。
割り当てメモリによってCPUリソースなども自動でセットになって料金が決まる。 但し、基本的に実行時間・回数ベースの課金なので使わなければ殆どお金はかからないし、使っても非常に安い。 Always Freeの対象でもあり、ちょっとしたアプリのバックエンドとしてはほぼ無課金で使える。
HTTPタイプのトリガにすると自動でURLが生成される。 https://{リージョン}-{プロジェクト名}.cloudfunctions.net/{Function名}と言うURLでGoogle推奨通り証明書が自動で出来ている。
ソースコードはブラウザ上で編集可能で、Node.js 6ランタイムを選んでいる状態で、index.jsとpackage.jsonが編集可能。 package.jsonで使いたいライブラリとかを定義して、index.jsでコードを書く。
まずは、package.json
1 2 3 4 5 6 7 |
{ "name": "myfunction-http", "version": "0.0.1", "dependencies": { "@google-cloud/datastore": "1.4.0" } } |
これでgoogle-cloud-datastore 1.4.0が入る。
そして、プログラム本体のindex.jsを記述。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
const Datastore = require('@google-cloud/datastore'); const datastore = Datastore(); exports.getList= function getList(req, res) { const query = datastore.createQuery('mydatastore'); query.run(function(err, entities, info){ str = '' entities.forEach(function(v){ str += "<li>"+v[datastore.KEY].id + ":"+v['subject']+"</li>" } ); res.status(200).send(str); }); }; |
ごく普通のnode.jsコードでOK。 関数をexportsに入れてやる。 GCF管理画面で実行する関数を入力できるので、ワンセットのソースを1ファイルで作っておいて、各Functionごとに呼び出す関数を設定することも出来る(exports.deleteItemとか作っておいて共通のソースでGCFのFunctionの紐付けだけ変える)
で、後は作成ボタンをクリックすれば数分後には先ほどのURLでこのコードが動くようになっている。
この場合はお試しで、Datastore DB上のmydatastoreのエンティティ一覧をliで表示してる。 GCF的にアプリのバックエンドだから普通はJSONとかにするだろう。 GCPのサービスを直接クライアントアプリから繋ぎたくないけど、簡単にサービスを利用したいとか、ちょっと処理をしてデータを入出力したいとか言うのに非常に便利だ。 Webに仕込んだJSでデータ収集とかするのにGCPの認証情報を埋めるのはマズイので、収集用のFunctionを作っておいてjQueryとかで簡単にPOSTさせて、管理用のGAEアプリでDatastoreを処理して管理するとかで使える。
とにかく、簡単なスクリプトを書くだけで、環境とかも気にせずにGCPのリソースを処理できるので、手軽なアプリへのインタフェイスとして良いだろう。 また、プログラムを容易に盗めるWebサイト上のJSに処理ロジックを晒したくない時、GCFの中に実装してしまって、JSからはコア機能はGCFをコールして処理して返すとすればプログラム盗用を防げる。
(241)