Google Cloud Run と Google Cloud SQL を使って Fathom をデプロイしてみた

という話。

話の前提

このブログを含め、カラクリスタではつい先日までアクセス解析の類いを一切導入しておらず、 いったいどれほどまでにアクセス数が無いのかを把握できていなかったのですが、今回これを把握するために、

usefathom/fathom

Fathom. Simple, trustworthy website analytics. Built with Golang & Pre...

https://github.com/usefathom/fathom

という、 必要最低限の情報しか収集しないアクセス解析ソフトウェア を導入することにしました。

それでその時に一つ問題となったのがデプロイ先で、上記ソフトウェアはデータストアとして、

  • SQLite
  • MySQL
  • PostgreSQL

のいずれかの一つを要求され、かつ、

MySQL とか PostgreSQL を VPSなどでサーバを立てるのはしたくないでござる〜

と言う個人的な要求(と言うか面倒でしたくなかった運用作業)もあった関係上、 今回はモノの試しも含めて、

Google Cloud Platform の Cloud Run (Beta)+ Cloud SQL でアプリを立てる

というのを行ってみました。

Cloud Run と Cloud SQL を使ってみる

まず今回の作業の前提として、下記の作業については予め環境構築をしておきます:

  • docker を使える様にする
  • gcloud を使える様にする
  • docker から Google Container Registry に push 出来る様にする
  • Cloud SQL で PostgreSQL のインスタンスを立てる

なお自分の環境では dockergcloud の環境構築は NixOS 側で対処し、 Cloud SQL のインスタンスについては、GCP の Console から最小構成でインタンスを作成しました。

ただし注意点として Cloud SQL と Cloud Run のリージョンは同一の us-central1 にしてあり、 また Cloud SQL の インスタンスも Public IP のインタンスとして構築してあります。

また実際の作業を行った際には、手入力でコマンドを入力するのも不確実性が上がってくるため、 最終的には下記の様なファイル類を用意してコマンド一発でアプリケーションを構築できる様にしています。 ただし、env.example については、各自の環境の値に書き換え、env として配置する必要があります:

Dockerfile

FROM usefathom/fathom:latest

ADD .env /app/.env

EXPOSE 8080

CMD [ "/app/fathom", "server" ]

env.example

GCP_PROJECT_ID=XXXX-XXXX-00000
GCP_CLOUDSQL_INSTANCE=XXXX-XXXX-XXXX
CLOUD_SQL_CREDENTIAL=/path/to/credential.json
CLOUD_SQL_INSTANCES=XXXX-XXXX-00000:us-central1:XXXX-XXXX-XXXX
CLOUD_SQL_PASSWORD=this_is_your_postres_password
FATHOM_ACCOUNT_EMAIL=yourname@example.com
FATHOM_ACCOUNT_PASSWORD=this_is_your_fathom_login_password
FATHOM_SECRET=this_is_secret_value_for_fathom_login_session
FATHOM_GZIP="true"

Makefile

.PHONY: init deploy

init:
	@$(MAKE) $(shell cat env | tr "\n" " ") _init

_init:
	docker network create cloudsql
	docker pull usefathom/fathom:latest
	docker pull gcr.io/cloudsql-docker/gce-proxy:1.12
	docker run --rm --net cloudsql \
		--name cloudsql -d -v $(CLOUD_SQL_CREDENTIAL):/config \
		gcr.io/cloudsql-docker/gce-proxy:1.12 /cloud_sql_proxy -instances=$(CLOUD_SQL_INSTANCES)=tcp:0.0.0.0:5432 -credential_file=/config
	docker run --rm --net cloudsql \
		-e FATHOM_DATABASE_DRIVER=postgres 								\
		-e FATHOM_DATABASE_USER=postgres 									\
		-e FATHOM_DATABASE_NAME=fathom 										\
		-e FATHOM_DATABASE_PASSWORD=$(CLOUD_SQL_PASSWORD) \
		-e FATHOM_DATABASE_HOST=cloudsql 									\
		-e FATHOM_DATABASE_SSLMODE=disable 								\
		usefathom/fathom:latest /app/fathom user add --email="$(FATHOM_ACCOUNT_EMAIL)" --password="$(FATHOM_ACCOUNT_PASSWORD)"
	docker stop cloudsql
	docker network rm cloudsql

deploy:
	@$(MAKE) $(shell cat env | tr "\n" " ") _deploy

_deploy:
	echo "FATHOM_DATABASE_DRIVER=postgres" 								 									 >.env
	echo "FATHOM_DATABASE_USER=postgres"  																	>>.env
	echo "FATHOM_DATABASE_NAME=fathom"   																		>>.env
	echo "FATHOM_DATABASE_PASSWORD=$(CLOUD_SQL_PASSWORD)" 									>>.env
	echo "FATHOM_DATABASE_HOST=/cloudsql/$(CLOUD_SQL_INSTANCES)" 						>>.env
	echo "FATHOM_DATABASE_SSLMODE=disable" 																	>>.env
	echo "FATHOM_GZIP=true" 																								>>.env
	echo "FATHOM_SECRET=$(shell uuidgen | sha512sum | base64 | head -n 1)" 	>>.env	
	docker build -t gcr.io/$(GCP_PROJECT_ID)/app-fathom:latest .
	docker push gcr.io/$(GCP_PROJECT_ID)/app-fathom:latest 
	gcloud beta run deploy fathom --image gcr.io/$(GCP_PROJECT_ID)/app-fathom:latest --concurrency=80 --memory=128Mi --timeout=10 --region=us-central1 --add-cloudsql-instances $(GCP_CLOUDSQL_INSTANCE)

解説

それで、上記の Dockerfile + env + Makefile が有れば、 誰でも Cloud Run と Cloud SQL に Fathom をデプロイできると思うのですが、 Makefile 内のコマンドのポイントとしては、

  1. fathom でのユーザーアカウントの作成とアプリケーションのデプロイを分ける
  2. Cloud Run の deploy には gcloud beta run deploy を使う
  3. --add-cloudsql-instances で Cloud Run に Cloud SQL のインスタンスを関連付ける

と言った辺りです。

それで (1) はローカルの環境で cloud_sql_proxy を動かしてデータベースが絡む初期化を作業行い、 (2) と (3) については Google Cloud Run と Google Cloud SQL を組み合わせる際の注意点、 という感じですね。

また実際に deploy する際の流れとしては、

  1. Cloud SQL の Console でパスワードの設定とデータベースの作成を行う
  2. make init で Cloud SQL のデータベースの中見を初期化
  3. make deploy で実際のアプリケーションを deploy

と言う感じになります。

実際に作業してみた感想

まぁ実際に作業してハマりかけた事としては、

  1. Cloud SQL の インスタンスの構築に 10分ぐらい待ちが発生した
  2. Cloud SQL を Private IP で構築して Cloud Run と接続出来なかった
  3. Cloud Run への Domain 割り当てで Certificate Provisioning に 15分ぐらい掛かった

という辺りですが、この辺りは事前に評価してハマりポイントとして把握しておけば、 あとは気軽にどうとでも出来ると個人的には思っています。

あと個人的に気になるのはこの環境の維持費ですが、 Cloud Run についてはそんなに維持費が掛からなそうなのは良いとして、 Cloud SQL は最小インタンスでも 8 USD ぐらいは掛かりそうなので、 その辺りについてはまぁ仕方無いかな、という感じです。

あと、これを構築して思ったのが、

あっ……ワイの Web サイト、めっちゃアクセス数少ないやん……

と言う ワリとどうしようもない点が可視化され てちょっと渋い気付きを得ました。 まぁこれは自分がリダイレクトとかドメインとかを、結構雑に運用しているのが原因ではあるんですが。

以上

まぁ Google Cloud Platform の Cloud Run と Cloud SQL を用いてアプリケーションを構築する、 というのは非常にラクではあったので、そういう面では、

運用が面倒なのをまるっとクラウドに投げたいでござる〜

と言うのが気楽に出来て良かったと思います。なんと言うか時代は進歩するモノですね。はい。

nyarla が大体ぐらいに投稿