という話。
話の前提
このブログを含め、カラクリスタではつい先日までアクセス解析の類いを一切導入しておらず、 いったいどれほどまでにアクセス数が無いのかを把握できていなかったのですが、今回これを把握するために、
という、 必要最低限の情報しか収集しないアクセス解析ソフトウェア を導入することにしました。
それでその時に一つ問題となったのがデプロイ先で、上記ソフトウェアはデータストアとして、
のいずれかの一つを要求され、かつ、
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 のインスタンスを立てる
なお自分の環境では docker
と gcloud
の環境構築は 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
内のコマンドのポイントとしては、
fathom
でのユーザーアカウントの作成とアプリケーションのデプロイを分ける- Cloud Run の deploy には
gcloud beta run deploy
を使う --add-cloudsql-instances
で Cloud Run に Cloud SQL のインスタンスを関連付ける
と言った辺りです。
それで (1) はローカルの環境で cloud_sql_proxy
を動かしてデータベースが絡む初期化を作業行い、
(2) と (3) については Google Cloud Run と Google Cloud SQL を組み合わせる際の注意点、
という感じですね。
また実際に deploy する際の流れとしては、
- Cloud SQL の Console でパスワードの設定とデータベースの作成を行う
make init
で Cloud SQL のデータベースの中見を初期化make deploy
で実際のアプリケーションを deploy
と言う感じになります。
実際に作業してみた感想
まぁ実際に作業してハマりかけた事としては、
- Cloud SQL の インスタンスの構築に 10 分ぐらい待ちが発生した
- Cloud SQL を Private IP で構築して Cloud Run と接続出来なかった
- Cloud Run への Domain 割り当てで Certificate Provisioning に 15 分ぐらい掛かった
という辺りですが、この辺りは事前に評価してハマりポイントとして把握しておけば、 あとは気軽にどうとでも出来ると個人的には思っています。
あと個人的に気になるのはこの環境の維持費ですが、 Cloud Run についてはそんなに維持費が掛からなそうなのは良いとして、 Cloud SQL は最小インタンスでも 8 USD ぐらいは掛かりそうなので、 その辺りについてはまぁ仕方無いかな、という感じです。
あと、これを構築して思ったのが、
あっ……ワイの Web サイト、めっちゃアクセス数少ないやん……
と言う ワリとどうしようもない点が可視化され てちょっと渋い気付きを得ました。 まぁこれは自分がリダイレクトとかドメインとかを、結構雑に運用しているのが原因ではあるんですが。
以上
まぁ Google Cloud Platform の Cloud Run と Cloud SQL を用いてアプリケーションを構築する、 というのは非常にラクではあったので、そういう面では、
運用が面倒なのをまるっとクラウドに投げたいでござる〜
と言うのが気楽に出来て良かったと思います。なんと言うか時代は進歩するモノですね。はい。