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のプロジェクトID
  • BUCKET_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とはメッセージを送受信するためのモデルの一種で、

  1. パブリッシャー(Pub)がトピックに対しメッセージを送る
  2. トピックに送られたメッセージは、そのトピックに紐付いている1つもしくは複数のサブスクライバ(Sub)に配信される
  3. トピックからメッセージを受け取ったサブスクライバが何かしらの処理を実行する

みたいな登場人物と流れのあるモデルなようです。間にトピックが挟まることによって、柔軟なメッセージの受信と処理の流れを作ることができるのが利点なのか...な...?(あんまり理解できてない)

つまり、--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について。