「Cloud Functions をローカルで開発したい」
この記事はそんな方に向けて書いています。
どうもー。GCP 大好きガッチ(@gatchsite)です。
最近はほぼ毎日、Google Cloud Platform を触って開発をしています。
ちょっとしたツールであれば、「Cloud Functions」や「Cloud Run」を選択する人は多いのではないでしょうか。
ただ、毎回 GCP にデプロイしてテストするのもめんどくさいし、時間がかかってしまいます。
ということで、今回は開発フローを意識した Cloud Functions をローカルで実行させる環境設定を紹介します。
記事の内容はこちら
Cloud functions をローカル環境で使う
Cloud Functionsには、Google が提供してくれているフレームワークがあります。
そのフレームワークを使うことで、ローカルでも Cloud Functions を実行することができます。
ローカルにフレームワークをインストール
$ npm install @google-cloud/functions-framework
公式 GitHub: functions-framework-nodejs
フレームワークを設定する
package.json
の scripts に以下を追加します。
{
"scripts": {
"start": "functions-framework --target=[実行する関数名]"
}
}
フレームワークをスタート
$ npm start
Cloud functions をテストしてみる
ブラウザからhttp://localhost:8080/
へアクセスしても良いですし、curl
でコマンドラインからアクセスするでも良いです。
$ curl http://localhost:8080/
ローカル環境を使った環境を考える
せっかくローカル環境で開発を行うのであれば、もう少し実践的な構成を検討してみたいと思います。
考えることは2つです。
「ローカルの開発環境そのもの」と「開発フロー」です。
想定しているローカルの開発環境
Docker で仮想環境を作成し、そこで開発を行います。開発時の条件はこんなところを意識しています。
- Docker 環境で動作させ、ホスト側の環境を汚さない。
- ホスト側のテキストエディタで開発する。
- ブラウザからアクセスし確認できる。
- ソースコードは Git で管理する。
※コンポーネント図で作成したかったんですが、mermaid.js では作成できなかったのでフローチャートで。
sequenceDiagram
ホスト側ブラウザ ->> ローカルホスト: 通信
ローカルホスト ->> Docker環境: バインド
Docker環境 -->> CloudFunctions: 実行
CloudFunctions ->> Docker環境: 応答
Docker環境 ->> ローカルホスト: 応答
ローカルホスト -->> ホスト側ブラウザ: 応答
開発フローを考える
開発する前にフローを考えておくことはとても重要です。
Colud Functions はブラウザ内でコードを書いてデプロイすることも可能です。一人でちょっとした機能を作成する場合は問題ないかもしれません。
ただ、作成したほとんどの機能は機能を追加したり修正したりしたくなります。開発する前に少し先の運用を考えた設計をしておくことで、後々とても楽になります。
sequenceDiagram
SourceRepositories ->> ローカル: pull
ローカル ->> ローカル: 開発
ローカル ->> Docker: 実行
Docker ->> ローカル: 応答
ローカル ->> ローカル: コミット
ローカル ->> SourceRepositories:push
SourceRepositories ->> CloudBuild:実行
CloudBuild ->> CloudFunctions:デプロイ
※Docker は CloudFunctionsFramework を含んでいます。
デレクトリ構成
こんな感じの構成で開発しています。
repos/
|-- docker/
| |-- node.Dockerfile
|-- src/
| |-- index.js // CloufFunctionsで実行するファイル
| |-- package.json
|-- cloudbuild.yml
|-- docker-compose.yml
docker-compose の設定と CloudBuid の設定
docker を使う場合、docker-compose がおすすめです。
docker-compose の設定
version: '3'
services:
node:
build:
context: .
dockerfile: ./docker/node.Dockerfile
ports:
- 3000:3000
tty: true
working_dir: /src
volumes:
- ./src:/src
- /src/node_modules
environment:
ENVIRONMENT: development
PORT: 3000
BIND_HOST: 0.0.0.0
CloudBuid の設定
steps:
- name: 'gcr.io/cloud-builders/gcloud'
args:
- functions
- deploy
- [関数名]
- --source=src
まとめ
Cloud Functions をローカルの Docker 環境で実行する方法やローカル開発時に考えることなどをまとめました。
コンポーネント図が使えず詳しく説明できていない部分も多々ありますが、、、
docker + Cloud Functions の設定を1度できてしまえば、2つ目3つ目はとても簡単に作成できるようになります。
ぜひ、試してもらいたいと思います。
ではでは、ガッチ(@gatchsite)でした。