Cloud Run で社内向けシステムを構築しようとしている話

f:id:hacomono-tech:20210303225554p:plain

こんにちは、hacomono の工藤です。

弊社では hacomono というフィットネスジムなどのリアル店舗向け予約・決済システムを開発しているのですが、このプロダクトの社内向けシステムを構築するにあたって、Cloud Run が使えないか調査してみました。

Cloud Run とは

Cloud Run とは、GCP (Google Cloud Platform) で提供されているコンテナを利用したサーバーレス実行環境です。例えば AWS Lambda では、利用可能な言語・バージョンにて開発をする必要がありますが、Cloud Run であればコンテナさえ用意すればフルマネージドなサーバーレス環境を構築することができます。

cloud.google.com

コンテナを用意すれば 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 エンドポイントにアクセスして、レスポンスが返ってくれば成功です。

f:id:hacomono-tech:20210303225356p:plain

Cloud SQL に接続する

実際のシステムでは何らかのデータベースが必要となります。Cloud Run では、コンテナから Cloud SQL への接続が簡単にできるようサポートされています。

まず Cloud Run の接続設定画面で セットアップ済みの Cloud SQL を選択します。

f:id:hacomono-tech:20210303225421p:plain

あとは 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 を利用することでアプリの開発に集中することができそうです。社内システムの場合は時間課金ではなく従量課金となるサーバーレスもコスト面で優位です。

まずは小さいところから利用してみて、今後プロダクションでの利用も検討していきたいと思います。