こんにちは、hacomono の工藤です。
弊社では hacomono というフィットネスジムなどのリアル店舗向け予約・決済システムを開発しているのですが、このプロダクトの社内向けシステムを構築するにあたって、Cloud Run が使えないか調査してみました。
Cloud Run とは
Cloud Run とは、GCP (Google Cloud Platform) で提供されているコンテナを利用したサーバーレス実行環境です。例えば AWS Lambda では、利用可能な言語・バージョンにて開発をする必要がありますが、Cloud Run であればコンテナさえ用意すればフルマネージドなサーバーレス環境を構築することができます。
コンテナを用意すれば OK ということで、これまでの開発・テスト手法をそのまま流用してサーバーレスを実現できるということになります。
Cloud Run にデプロイしてみる
それでは実際に Cloud Run にデプロイしてみます。
まずはデプロイするコンテナの準備を行います。ここでは Go + echo のサンプルコード + Dockerfile を用意し、gcloud コマンドでコンテナをビルド・登録します。
Go + echo はとりあえず公式サンプルのもので。
package main import ( "net/http" "github.com/labstack/echo/v4" ) func main() { e := echo.New() e.GET("/", func(c echo.Context) error { return c.String(http.StatusOK, "Hello, World!") }) e.Logger.Fatal(e.Start(":3000")) }
Dockerfile は多少改変していますが、以下のような内容で。
# Download mod FROM golang:1.14.0 as mod_env ENV GO111MODULE on RUN apt-get update WORKDIR /go/src/github.com/machiiro/xxxx COPY go.mod go.sum ./ RUN go mod download # Build FROM mod_env as build_env COPY . . RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o main main.go # Settings FROM alpine:latest as run_env RUN apk --update add tzdata RUN apk update && apk add --no-cache ca-certificates && apk add mailcap ENV HACOMONO_METRICS_ENV=production COPY --from=build_env /go/src/github.com/machiiro/xxxx/main /main EXPOSE 3000 CMD ["/main"]
gcloud コマンドでコンテナイメージを登録します。成功すると、Container Registry にイメージが登録されます。
gcloud builds submit --tag gcr.io/machiiro/xxxx
次に Cloud Run にコンテナをデプロイします。
gcloud beta run deploy xxxx --image gcr.io/machiiro/xxxx --region asia-northeast1
成功すると Cloud Run の一覧画面に表示されます。あとは実際にブラウザで API エンドポイントにアクセスして、レスポンスが返ってくれば成功です。
Cloud SQL に接続する
実際のシステムでは何らかのデータベースが必要となります。Cloud Run では、コンテナから Cloud SQL への接続が簡単にできるようサポートされています。
まず Cloud Run の接続設定画面で セットアップ済みの Cloud SQL を選択します。
あとは echo アプリの方で unix ソケットでDB に接続するよう設定を行えば完了です。unix ソケットのパスについてはドキュメントにも書いてありますが、以下のような内容になります。
DB ユーザー:DB パスワード@unix(/cloudsql/プロジェクト名:asia-northeast1:Cloud SQL 名)/データベース名?parseTime=true
その他検討したこと
- フロントエンドのデプロイ先をどうするか
こちらも Cloud Run にしても良いのですが、弊社で良く採用している Netlify + Nuxt.js の構成で行こうかなと思っています。
- マイグレーション方法をどうするか
gcloud コマンドを使って Cloud SQL に直接 SQL を流せるので、それで独自のマイグレーションを実装する方向で行こうかなと思っています。
最後に
実際に体験してみたところ、Cloud Run を利用することでアプリの開発に集中することができそうです。社内システムの場合は時間課金ではなく従量課金となるサーバーレスもコスト面で優位です。
まずは小さいところから利用してみて、今後プロダクションでの利用も検討していきたいと思います。