Hugo Cloud Run
Cloud Load Balancing x GCS の課題 GCS x Cloud LB によるHugoのホスティングは問題なく稼働していたものの、LBの常時稼働によるコストは日額で63円程掛かります。月額に換算すると1830円、静的サイトをホスティングするにしては安くはない金額です。WordPressのホスティングなら、多少サービスの良い業者でも月額1000円程度、その2倍近く掛かってしまうのは設計的に良かったとしても、あまり人に勧められる選択ではありません。
もちろん、HTTPS化を諦めてGCS単体でホスティングすれば十分に低コストになるでしょう。ただ全てがSSL/TLS化されてきている現状で、暗号化なしという選択はそれはそれで違和感が拭えません。
GCSの提供するWebサイトホスティングの機能(index.html等のコール)はCloudLoadBalancing経由かDNS経由でコールしない限り効果を発揮しません。LBは高コスト・DNS経由は非暗号、となると GCSを離れた第3の選択肢を考えなければなりません。
Cloud Run の適性 そこで思いついたのが、Cloud Runによるホスティングです。Cloud Runは HTTPSに対応しており、且つ低価格です。低価格な理由はアクセスが少ない時にはコンテナを停止できるからです。またCPUなら毎月 180,000vCPU秒, メモリは 360,000GiB秒, リクエストは 2,000,000リクエストまで無料という無料枠までついてきます。(最新の情報は Cloud Run 料金を参照)
また利用も非常に簡単で、基本的にはコンテナをレジストリに登録し、それを起動コンテナとして指定するだけです。一般的なWebアプリケーションやAPIであれば、ストレージとの繋ぎ込みくらいの労力は必要ですが、今回の場合はそれすら不要です。一度起動したコンテナのコンテンツは更新されませんし、負荷が掛かって10台・100台とスケールアウトしようと、コンテナ間の内容に齟齬がでることはありません。
ではコンテンツを更新したくなったらどうするのか、その場合は内容が異なる別バージョンのイメージを用意しそれを指定するだけです。しかし、理論通りに動くか、本当に課題が無いのかは分かりません。そこで、実際に構築してみることにしました。
Cloud Runの設定 Dockerfile イメージを作成する Dockerfileは非常に簡単です。Hugoが publicディレクトリ内に出力した静的コンテンツをドキュメントルートである/usr/share/nginx/htmlに配置して、通常どおりに起動するだけです。
$ hugo Start building sites … | EN -------------------+----- Pages | 26 Paginator pages | 0 Non-page files | 6 Static files | 35 Processed images | 0 Aliases | 9 Sitemaps | 1 Cleaned | 0 Total in 280 ms FROMnginx:1.