dskst's diary

Life and Tech Blog

Google Cloud Functionsをサクッと使ってみる

Google Cloud Functions (以下、GCF) で簡単な関数を作ってみました。
AWS Lambda の記事はわんさかあるのですが、 GCF の記事は多くなかったので関数をつくるまでをまとめていきます。

f:id:dskst9:20180503175212p:plain

AWS Lambda に比べると機能は少ないですが、 GCF だとHTTPトリガーが爆速で作れたので好印象です。 (AWS は柔軟な分 API Gateway でごちゃごちゃと設定を行う必要があります)

Google Cloud Functions

GCP のコンソールにアクセスして、メニューから Cloud Functions を選択します。
初回のアクセスでは Cloud Functions の API が有効になっていないので有効化します。

WEBコンソールからつくってみる

下記のように関数情報を入力して作成を押下します。

f:id:dskst9:20180502224348p:plain

作成が完了すると GCF 一覧に作成した関数が表示されます。

f:id:dskst9:20180502225632p:plain

関数詳細からは先に設定した情報、ソース更新、テストなどが実施できます。 トリガーに表示されているURLが関数のエントリーポイントになります。尚、デプロイ後にトリガーは変更できないので注意が必要です。

HTTPトリガーだとこれだけでエントリーポイント作成までが完了しました。

スポンサーリンク

gcloudコマンドラインツールでつくってみる

Googleのクイックスタートを参考に上記WEBコンソールから作成したものと同じ関数を作ってみます。
Quickstart: Using the gcloud Command-Line Tool  |  Cloud Functions Documentation  |  Google Cloud

まずは、作成する関数のディレクトリを作成します。
今回は librarian と名前で作成しました。ディレクトリの中身は下記の通りです。

$ librarian ls
index.js     package.json

ファイルの中身はWEBコンソールから作成されたデフォルトと同じものを使用してみます。

index.js

/**
 * Responds to any HTTP request that can provide a "message" field in the body.
 *
 * @param {!Object} req Cloud Function request context.
 * @param {!Object} res Cloud Function response context.
 */
exports.borrow = (req, res) => {
  // Example input: {"message": "Hello!"}
  if (req.body.message === undefined) {
    // This is an error case, as "message" is required.
    res.status(400).send('No message defined!');
  } else {
    // Everything is okay.
    console.log(req.body.message);
    res.status(200).send('Success: ' + req.body.message);
  }
};

package.json

{
  "name": "sample-http",
  "version": "0.0.1"
}
deploy してみる

gcloud beta functions deploy を使用します。deploy の詳細は下記ページに載っています。
gcloud beta functions deploy  |  Cloud SDK  |  Google Cloud

カレントディレクトリのファイルが deploy されるのですが、 .git ディレクトリが存在した場合、自動的に除外してくれます。( .gcloudignore を作成してくれます)

$ gcloud beta functions deploy librarian --trigger-http --entry-point=borrow --memory=128MB --timeout=5
Created .gcloudignore file. See `gcloud topic gcloudignore` for details.
Deploying function (may take a while - up to 2 minutes)...done.
availableMemoryMb: 128
entryPoint: borrow
httpsTrigger:
  url: https://***.cloudfunctions.net/librarian
labels:
  deployment-tool: cli-gcloud
name: projects/***/locations/us-central1/functions/librarian
serviceAccountEmail: ***
sourceUploadUrl: https://storage.googleapis.com/***
status: ACTIVE
timeout: 5s
updateTime: '2018-05-03T08:12:21Z'
versionId: '2'

これで deploy が完了しました。
発行されたエントリーポイントにアクセスすると動作が確認できます。

尚、今回は entry-point, memory, timeout を指定してみました。 versionId: '2' になっている理由は、WEBコンソール上から作成した関数を削除して、同名の関数を作成したからだと思われます。

callしてみる

gcloud beta functions call でコールすることも可能です。
gcloud beta functions call  |  Cloud SDK  |  Google Cloud

$ gcloud beta functions call librarian --data='{"message": "Hello!"}'
executionId: 4tc45ez0xset
result: 'Success: Hello!'

所感

AWS Lambda と比べると以下の印象を受けました。

  • HTTPトリガーをつくるのが爆速。
  • シンプルで使いやすいが、できることがかなり限定されている。
  • AWS Lambda の初期の頃より deploy がとても簡単。

まだベータということもあり使用できる言語(Node.js)、リージョン(us-central1)も限られているので、今後に期待していきましょう。