Googleクラウドで格安お手軽スケーラブルな静的ウェブ配信

概要

Google Cloud Platformの静的コンテンツ配信機能は低コストで手軽に使うことができる。サーバサイドプログラム(PHPなど)のかかわらない静的ウェブサイトの配信(HTML+CSS+JavaScript+画像+動画など)だけであれば、ApacheやNginxなどのウェブサーバなど不要でできてしまう。スケーラブルでトラフィックによるサーバ負荷を気にする必要がない低コストの環境が簡単に使える。WordPressでも静的配信をしているのであれば相性がいい。キャンペーンのランディングページなどもこれで十分なケースがほとんどである。 この記事ではGoogle Cloud Storageを使った簡単な方法と、少し高度にはなるが独自ドメインのHTTPSにも対応したFirebase Hostingを使った方法を紹介する。

簡単ではあるが、独自ドメインを使ったHTTPSでのウェブ配信ができない。HTTPSを使うのであればGoogleの決められたドメインを使うか、独自ドメインを使うならHTTPのみになる。

https://cloud.google.com/storage/docs/domain-name-verification?hl=ja GCSユーザの権限でサーチコンソールで新規にサイトを登録して認証することになる(すでに他のユーザでサーチコンソール登録していてもそれとは無関係にできる) https://www.google.com/webmasters/verification/details?hl=en&domain=[YOUR-DOMAIN.COM] DNSで親ドメインのTXTレコードに入れる文字列を取得

親ドメインのTXTレコードとして上で取得した文字列を、ホスティングするサブドメインのCNAMEレコードとして「c.storage.googleapis.com.」を登録

バケットの作成

gsutil mb -c STANDARD -l asia-northeast1 gs://www.example.com
bash

デフォルトの権限の設定(一般公開)

均一なバケットレベルアクセスが標準のため、IAMでallUsersobjectViewerロールを付与する。gsutil defacl set public-readは非推奨。

gsutil iam ch allUsers:objectViewer gs://www.example.com
bash

ウェブサイトの設定(インデックスページとエラーページの指定)

gsutil web set -m index.html -e error.html gs://www.example.com
bash

ファイルのデプロイ

gsutil -m cp -rZ * gs://www.example.com/
bash

ファイルの削除

gsutil -m rm -rf gs://www.example.com/*
bash

ログ用のバケットを作成

gsutil mb gs://log-www-example-com
bash

Googleにログ書き込み権限を付与

gsutil acl ch -g cloud-storage-analytics@google.com:W gs://log-www-example-com
bash

パブリックアクセスできないように権限設定

gsutil defacl set project-private gs://log-www-example-com
bash

webドキュメントのバケットに対してログ出力先のバケットを指定

gsutil logging set on -b gs://log-www-example-com gs://www.example.com
bash

まとまっていてわかりやすい https://blog.apar.jp/web/7745/

静的ウェブサイトのホスティング https://cloud.google.com/storage/docs/hosting-static-website?hl=ja 静的ウェブサイトの設定例、トラブルシューティング、ヒント https://cloud.google.com/storage/docs/static-website?hl=ja アクセスログとストレージログ https://cloud.google.com/storage/docs/access-logs?hl=ja

上記の方法ではHTTPSに非対応。このような方法もあるが、Firebase Hostingを使うのがおすすめ。 GCEにnginxを入れてリバースプロキシを作る https://cameong.hatenablog.com/entry/2016/05/07/170555

Firebase Hostingであれば独自ドメインのHTTPSを使える。しかも自動でLet’s Encryptの証明書を取得するため、最初から自動でHTTPSを使える状態になっている。設定はやや難しいが、メリットは大きいので覚えておくといい。

Hostingを使う前にFirebase自体の初期設定が必要となる、。

なければ作る。GoogleアナリティクスはGA4に完全移行済み。 https://console.firebase.google.com/

Firebaseのプロジェクトを作る
Firebaseのプロジェクトを作る
プロジェクトは存在するが新たに追加する場合
プロジェクトは存在するが新たに追加する
プロジェクトは存在するが新たに追加する
Firebaseのプロジェクトを作成すると、同時にGCPのプロジェクトも生成される。Firebaseで使うデータはGCPに格納される。

Firebase Hostingはデフォルトで

  • プロジェクト名.web.app
  • プロジェクト名.firebaseapp.com

というドメインでアクセスできる。これに自社ドメインを追加で割り当てる。 Firebaseの管理画面に左メニューから「Hosting」をクリック→右上の「ドメインを接続」からドメインを登録する。ドメインを入力するとDNSを設定方法のダイアログが出るので、このとおりDNS設定を行う。

DNS設定
DNS設定
https://marketechlabo.com/https://www.marketechlabo.com/のいずれでもアクセスできるようにする場合、wwwの有無両方のドメインを割り当てる。
ドメイン設定完了
ドメイン設定完了
「保留中」はDNSの設定後しばらく経過すると消滅する。 https://marketechlabo.com/からhttps://www.marketechlabo.com/にリダイレクトする場合はドメイン右のケバブアイコンから「編集」をクリックし、
Firebaseのドメインリダイレクト設定
Firebaseのドメインリダイレクト設定

Node.jsがなければ先にインストールしておく https://nodejs.org/ からNode.jsをダウンロードしてインストールする。 Firebase CLIはコマンドプロンプトを起動して

npm install -g firebase-tools
bash

を実行してインストールする。

引き続きコマンドラインで

firebase login
bash

を実行。最初の質問は「n」と答えてEnter。 ブラウザが立ち上がるのでFirebaseのプロジェクトを作成したGoogleアカウントでログインしてそのまま進めて「Firebase CLI Login Successful」の画面が現れたら閉じる。 なおリモートのコンピュータにインストールする場合など、webブラウザを起動することができない場合はこの方法がとれない。その場合は

firebase login --no-localhost
bash

を実行する。画面に現れるURLをローカルのブラウザからアクセスし、画面での認証を済ませた後に表示される認証コードを先のコマンドの続きに貼り付けると認証が完了する。

FirebaseではHostingに限らず、Firebase CLIをインストールしたコンピュータでプロジェクトのディレクトリを作ってその中にHostingで配信するファイルやその他の用途(Cloud Functionsなど)のファイルを配置する。ここではホームディレクトリ(Windowsはマイドキュメント)配下に作る。

mkdir /home/myuser/myproject # linux
mkdir c:\Users\myuser\Documents\myproject # Windows
bash

プロジェクトのディレクトリで初期化コマンドを実行する。 linuxの場合

cd /home/myuser/myproject
firebase init
bash

Windowsの場合

pushd c:\Users\myuser\Documents\myproject
firebase init
bash
  • 十字キーでカーソルを動かして「Hosting」でReturnするとチェックが入る→Enter
  • 「Use an existing project」にカーソルを合わせてEnter
  • Projectの選択で先ほど作成したプロジェクト名にカーソルを合わせてEnter
  • 「What do you want to use as your public directory?」に対しては、ホスティングするファイルを格納するディレクトリ(/home/myuser/myproject/XXXXXc:\Users\myuser\Documents\myproject\XXXXXXXXXXの部分)を入力してEnter(ここではデフォルトのpublicとする)
  • 「Configure as a single-page app (rewrite all urls to /index.html)?」は「N」と答えてEnter

アップロードするファイル一式を、配信コンテンツ設置用フォルダ/home/myuser/myproject/public / c:\Users\myuser\Documents\myprojectの中にコピー コマンドラインで

firebase deploy --only hosting
bash

を実行する。これでデプロイは完了する。その後はファイルを更新・追加・削除するたびにpublicの中に反映させ、このデプロイコマンドを実行する。 --only hostingを付けるのはHostingの機能のみのデプロイをするため。これを付けないとFirebaseの他の機能(Cloud Functionなど)のファイルもデプロイされてしまう(余計な処理が発生する)