Cloud Storageの非公開バケットで静的ウェブサイトをホスティングする

記事タイトルとURLをコピーする

G-gen の高宮です。当記事では、Cloud Storage バケットをバックエンドとして、安全に静的ウェブサイトをホスティングする手順を解説します。

はじめに

Cloud Storage とは

Cloud Storage とは、Google Cloud が提供する、高い堅牢性、スケーラビリティ、セキュリティを備えたオブジェクトストレージサービスです。容量無制限かつインフラの運用なしで、安価に大量のデータを保管することができます。

Cloud Storage の詳細については、以下の記事を参照してください。

blog.g-gen.co.jp

静的 Web サイトホスティングの手法

Cloud Storage は本来、安価に大容量のデータを保存するためのクラウドストレージですが、HTML や JavaScript のみで構成される静的な Web サイトをホスティングすることもできます。Cloud Storage で静的 Web サイトホスティングを実現するには、以下の手法があります。

  1. バックエンドバケットへのサービスアカウント認証
  2. プライベートオリジンの認証

いずれの手法も、Cloud Storage バケットの手前に、フルマネージドなロードバランサーサービスであるグローバル外部アプリケーションロードバランサを配置します。ロードバランサーを使用しないことも可能ですが、その場合はプロトコルとして非暗号化の HTTP のみが使用でき、HTTPS は使用できません。またその場合、バケットは一般公開となり、バケット内のすべてのオブジェクトにインターネットからアクセスできるようになるほか、フルマネージドの WAF サービスである Cloud Armor などのセキュリティポリシー適用もできません。

当記事で紹介する手法は、いずれもロードバランサーを使用するものであり、プロトコルが HTTPS になります。これに加え、ロードバランサーを迂回して Cloud Storage にアクセスすることができなくなるため、Cloud Armor のセキュリティポリシー等を必ず適用できます。

各手法の比較

前者のバックエンドバケットへのサービスアカウント認証は、所定のサービスアカウント(サービスエージェント)に、バケットに対するオブジェクト閲覧権限を与えることで、バケットを限定公開のまま配信できる手法です。

後者のプライベートオリジンの認証は、HMAC キーと呼ばれる仕組みを使うことでロードバランサーとバケットの間の認証を行う手法です。

前者の手法は、後者の手法よりも後の時期(2026年7月ころ)に使用可能になった手法であり、より簡易的に設定できるため、通常の用途であれば前者が推奨されます。後者は従来から使えた手法であり、Cloud Storage バケットだけでなく Amazon S3 互換のストレージに対応しているため、クロスクラウドで Web サイト配信を設定するとき等に用います。

当記事では、これらの2つの手法の設定手順を紹介します。

事前準備

当記事で紹介するいずれの手法の場合でも、以下の準備が完了していることを前提とします。

  • 以下の API が有効化されていること。
    • Compute Engine API
    • Identity and Access Management(IAM)API
    • Certificate Manager API
  • ロードバランサで使用するための、静的なグローバル外部 IP アドレスが予約されていること。
  • HTTPS による通信保護を行うための、Google マネージドの SSL 証明書等の SSL/TLS 証明書が準備済みであること。

以下の公式ドキュメントも参照してください。

バックエンドバケットへのサービスアカウント認証

手順の概要

「バックエンドバケットへのサービスアカウント認証」手法で構築を行う手順は、以下のとおりです。

  1. 静的ファイルを配置する Cloud Storage バケットの作成
  2. バックエンドバケットの作成
  3. バケットへの権限付与
  4. 外部アプリケーションロードバランサ(Cloud Load Balancing)の作成

Cloud Storage バケットの作成

Web サイトのコンテンツとなる静的ファイルを配置する Cloud Storage のバケットを作成します。

Google Cloud コンソールで 「Cloud Storage」 > 「バケット」 に移動し、「作成」 をクリックします。

以下の設定で 「作成」 をクリックし、バケットを作成します。

項目
バケット名 グローバルで一意となる名称
ロケーションタイプ 「Region」 で任意のリージョンを選択
データの保存方法 「デフォルトのクラスを設定する」「Standard」 を選択
公開アクセスの防止 「このバケットに対する公開アクセス禁止を適用する」 にチェック
アクセス制御 「均一」 を選択
オブジェクト データを保護する方法 デフォルト

バケットの作成

バケットが作成できたら、公開したい静的ファイル(HTML 等)をアップロードします。

ファイルのアップロード

バックエンドバケットの作成

次に、バックエンドバケットを作成します。バックエンドバケットとは、ロードバランサーのバックエンドコンテンツを配信する Cloud Storage バケットを指すための論理的なオブジェクトであり、ロードバランサーの構成要素の1つです。1つのバックエンドバケットは、1つの Cloud Storage バケットとひも付きます。

Google Cloud コンソールで 「ロード バランシング」 > 「バックエンド」タブ に移動し、「バックエンド バケットを作成」 をクリックします。

バックエンド バケットを作成

次の画面で、バックエンドバケットの詳細な設定を指定します。

項目
バックエンド バケット名 任意
説明 任意
ロードバランサの種類 グローバル外部アプリケーション ロードバランサ
Cloud Storage バケット コンテンツを配置する Cloud Storage バケットを指定
Cloud CDN 任意
Cloud Armor エッジ セキュリティ ポリシー 任意

「Cloud CDN を有効にする」は任意ですが、有効化することで、Google が世界中に保持するエッジロケーションにコンテンツがキャッシュされるようになり、ユーザー体験が改善されます。「Cloud Armor エッジ セキュリティ ポリシー」も任意です。Cloud Armor はフルマネージドの WAF サービスであり、様々なセキュリティポリシーを適用できます。

設定を入力したら、「作成」ボタンを押下します。

バックエンドバケットの詳細設定

バケットへの権限付与

次に、Cloud Storage バケットの IAM ポリシーにおいて、Cloud Load Balancing のサービスエージェントに対するオブジェクト閲覧権限を付与します。なおサービスエージェントとは、Google Cloud サービスが使用する特殊なサービスアカウントのことです。

このサービスエージェントは、service-${PROJECT_NUM}@https-lb.iam.gserviceaccount.com という名称であり、プロジェクトで一度でもバックエンドバケット等を作成すると自動的に作成されます(ただしサービスアカウント一覧画面には表示されません)。そのため当記事では、手順の順番として、バックエンドバケットの作成の後に実施します。過去にサービスエージェントが既に作成済みであれば、この手順は Cloud Storage バケットの作成直後に行っても構いません。

${PROJECT_NUM} の部分は、自身のプロジェクトのプロジェクト番号に置き換えてください。プロジェクト番号が 12345 であれば、サービスアカウント名は service-12345@https-lb.iam.gserviceaccount.com になります。プロジェクト番号は、Google Cloud コンソールのトップ画面(https://console.cloud.google.com/welcome)またはプロジェクトの設定画面(https://console.cloud.google.com/iam-admin/settings)で確認できます。

バケット詳細画面の「権限」 タブに移動し、「アクセスを許可」 をクリックします。

権限タブ

このバケットにおいて、サービスアカウント service-${PROJECT_NUM}@https-lb.iam.gserviceaccount.com に、「Storage オブジェクト閲覧者(roles/storage.objectViewer)」の IAM ロールを付与します。

バケットへの IAM ロール付与

ロードバランサーの作成

外部アプリケーションロードバランサを作成します。なお、外部アプリケーションロードバランサの詳細については、以下の記事を参照してください。

Google Cloud コンソールで 「ネットワークサービス」 > 「ロード バランシング」 に移動し、「ロードバランサの作成」 をクリックします。表示されるウィザードに沿って以下の設定を選択したうえで 「構成」 をクリックします。

項目
ロードバランサのタイプ アプリケーション ロードバランサ(HTTP / HTTPS)
インターネット接続または内部 インターネット接続(外部)
グローバルまたはシングル リージョンのデプロイ グローバル ワークロードに最適
ロードバランサの世代 グローバル外部アプリケーション ロードバランサ

左上のテキストボックス「ロードバランサの名前」には任意の値を入力してください。

次に、以下の設定で、フロントエンドを構成します。

項目
名前 任意
プロトコル HTTPS(HTTP/2 と HTTP/3 を含む)
IP バージョン IPv4
IP アドレス 事前準備で予約した IP アドレス
証明書リポジトリを選択 証明書マップを使用する
証明書マップの選択 事前準備で作成した証明書マップ
SSL ポリシー GCP のデフォルト
HTTP/3(QUIC)ネゴシエーション 自動(デフォルト)
早期データ(0-RTT) 無効
HTTP から HTTPS へのリダイレクトを有効にする チェックしない

次に、左部ペインで「バックエンドの構成」をクリックします。プルダウンメニュー「バックエンド サービスとバックエンド バケット」で、事前に作成したバックエンドバケットを選択します。

バックエンドの構成

次に、左部ペインで「ルーティング ルール」に進みます。ルーティング ルールのモードとして 「単純なホストとパスのルール」 を選択します。

最後に「確認と完了」に進み、設定内容を確認してから、画面下部の「作成」ボタンをクリックします。

「作成」ボタンをクリック

これで、構成は完了です。当記事末尾の「動作確認」に進んでください。

プライベートオリジンの認証

手順の概要

「プライベートオリジンの認証」手法で構築を行う手順は、以下のとおりです。

  1. 専用のサービスアカウントの作成
  2. Cloud Storage にアクセスするための HMAC キーの生成
  3. 静的ファイルを配置する Cloud Storage バケットの作成
  4. バケットへの権限付与
  5. バケットへのアクセス経路となるインターネット Network Endpoint Group(以下、NEG)の作成
  6. 外部アプリケーションロードバランサ(Cloud Load Balancing)の作成と Cloud CDN へのプライベートオリジンの認証の設定

サービスアカウントの作成

HMAC キーを発行するための、専用の IAM サービスアカウントを作成します。

  1. Google Cloud コンソールで 「IAM と管理」 > 「サービス アカウント」 に移動し、「サービス アカウントを作成」 をクリックします。
  2. 任意のサービスアカウント名を入力し、作成します。

サービスアカウントの作成

HMAC キーの作成

作成したサービスアカウントを使用して、Cloud Storage にアクセスするための HMAC キーを生成します。

なお HMAC(Hash-based Message Authentication Code)は、送信データと送信者・受信者しか知らない共通鍵(HMAC キー)をハッシュ関数にかけ、メッセージ認証コード(MAC)を生成する技術です。送信者はデータと共にこの MAC を相手に送付します。受信者は HMAC キーを使って手元でデータを計算し、ハッシュ値が一致することを検証します。

Google Cloud コンソールで 「Cloud Storage」 > 「設定」 に移動し、「相互運用性」 タブを開きます。 ページ下部の 「サービス アカウントのアクセスキー」 セクションで、「サービス アカウント用にキーを作成」 をクリックします。

「サービス アカウント用にキーを作成」を押下

作成したサービスアカウントを選択し、キーを生成します。

キーの生成

生成されたアクセスキーシークレットをメモします。シークレットは作成時にしか表示されないため、紛失しないよう十分注意してください。

アクセスキーとシークレットをメモ

シークレットは一度しか表示されない

Cloud Storage バケットの作成

次に、Cloud Storage のバケットを作成します。

Google Cloud コンソールで 「Cloud Storage」 > 「バケット」 に移動し、「作成」 をクリックします。

以下の設定で 「作成」 をクリックし、バケットを作成します。

項目
バケット名 グローバルで一意となる名称
ロケーションタイプ 「Region」 で任意のリージョンを選択
データの保存方法 「デフォルトのクラスを設定する」「Standard」 を選択
公開アクセスの防止 「このバケットに対する公開アクセス禁止を適用する」 にチェック
アクセス制御 「均一」 を選択
オブジェクト データを保護する方法 デフォルト

バケットが作成できたら、公開したい静的ファイル(HTML 等)をアップロードします。

バケットへの権限付与

バケット詳細画面の「権限」 タブに移動し、「アクセスを許可」 をクリックします。

バケットに対して、先ほど作成した専用のサービスアカウント(任意のサービスアカウント名)に、「Storage オブジェクト閲覧者(roles/storage.objectViewer)」の IAM ロールを付与します。

バケットへの IAM ロール付与

これにより、専用サービスアカウントはバケット内のオブジェクトにアクセスする権限を得ます。HMAC キーを介して、ロードバランサーはこのサービスアカウントの権限を借り受けて、バケット内のオブジェクトを配信できます。

NEG の作成

次に、ロードバランサーを Cloud Storage バケットと関連付けるための論理オブジェクトである、グローバルインターネット NEG を作成します。

  1. Google Cloud コンソールで 「Compute Engine」 > 「ネットワーク エンドポイント グループ」 に移動し、「ネットワークエンドポイントグループを作成」 をクリックします。
  2. 以下の設定で 「作成」 をクリックし、NEG を作成します。
項目 設定値
名前 任意の NEG 名
ネットワークエンドポイントグループの種類 「インターネット NEG(グローバル、リージョン)」 を選択
範囲 「Global」 を選択
デフォルトポート 443
追加手段 「完全修飾ドメイン名とポート」 を選択
Fully qualified domain name(FQDN) [バケット名].storage.googleapis.com

NEG の作成

ロードバランサーの作成

外部アプリケーションロードバランサを作成します。

Google Cloud コンソールで 「ネットワークサービス」 > 「ロード バランシング」 に移動し、「ロードバランサの作成」 をクリックします。 表示されるウィザードに沿って以下の設定を選択したうえで 「構成」 をクリックします。

項目
ロードバランサのタイプ アプリケーション ロードバランサ(HTTP / HTTPS)
インターネット接続または内部 インターネット接続(外部)
グローバルまたはシングル リージョンのデプロイ グローバル ワークロードに最適
ロードバランサの世代 グローバル外部アプリケーション ロードバランサ

左上のテキストボックス「ロードバランサの名前」には任意の値を入力してください。

次に、以下の設定で、フロントエンドを構成します。

項目
名前 任意
プロトコル HTTPS(HTTP/2 と HTTP/3 を含む)
IP バージョン IPv4
IP アドレス 事前準備で予約した IP アドレス
証明書リポジトリを選択 証明書マップを使用する
証明書マップの選択 事前準備で作成した証明書マップ
SSL ポリシー GCP のデフォルト
HTTP/3(QUIC)ネゴシエーション 自動(デフォルト)
早期データ(0-RTT) 無効
HTTP から HTTPS へのリダイレクトを有効にする チェックしない

次に、左部ペインで「バックエンドの構成」をクリックします。バックエンドの構成は、以下の手順で行います。

  1. プルダウンメニュー「バックエンド サービスとバックエンド バケット」をクリックして表示される「バックエンド サービスを作成」 をクリックします。
  2. 以下の設定で、バックエンドサービスを構成します。
項目
名前 任意
バックエンド タイプ インターネット ネットワークエンドポイント グループ
プロトコル HTTP/2
新しいバックエンド(インターネット ネットワークエンドポイント グループ) 作成した NEG
Cloud CDN 有効化
キャッシュモード Cache-Control ヘッダーに基づいて送信元の設定を使用する
キャッシュキー デフォルト(リクエスト URL のすべてのコンポーネントを含む)
プライベートオリジンの認証 「この送信元に対するリクエストを AWS 署名バージョン 4 で認証する」 にチェック
キー ID 生成した HMAC アクセスキー
キー 生成した HMAC シークレット
鍵のバージョン 任意の一意の識別名
リージョン Cloud Storage バケットと同じリージョン(例: asia-northeast1)
Cloud Armor 未選択
その他の CDN オプション デフォルト
制限付きコンテンツ Cloud CDN によりキャッシュされたコンテンツへの公開アクセスを許可する(推奨)
カスタム リクエスト ヘッダー ヘッダー名 : Host、ヘッダーの値 : [バケット名].storage.googleapis.com

Cloud CDN の詳細

次に、左部ペインで「ルーティング ルール」に進みます。ルーティング ルールのモードとして 「単純なホストとパスのルール」 を選択します。

最後に「確認と完了」に進み、設定内容を確認してから、画面下部の「作成」ボタンをクリックします。

「作成」ボタンをクリック

これで構成は完了です。次の「動作確認」へ進みます。

動作確認

アップロードした静的ファイルが、ロードバランサ経由で正常に配信されるか確認します。

Cloud Storage 内に、動作確認用の index.html として以下のシンプルな HTML コードを格納し、CSS、JavaScript、画像ファイルが正常に配信されるか確認します。

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>GCS 静的ウェブサイトホスティング 動作確認</title>
    <link rel="stylesheet" href="assets/css/style.css">
    <link rel="icon" type="image/png" href="assets/img/icon.png">
</head>
<body>
    <div class="container">
        <h2>GCS ホスティングテスト</h2>
        <p>(JavaScript &amp; CSS の読み込み・動作確認用)</p>
        <div id="timeDisplay" class="time-display"></div>
    </div>
    <script src="assets/js/app.js"></script>
</body>
</html>

以下の URL 形式を参考に、Web ブラウザでロードバランサにアクセスします。ページが正常にレンダリングされ、非公開バケット内のファイルが意図通りにブラウザ上に表示されることを確認します。

https://{Google マネージド証明書のホスト名}/index.html

また、Cloud Storage のオブジェクトの公開 URL を使用して、直接オリジンにアクセスすると、アクセスが拒否されることも確認できます。

高宮 怜(記事一覧)

クラウドソリューション部ソリューションアーキテクト課

2025年6月より、G-genにジョイン。前職は四国のSIerで電力、製造業系のお客様に対して、PM/APエンジニアとして、要件定義から運用保守まで全工程を担当。現在はGoogle Cloudを学びながら、フルスタックエンジニアを目指してクラウドエンジニアとしてのスキルを習得中。