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.

Hugo Gcs

ローカル起動 Hugo ローカルサーバの起動は非常に簡単で、以下のコマンドを実行するだけです。規定のポートは1313であるため http://localhost:1313にアクセスすれば編集中のサイトをリアルタイムに閲覧することができます。エディタで編集中の文書を保存すれば閲覧中のページがリロードなしで更新されます (データバインディング)。 $ hugo serve -D 静的コンテンツ生成 生成 また、サーバー機能は不要なので生成されたWebコンテンツだけが欲しいという場合もあると思います。その場合は以下のコマンドを入力することで、直下の publicディレクトリ配下にHTML等のWebコンテンツが出力されます。 $ hugo 提供 例えば、この状態でpublicディレクトリをマウントさせた Nginxを起動させれば http://localhost:80 でコンテンツを提供することができます。 $ docker run -p 80:80 -v $(pwd)/public:/usr/share/nginx/html nginx これを利用して、以下の様な Dockerfileを用意し DockerImage内にコンテンツを固めたものをDockerベースで配信というのも一つの考えです。 FROMnginx:1.19-alpineCOPY ./public /usr/share/nginx/htmlEXPOSE80CMD ["nginx", "-g", "daemon off;"]$ docker build -t nginx-hugo . $ docker container run --rm --name nginx-hugo -p 80:80 nginx-hugo ただ今回は、配信の度に以下の作業を行うのが少々面倒かも知れないと考え、Dockerベースの配信(当初CloudRunを想定)を止めました。とはいえ構成はシンプルなのでアイデアとしては悪くないと思います。 コンテンツの生成 イメージのビルド イメージのレジストリ登録 サービスの参照先イメージの変更 実は、Hugoのデプロイ先は、GitHubPagesが有名なのですが、今回試したら生成されたリンクのURLに問題があり(一部URL要素が重複生成された)上手くページ遷移できないという問題があったため、その他の手段を探したという経緯があります。 GCS 今回着目したのは GCS (GoogleCloudStorage) による提供です。GCSは Amazon S3の様なオブジェクトストレージで、S3同様に静的コンテンツをインターネット公開する機能も備わっています。またS3同様にランニングコストが非常に低価格です。長期的な視野で考えるとこの点は魅力です。 プロジェクト作成 GCSでのサイト管理をすると決めたら、GCPプロジェクトを作成します。GCSの世界ではプロダクト毎にプロジェクトを作成するというのがベストプラクティスになっているため、静的サイトの構築程度でも1プロジェクトを用意します。一度GCPを使った事があるのであれば決済手段の登録等が不要ですので簡易的な手続きのみで完了します。

Hugo

Intro Hugoでサイトを作成してみました。実際に作ってみるととても軽量なサイトになっているので驚きです。元々はWordPressでサイトを作成しようと考えていたのですが、WordPressの場合コンテンツの管理にMySQLを利用するため、維持費の面で年に1万円前後かかってしまうというのがネックでした。 また、はてなブログPro等も検討し、こちらのほうがトータルでは安価で手軽なのですが、やはり自由度の面で一定の制限が掛かってしまいます (大抵の人には十分な自由度とは思いますが) 基本的には静的コンテンツを配信するだけなので、特段リッチな基盤は必要ありません。Webサーバ上にHTMLを置くだけでも良いわけです。特に、昨今はApache,NginxベースのWebサーバを立てないでも配信する手段があります。GitHubPagesを利用しても良いですし、Amazon S3 や Google Cloud Storageといった Cloud上のストレージサービスに配信機能がありますので、その中にコンテンツを配備し設定を公開とするだけで安価に配信可能な訳です。 Hugo Hugo自体は、静的サイトジェネレーターと呼ばれるものです。静的サイトジェネレータの有名どころは Site Generators で確認できますが、Hugoは Golangでこれを実現したものとなります。多くの静的サイトジェネレータがJavaScriptを採用していますが、Golang製であるHugoは高速な処理に定評があります。 Markdown Hugoではコンテンツ(文章)をMarkdownとして記述します。 平易な記法でリッチなコンテンツを表現できるため、最近では多くのBlogサービスもMarkdown記法に対応してきていますが、Hugoを始めとした静的サイトジェネレータはMarkdownを主たる記法としてコンテンツを生成しています。 Static Site Generator 静的サイトジェネレータは「サイトは更新される回数より閲覧される回数の方が多いのだから、閲覧の度に動的なサイト生成する従来のツールは非効率だ、その代わりに更新時にサイトを生成して閲覧時には同じものを提示しよう」という発想によるものです。確かに閲覧時の処理負荷はかなり低い様で、各ページを高速に閲覧することができます。逆に、何らかの計算処理が必要な動的なページを生成しようと思ったら、静的サイトジェネレータには荷が重いということになります。