[GCP] 効率いい Cloud Functions の開発環境を整備する [JavaScript]


こんにちは。
開発チームのワイルド担当、まんだいです。

GCP の Cloud Functions をご存知でしょうか?
コードをデプロイするだけで簡単に実行環境を用意できる、サーバーレスコンピューティング環境で、 GCP 版 AWS Lambda です。

サーバーを用意するまでもない、ちょっとしたコードの実行や、 Cloud Pub/Sub だけではちょっとむずかしいサービス間を繋ぐ処理をちゃちゃっと動かす場合に非常に便利な存在ですが、いくら簡単なコードとはいえ、テストせずにアップロードするのは不可能です。

ましてや実運用に絡む重要な処理を担うとなれば、なおさら開発環境は必要です。
なのに、 Cloud Functions を実装するための開発環境の情報として、これだという無いな...... という気持ちになったので、いい感じに開発しやすい環境を作ってみたいと思います。

エディタを準備する

エディタはメモ帳でもいいですが、高機能なものの方が作業効率は上がるので、ネイティブで JavaScript をサポートしている VSCode をオススメします。

 

モジュールを準備する

Cloud Functions 用のコードをローカルで実行する環境を構築します。
といっても、最低限必要なのは Google から提供されているモジュール1つだけです。

npm install @google-cloud/functions-framework

 

このモジュール1つで Cloud Functions ライクな挙動をするウェブサーバーが用意できます。

 

プロジェクトを準備する

Cloud Functions では、 package.json を通じて必要なモジュールをロードすることができます。
そのため、 npm init 経由で必要なモジュールが読めるようにしておきます。

npm init
# プロジェクトに対する質問に適当な答えを入力しておく

 

git リポジトリを作成

個人的にはどんなに簡単なスクリプトでも、 git 管理しておく方がよいと思っているので、とりあえず git init しておきます。

リポジトリに Cloud Source Repositories を使うとデプロイまでの手順が統合されるので便利です。
2020年1月現在、月当たり5ユーザーまで、容量 50 GB 、転送量 50 GB という制限はありますが、お試しで使う分には無料枠内で収まるんじゃないかと思います。

 

コードを書く

Cloud Functions のスクリプトにはエントリポイントが必要です。
エントリポイントとして main を用意した最小限のスクリプトが以下のものになります。

 

雛形

exports.main = (req, res) => {
  res.status(200).send('test');
}

 

本番では「実行する関数」に main を指定することになります。
次に、ローカルで動かして動作を確認してみましょう。

 

ローカル実行

ローカル実行する場合は、コマンドラインで以下のコマンドを実行するとウェブサーバーが起動し、リクエスト待ちの状態になります。

functions-framework --target=main

 

--target オプションは必須でエントリポイントを指定します。
エラーなど出なかったら、 localhost:8080 でウェブサーバーが起動していますので、 curl などで実行してみましょう。

curl localhost:8080

 

上記のコマンドで「test」と返ってきたら成功です!

このコマンドは npm script 化することができ、以下のように設定します。

  "scripts": {
    "start": "functions-framework --target=main"
  },

 

上記の設定を追加することで npm start で実行できるようになります。

 

ホットリロード

npm start の状態だと、コードを変更するたびに function-framework の再起動を手動で行う必要があります。
地味に手間が掛かる作業なので、ホットリロードを導入してみようと思います。
npm-watch というモジュールを導入していきます。

npm install npm-watch

 

見たところ nodemon のラッパーモジュールのようですが、設定などは特に必要ないため敷居が低く、簡単に導入できました。

npm スクリプトを追加します。

  "scripts": {
    "start": "functions-framework --target=main",
    "watch": "npm-watch start"
  }

 

次にコード監視の設定を追加します。

  "watch": {
    "start": "*.js"
  }

 

watch キーはトップレベル( main や scripts と同じ階層)に追加します。

何やらややこしいですが、起動する時のコマンドは以下のようになります。

npm run watch

 

とすると、 npm run start が実行されますが、配下の JS ファイルに変更が掛かると自動的に functions-framework が再起動されるようになります。

ここまで設定した package.json は以下のようになります。

{
  "name": "test",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "functions-framework --target=main",
    "watch": "npm-watch start"
  },
  "author": "y.mandai",
  "license": "ISC",
  "dependencies": {
    "@google-cloud/functions-framework": "^1.3.2",
    "npm-watch": "^0.6.0"
  },
  "watch": {
    "start": "*.js"
  }
}

 

 

まとめ

今回は、 GCP Cloud Functions のスクリプトを実装する際に便利な functions-framework をご紹介しました。
このモジュールを使えば、 Cloud Functions の挙動をローカルで手軽に試すことができました。
スクリプトの調整をしたりテストしたりする場合 functions-framework の再起動が煩雑になるため npm-watch を使ったホットリロード環境を構築し、効率よく作業が進められるようにするとなお良いですね!

以上です。


この記事をかいた人

About the author