Hello Google Cloud Functions
AWSのLambda的なものがGoogleにもあった(α版)ので使ってみました。
α版への利用登録
Google Cloud Functionsはまだα版なので利用登録が必要です。
1月前半に申請したのですが、2月後半に「あなたのメールアドレスをホワイトリストに追加したので使ってどうぞ」的なメールが来て使えるようになりました。
APIを有効にする
GCP管理画面のAPI Managerから有効にします。非公開APIなので、ホワイトリストに登録されてないと表示すらされないのかな?
gcloudコマンドからGoogle Cloud Functionsを使えるようにする
gcloudコマンドからα版の機能を使うためのコンポネントをインストールします。
functionをGoogle Cloud Functionsにデプロイするために使います。
gcloud components install alpha
Hello worldを実行する
Google Cloud FunctionsでHello worldを実行してみます。一連の流れは、Google Cloud Functionsのクイックスタートに従っています。
functionの作成
Hello worldするfunctionを作成します。
- 現在nodejsにのみ対応しているようです
まずディレクトリを作成。
mkdir gcf_hello_world
cd gcf_hello_world
次にHello worldするfunctionを作成。
- Cloud Functionsログにメセージを出力するスクリプト
index.js
/**
* Cloud Function.
*
* @param {object} event The Cloud Functions event.
* @param {function} The callback function.
*/
exports.helloWorld = function helloWorld (event, callback) {
console.log(`My Cloud Function: ${event.data.message}`);
callback();
};
スクリプトを置くバケットの作成
スクリプトを置くバケットを作成します。
PROJECT_ID
: GCPのプロジェクトIDBUCKET_NAME
: Google Cloud Storageのバケット名(S3と同じくグローバルでユニークな名前である必要がある)
gsutil mb -p [PROJECT_ID] gs://[BUCKET_NAME]
functionのデプロイ
作成したバケットにfunctionをデプロイします。
- 構文は以下のような感じ
gcloud alpha functions deploy [ファンクション名] --stage-bucket [BUCKET_NAME] --trigger-topic [トピック名]
- トピック名については後述します
その他オプションや詳細については以下のヘルプコマンドから見ることが出来ます。
gcloud alpha functions deploy --help
実際のコマンドと結果はこんな感じ。メモリのサイズやエントリポイントなどが返されます。
$ gcloud alpha functions deploy helloWorld --stage-bucket lorentzca-gcf-hello --trigger-topic hello_world
Copying file:///var/folders/hq/w_nvyv_964qb05b9yv651vk80000gn/T/tmp3vKatp/fun.zip [Content-Type=application/zip]...
- [1 files][ 270.0 B/ 270.0 B]
Operation completed over 1 objects/270.0 B.
Waiting for operation to finish...done.
Deploying function (may take a while - up to 2 minutes)...done.
availableMemoryMb: 256
entryPoint: helloWorld
eventTrigger:
eventType: providers/cloud.pubsub/eventTypes/topic.publish
resource: projects/ponpokopon-141504/topics/hello_world
latestOperation: operations/cG9ucG9rb3Bvbi0xNDE1MDQvdXMtY2VudHJhbDEvaGVsbG9Xb3JsZC9ldXVWVVJKV2pEVQ
name: projects/ponpokopon-141504/locations/us-central1/functions/helloWorld
sourceArchiveUrl: gs://lorentzca-gcf-hello/us-central1-helloWorld-gzlfdubrnauu.zip
status: READY
timeout: 60s
updateTime: '2017-02-26T14:49:29Z'
トピック名について
ファンクションをデプロイするコマンドのオプションの--trigger-topic
について。
ヘルプを見ると、Pub/Subのトピック名を指定するオプションとある。
Name of Pub/Sub topic. Every message published in this topic will
trigger function execution with message contents passed as input data.
しかしそもそもPub/Subってなんだ!ということで少し調べたのですが、Pub/Subとはメッセージを送受信するためのモデルの一種で、
- パブリッシャー(Pub)がトピックに対しメッセージを送る
- トピックに送られたメッセージは、そのトピックに紐付いている1つもしくは複数のサブスクライバ(Sub)に配信される
- トピックからメッセージを受け取ったサブスクライバが何かしらの処理を実行する
みたいな登場人物と流れのあるモデルなようです。間にトピックが挟まることによって、柔軟なメッセージの受信と処理の流れを作ることができるのが利点なのか...な...?(あんまり理解できてない)
つまり、--trigger-topic
とはどのようなメッセージをトリガーに関数を実行するか設定するオプション、ということなのかな?
動作確認
ちゃんとfunctionが登録されたか、functionの情報を表示させてみます。
$ gcloud alpha functions describe helloWorld
availableMemoryMb: 256
entryPoint: helloWorld
eventTrigger:
eventType: providers/cloud.pubsub/eventTypes/topic.publish
resource: projects/ponpokopon-141504/topics/hello_world
latestOperation: operations/cG9ucG9rb3Bvbi0xNDE1MDQvdXMtY2VudHJhbDEvaGVsbG9Xb3JsZC9ldXVWVVJKV2pEVQ
name: projects/ponpokopon-141504/locations/us-central1/functions/helloWorld
sourceArchiveUrl: gs://lorentzca-gcf-hello/us-central1-helloWorld-gzlfdubrnauu.zip
status: READY
timeout: 60s
updateTime: '2017-02-26T14:49:29Z'
良さそう。
functionを実行する
実行IDが返されます。
$ gcloud alpha functions call helloWorld --data '{"message":"Hello World!"}'
executionId: 5ku6s0rlswil
デプロイしたファンクションは、Cloud Functionsログにメッセージを出力する関数なので、ログを確認してみます。
$ gcloud alpha functions logs read helloWorld
LEVEL NAME EXECUTION_ID TIME_UTC LOG
D helloWorld 5ku6s0rlswil 2017-02-26 15:28:49.049 Function execution started
I helloWorld 5ku6s0rlswil 2017-02-26 15:28:49.361 My Cloud Function: Hello World!
D helloWorld 5ku6s0rlswil 2017-02-26 15:28:49.554 Function execution took 572 ms, finished with status: 'ok'
良さそう!
メッセージを変えて実行してみます。
$ gcloud alpha functions call helloWorld --data '{"message":"I have an apple"}'
executionId: 5ku60cb1k667
ログを確認。
$ gcloud alpha functions logs read helloWorld
LEVEL NAME EXECUTION_ID TIME_UTC LOG
D helloWorld 5ku6s0rlswil 2017-02-26 15:28:49.049 Function execution started
I helloWorld 5ku6s0rlswil 2017-02-26 15:28:49.361 My Cloud Function: Hello World!
D helloWorld 5ku6s0rlswil 2017-02-26 15:28:49.554 Function execution took 572 ms, finished with status: 'ok'
D helloWorld 5ku60cb1k667 2017-02-26 15:33:25.433 Function execution started
I helloWorld 5ku60cb1k667 2017-02-26 15:33:25.451 My Cloud Function: I have an apple
D helloWorld 5ku60cb1k667 2017-02-26 15:33:25.457 Function execution took 25 ms, finished with status: 'ok'
CUIから一通り作業していますが、管理画面からももちろん操作できます。
functionの削除
deleteで削除できます。
$ gcloud alpha functions delete helloWorld
Resource [projects/ponpokopon-141504/locations/us-central1/functions/h
elloWorld] will be deleted.
Do you want to continue (Y/n)? y
Waiting for operation to finish...done.
Deleted [projects/ponpokopon-141504/locations/us-central1/functions/helloWorld].
バケットも消す。
$ gsutil rm gs://lorentzca-gcf-hello/us-central1-helloWorld-gzlfdubrnauu.zip
Removing gs://lorentzca-gcf-hello/us-central1-helloWorld-gzlfdubrnauu.zip...
/ [1 objects]
Operation completed over 1 objects.
$ gsutil rb gs://lorentzca-gcf-hello
Removing gs://lorentzca-gcf-hello/...
注意点
Google Cloud Functionsはまだα版の機能で、ホワイトリストに追加されたアカウントからのみ利用することが出来ます。
ホワイトリストに追加されると表示できるドキュメントも増えるのですが、機密情報として、外部に公開や議論をしてはいけないドキュメントがあるので注意が必要です。
ホワイトリストに追加されると、自動的にGoogle Cloud FunctionsのGoocleグループに追加されるので、機密に関わる議論はその場で行えば良さそうです。
感想
軽い気持ちでクイックスタートを始めたら、Pub/Subがわからなくて思ったより時間がかかってしまった。
まだクイックスタートをちょっとやっただけで何ができるかはよくわかってないですが、
- GCP Billingデータの取得とmackerelへの投稿
- Misfit APIをGoogle Cloud Functionsから叩く
のをやってみたいとぼんやり考えています。(`・ω・´)ゞ
参考リンク
公式ページ。
公式ドキュメント。
AWS LambdaとGoogle Cloud Functionsの比較(1年前の記事なので多少状況は変わっていると思われる)。
Pub/Subについて。