Cloud Storage バケットを使用してグローバル外部アプリケーション ロードバランサを設定する

このドキュメントでは、外部アプリケーション ロードバランサを作成して静的コンテンツのリクエストを Cloud Storage バケットに転送する方法について説明します。バックエンド バケットを使用してロードバランサを構成すると、ユーザーのリージョンに関係なく、/love-to-fetch で始まる URL パスへのリクエストは us-east1 Cloud Storage バケットに送信され、その他のリクエストはすべて europe-north1 Cloud Storage バケットに送信されます。

バックエンドが HTTP(S) で動的コンテンツを配信する場合は、バックエンド バケットの代わりにバックエンド サービスの使用を検討してください。

従来のアプリケーション ロードバランサの既存のユーザーで、グローバル外部アプリケーション ロードバランサで新しいデプロイを計画する場合は、移行の概要をご覧ください。

ロードバランサ バックエンドとしての Cloud Storage バケット

外部アプリケーション ロードバランサは、URL マップを使用して、指定された URL パスからトラフィックをバックエンドに転送します。

次の図では、ロードバランサが /love-to-fetch/ のパスを含むトラフィックを us-east1 リージョンの Cloud Storage バケットに送信しています。他のすべてのリクエストは、europe-north1 リージョンの Cloud Storage バケットに送信されます。

Cloud Storage バックエンドにトラフィックを送信するロードバランサ。
Cloud Storage へのトラフィックの分散

デフォルトで Cloud Storage では、Cloud CDN が使用するものと同じキャッシュを使用します。バックエンド バケットで Cloud CDN を有効にすると、コンテンツで Cloud CDN コントロールを使用できます。Cloud CDN のコントロールには、キャッシュ モード、署名付き URL、無効化などがあります。Cloud CDN では、サイズの大きいコンテンツ(10 MB 超)をキャッシュに保存することもできます。バックエンド バケットで Cloud CDN を有効にしない場合は、Cloud Storage メタデータで設定されたように、送信元の Cache-Control ヘッダーを使用して、小規模なコンテンツのキャッシュを制御することのみ可能です。

始める前に

設定が次の前提条件を満たしていることを確認します。gcloud storage ユーティリティを使用している場合は、gcloud ツールを使用してオブジェクト ストレージを検出するの手順に沿ってインストールできます。

デフォルト プロジェクトを設定する

コンソール

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  5. Make sure that billing is enabled for your Google Cloud project.

gcloud

gcloud config set project PROJECT_ID

PROJECT_ID は、このガイドで使用しているプロジェクトに置き換えます。

Terraform

export GOOGLE_CLOUD_PROJECT=PROJECT_ID

権限

このガイドを使用する前に、プロジェクトで Cloud Storage バケットとロードバランサを作成する必要があります。そのためには、プロジェクトのオーナーまたは編集者であるか、次の Compute Engine IAM のロールが必要です。

タスク 必要なロール
ロードバランサのコンポーネントの作成 ネットワーク管理者
Cloud Storage バケットを作成する ストレージ オブジェクト管理者

詳細については、次のガイドをご覧ください。

SSL 証明書リソースを設定する

HTTPS ロードバランサの場合、SSL 証明書リソースは、次のドキュメントの説明のように作成します。

Google マネージド証明書を使用することをおすすめします。

この例では、SSL 証明書リソース www-ssl-cert をすでに利用していることを前提としています。

Cloud Storage バケットとコンテンツを準備する

Cloud Storage バケットを準備するプロセスは次のとおりです。

  • バケットを作成します。

  • コンテンツをバケットにコピーします。

  • バケットに公開アクセス権を設定します。

Cloud Storage バケットを作成する

この例では、ロードバランサがアクセスする 2 つの Cloud Storage バケットを作成します。本番環境のデプロイでは、複数の Google Cloud リージョンにオブジェクトを自動的に複製するマルチリージョン バケットを選択することをおすすめします。これにより、コンテンツの可用性が高まり、アプリケーション全体のフォールト トレラントが向上します。

作成する Cloud Storage バケットの名前をメモします。この名前は後で使用します。このガイドでは、これらを BUCKET_1_NAME および BUCKET_2_NAME と呼びます。

コンソール

  1. Google Cloud コンソールで、Cloud Storage の [バケット] ページに移動します。

    Cloud Storage の [バケット] に移動

  2. [バケットを作成] をクリックします。

  3. [バケットに名前を付ける] ボックスに、命名ガイドラインに沿ったグローバルに一意の名前を入力します。

  4. [データの保存場所の選択] をクリックします。

  5. [ロケーション タイプ] を [リージョン] に設定します。

  6. [ロケーション] を europe-north1 に設定します。このガイドでは BUCKET_1_NAME です。

  7. [作成] をクリックします。

  8. [バケット] をクリックして Cloud Storage の [バケット] ページに戻ります。次の手順で 2 番目のバケットを作成しますが、[ロケーション] は us-east1 に設定します。このガイドでは BUCKET_2_NAME です。

gcloud

gcloud storage buckets create gs://BUCKET_1_NAME --project=PROJECT_ID --default-storage-class=standard --location=europe-north1 --uniform-bucket-level-access
gcloud storage buckets create gs://BUCKET_2_NAME --project=PROJECT_ID --default-storage-class=standard --location=us-east1 --uniform-bucket-level-access

BUCKET_1_NAMEBUCKET_2_NAME は、作成するバケットの名前に置き換えます。

Terraform

バケットを作成するには、google_storage_bucket リソースを使用します。

# Create Cloud Storage buckets
resource "random_id" "bucket_prefix" {
  byte_length = 8
}

resource "google_storage_bucket" "bucket_1" {
  name                        = "${random_id.bucket_prefix.hex}-bucket-1"
  location                    = "us-east1"
  uniform_bucket_level_access = true
  storage_class               = "STANDARD"
  // delete bucket and contents on destroy.
  force_destroy = true
}

resource "google_storage_bucket" "bucket_2" {
  name                        = "${random_id.bucket_prefix.hex}-bucket-2"
  location                    = "us-east1"
  uniform_bucket_level_access = true
  storage_class               = "STANDARD"
  // delete bucket and contents on destroy.
  force_destroy = true
}

Terraform 構成を適用または削除する方法については、基本的な Terraform コマンドをご覧ください。

Cloud Storage バケットにコンテンツを転送する

セットアップを後でテストするために、Cloud Storage の公開バケットから独自の Cloud Storage バケットに次の画像をコピーします。

gcloud

  1. Cloud Shell をアクティブにする」をクリックします。

  2. Cloud Shell で次のコマンドを実行します。バケット名の変数は Cloud Storage バケット名に置き換えます。

gcloud storage cp gs://gcp-external-http-lb-with-bucket/three-cats.jpg gs://BUCKET_1_NAME/never-fetch/
gcloud storage cp gs://gcp-external-http-lb-with-bucket/two-dogs.jpg gs://BUCKET_2_NAME/love-to-fetch/

Terraform

アイテムをバケットにコピーするには、google_storage_bucket_object リソースを使用します。

resource "google_storage_bucket_object" "cat_image" {
  name         = "never-fetch/three-cats.jpg"
  source       = "images/three-cats.jpg"
  content_type = "image/jpeg"

  bucket = google_storage_bucket.bucket_1.name
}

resource "google_storage_bucket_object" "dog_image" {
  name         = "love-to-fetch/two-dogs.jpg"
  source       = "images/two-dogs.jpg"
  content_type = "image/jpeg"

  bucket = google_storage_bucket.bucket_2.name
}

または、null_resource リソースを使用します。

resource "null_resource" "upload_cat_image" {
provisioner "local-exec" {
  command = "gcloud storage cp gs://gcp-external-http-lb-with-bucket/three-cats.jpg gs://${google_storage_bucket.bucket_1.name}/never-fetch/"
}
}

resource "null_resource" "upload_dog_image" {
provisioner "local-exec" {
  command = "gcloud storage cp gs://gcp-external-http-lb-with-bucket/two-dogs.jpg gs://${google_storage_bucket.bucket_2.name}/love-to-fetch/"
}
}

Google Cloud コンソールで、各バケットの詳細ページで [更新] をクリックし、ファイルが正常にコピーされたことを確認します。

Cloud Storage バケットを公開する

Cloud Storage バケットを公開読み取り可能にすると、インターネット上の誰でもオブジェクトの一覧の取得と表示、メタデータ(ACL を除く)の表示を行えるようになります。公開バケットに機密情報を含めないでください。

機密情報が誤って公開される可能性を減らすため、公開オブジェクトと機密データを同じバケットに保存しないでください。

コンソール

バケット内のすべてのオブジェクトに対するアクセス権をすべてのユーザーに付与するには、バケットごとに次の手順を繰り返します。

  1. Google Cloud コンソールで、Cloud Storage の [バケット] ページに移動します。

    Cloud Storage の [バケット] に移動

  2. バケット名をクリックし、[権限] タブをクリックします。

  3. [追加] をクリックします。

  4. [新しいプリンシパル] ボックスに「allUsers」と入力します。

  5. [ロールを選択] ボックスで、[Cloud Storage] > [Storage オブジェクト閲覧者] を選択します。

  6. [保存] をクリックします。

  7. [一般公開アクセスを許可] をクリックします。

gcloud

バケット内のオブジェクトを表示する権限をすべてのユーザーに付与するには、次のコマンドを実行します。

gcloud storage buckets add-iam-policy-binding gs://BUCKET_1_NAME --member=allUsers --role=roles/storage.objectViewer
gcloud storage buckets add-iam-policy-binding gs://BUCKET_2_NAME --member=allUsers --role=roles/storage.objectViewer

Terraform

バケット内のオブジェクトを表示する権限をすべてのユーザーに付与するには、google_storage_bucket_iam_member リソースを使用して、メンバーに allUsers を指定します。

# Make buckets public
resource "google_storage_bucket_iam_member" "bucket_1" {
  bucket = google_storage_bucket.bucket_1.name
  role   = "roles/storage.objectViewer"
  member = "allUsers"
}

resource "google_storage_bucket_iam_member" "bucket_2" {
  bucket = google_storage_bucket.bucket_2.name
  role   = "roles/storage.objectViewer"
  member = "allUsers"
}

外部 IP アドレスを予約する

Cloud Storage バケットを設定したら、オーディエンスがロードバランサにアクセスするために使用するグローバル静的外部 IP アドレスを予約できます。

この手順は省略可能ですが、静的外部 IP アドレスはドメインを指定するための単一アドレスを提供するため、行うことをおすすめします。

コンソール

  1. Google Cloud コンソールで、[外部 IP アドレス] ページに移動します。

    [外部 IP アドレス] に移動

  2. [静的アドレスを予約] をクリックします。

  3. [名前] ボックスに「example-ip」と入力します。

  4. [ネットワーク サービス階層] を [プレミアム] に設定します。

  5. [IP バージョン] で [IPv4] をオンにします。

  6. [タイプ] で [グローバル] をオンにします。

  7. [予約] をクリックします。

gcloud

gcloud compute addresses create example-ip \
    --network-tier=PREMIUM \
    --ip-version=IPV4 \
    --global

予約された IPv4 アドレスをメモします。

gcloud compute addresses describe example-ip \
    --format="get(address)" \
    --global

Terraform

外部 IP アドレスを予約するには、google_compute_global_address リソースを使用します。

# Reserve IP address
resource "google_compute_global_address" "default" {
  name = "example-ip"
}

バックエンド バケットを使用する外部アプリケーション ロードバランサを作成する

ここでは、HTTP または HTTPS ロードバランサの作成手順について説明します。HTTPS ロードバランサを作成するには、ロードバランサのフロントエンドに SSL 証明書リソースを追加する必要があります。詳細については、SSL 証明書の概要をご覧ください。

コンソール

構成を開始する

  1. Google Cloud コンソールで、[ロード バランシング] ページに移動します。

    [ロード バランシング] に移動

  2. [ロードバランサを作成] をクリックします。
  3. [ロードバランサの種類] で [アプリケーション ロードバランサ(HTTP / HTTPS)] を選択し、[次へ] をクリックします。
  4. [インターネット接続または内部] で [インターネット接続(外部)] を選択し、[次へ] をクリックします。
  5. [グローバルまたはシングル リージョンのデプロイ] で [グローバル ワークロードに最適] を選択し、[次へ] をクリックします。
  6. [ロードバランサの世代] で [グローバル外部アプリケーション ロードバランサ] を選択し、[次へ] をクリックします。
  7. [構成] をクリックします。

基本構成

  1. [名前] ボックスに「http-lb」と入力します。

バックエンドを構成する

  1. [バックエンドの構成] をクリックします。

  2. [Backend services and backend buckets] ボックスをクリックし、[バックエンド バケットを作成] をクリックします。

  3. [バックエンド バケット名] ボックスに「cats」と入力します。

  4. [Cloud Storage バケット] ボックスで、[参照] をクリックします。

  5. [BUCKET_1_NAME] を選択して、[選択] をクリックします。最初に cats バックエンド バケットを作成すると、これがデフォルトになります。これにより、一致しないトラフィック リクエストがすべて転送されます。ロードバランサでデフォルトのバックエンド バケットのリダイレクト ルールを変更することはできません。

  6. [作成] をクリックします。

  7. 同じプロセスを使用して、dogs という名前のバックエンド バケットを作成し、BUCKET_2_NAME を選択します。

  8. [OK] をクリックします。

ルーティング ルールを構成する

ルーティング ルールは、トラフィックの転送方法を決定します。ルーティングを構成するには、ホストルールとパスマッチャーを設定します。これは外部アプリケーション ロードバランサの URL マップの構成要素です。この例のルールを設定するには:

  1. [ルーティング ルール] をクリックします。
  2. dogs で、[ホスト] フィールドに「*」、[パス] フィールドに「/love-to-fetch/*」と入力します。

フロントエンドを構成する

  1. [フロントエンドの構成] をクリックします。

  2. 以下のオプションが次の値で構成されていることを確認します。

    プロパティ 値(値を入力するか、指定されたオプションを選択)
    プロトコル HTTP
    ネットワーク サービス階層 プレミアム
    IP バージョン IPv4
    IP アドレス example-ip
    ポート 80
    省略可: HTTP キープアライブ タイムアウト 5~1,200 秒のタイムアウト値を入力します。デフォルト値は 610 秒です。

    HTTP ロードバランサの代わりに HTTPS ロードバランサを作成する場合は、SSL 証明書gcloud compute ssl-certificates list)が必要です。また、次のようにフィールドに入力する必要があります。

    プロパティ 値(値を入力するか、指定されたオプションを選択)
    プロトコル HTTP(S)
    ネットワーク サービス階層 プレミアム
    IP バージョン IPv4
    IP アドレス example-ip
    ポート 443
    省略可: HTTP キープアライブ タイムアウト 5~1,200 秒のタイムアウト値を入力します。デフォルト値は 610 秒です。
    証明書 SSL 証明書リソースの設定で作成した www-ssl-cert 証明書を選択するか、新しい証明書を作成します。
    省略可: HTTP から HTTPS へのリダイレクトを有効にする リダイレクトを有効にするには、このチェックボックスをオンにします。

    このチェックボックスをオンにすると、HTTPS ロードバランサと同じ IP アドレスを使用し、HTTP リクエストをロードバランサの HTTPS フロントエンドにリダイレクトする追加の部分的な HTTP ロードバランサが作成されます。

    このチェックボックスは、HTTPS プロトコルが選択されていて、予約済みの IP アドレスが使用されている場合にのみ選択できます。

  3. [完了] をクリックします。

構成を確認する

  1. [確認と完了] をクリックします。

  2. [フロントエンド]、[ホストとパスのルール]、[バックエンド バケット] を確認します。

  3. [作成] をクリックし、ロードバランサが作成されるのを待ちます。

  4. ロードバランサの名前(http-lb)をクリックします。

  5. ロードバランサの IP アドレスをメモします(次のタスクで使用します)。このガイドではこれを IP_ADDRESS と呼びます。

gcloud

バックエンドを構成する

gcloud compute backend-buckets create cats \
  --gcs-bucket-name=BUCKET_1_NAME
gcloud compute backend-buckets create dogs \
  --gcs-bucket-name=BUCKET_2_NAME

URL マップの構成

gcloud compute url-maps create http-lb \
  --default-backend-bucket=cats
gcloud compute url-maps add-path-matcher http-lb \
  --path-matcher-name=path-matcher-2 \
  --new-hosts=* \
  --backend-bucket-path-rules="/love-to-fetch/*=dogs" \
  --default-backend-bucket=cats

ターゲット プロキシを構成する

gcloud compute target-http-proxies create http-lb-proxy \
  --http-keep-alive-timeout-sec=HTTP_KEEP_ALIVE_TIMEOUT_SEC \
  --url-map=http-lb

HTTP_KEEP_ALIVE_TIMEOUT_SEC は、クライアント HTTP キープアライブ タイムアウトの値(5~1,200 秒)に置き換えます。デフォルト値は 610 秒です。このフィールドは省略可能です。

転送ルールを構成する

gcloud compute forwarding-rules create http-lb-forwarding-rule \
  --load-balancing-scheme=EXTERNAL_MANAGED \
  --network-tier=PREMIUM \
  --address=example-ip \
  --global \
  --target-http-proxy=http-lb-proxy \
  --ports=80

Terraform

ロードバランサを作成するには、次の Terraform リソースを使用します。

バックエンドを構成する

バックエンドを作成するには、google_compute_backend_bucket リソースを使用します。

# Create LB backend buckets
resource "google_compute_backend_bucket" "bucket_1" {
  name        = "cats"
  description = "Contains cat image"
  bucket_name = google_storage_bucket.bucket_1.name
}

resource "google_compute_backend_bucket" "bucket_2" {
  name        = "dogs"
  description = "Contains dog image"
  bucket_name = google_storage_bucket.bucket_2.name
}

URL マップの構成

URL マップを作成するには、google_compute_url_map リソースを使用します。

# Create url map
resource "google_compute_url_map" "default" {
  name = "http-lb"

  default_service = google_compute_backend_bucket.bucket_1.id

  host_rule {
    hosts        = ["*"]
    path_matcher = "path-matcher-2"
  }
  path_matcher {
    name            = "path-matcher-2"
    default_service = google_compute_backend_bucket.bucket_1.id

    path_rule {
      paths   = ["/love-to-fetch/*"]
      service = google_compute_backend_bucket.bucket_2.id
    }
  }
}

ターゲット プロキシの構成

ターゲット HTTP プロキシを作成するには、google_compute_target_http_proxy リソースを使用します。

# Create HTTP target proxy
resource "google_compute_target_http_proxy" "default" {
  name    = "http-lb-proxy"
  url_map = google_compute_url_map.default.id
}

転送ルールの構成

転送ルールを作成するには、google_compute_global_forwarding_rule リソースを使用します。

# Create forwarding rule
resource "google_compute_global_forwarding_rule" "default" {
  name                  = "http-lb-forwarding-rule"
  ip_protocol           = "TCP"
  load_balancing_scheme = "EXTERNAL_MANAGED"
  port_range            = "80"
  target                = google_compute_target_http_proxy.default.id
  ip_address            = google_compute_global_address.default.id
}

注: モードを従来のアプリケーション ロードバランサに変更するには、load_balancing_scheme 属性を "EXTERNAL_MANAGED" ではなく "EXTERNAL" に設定します。

Terraform 構成を適用または削除する方法については、基本的な Terraform コマンドをご覧ください。

ロードバランサにトラフィックを送信する

ロードバランサの構成から数分後、ロードバランサの IP アドレスへのトラフィックの送信を開始できます。

コンソール

Google Cloud コンソールはサポートされていません。

gcloud

curl コマンドを使用して、次の URL からのレスポンスをテストします。IP_ADDRESS は、ロードバランサの IPv4 アドレスに置き換えます。

curl http://IP_ADDRESS/love-to-fetch/two-dogs.jpg
curl http://IP_ADDRESS/never-fetch/three-cats.jpg

追加構成

このセクションでは、代替および追加の構成オプションを提供する構成例を示します。これらのタスクはすべて省略可です。また、任意の順序で行うことができます。

クライアント HTTP キープアライブ タイムアウトを更新する

前の手順で作成したロードバランサは、クライアント HTTP キープアライブ タイムアウトのデフォルト値で構成されています。

クライアントの HTTP キープアライブ タイムアウトを更新するには、次の操作を行います。

コンソール

  1. Google Cloud コンソールで、[ロード バランシング] ページに移動します。

    [ロード バランシング] に移動

  2. 変更するロードバランサの名前をクリックします。
  3. [編集] をクリックします。
  4. [フロントエンドの構成] をクリックします。
  5. [高度な機能] を開きます。[HTTP キープアライブ タイムアウト] にタイムアウト値を入力します。
  6. [更新] をクリックします。
  7. 変更を確認するには、[確認と完了] をクリックして、[更新] をクリックします。

gcloud

HTTP ロードバランサの場合は、gcloud compute target-http-proxies update コマンドを使用してターゲット HTTP プロキシを更新します。

    gcloud compute target-http-proxies update TARGET_HTTP_PROXY_NAME \
        --http-keep-alive-timeout-sec=HTTP_KEEP_ALIVE_TIMEOUT_SEC \
        --global
    

HTTPS ロードバランサの場合は、gcloud compute target-https-proxies update コマンドを使用してターゲット HTTPS プロキシを更新します。

    gcloud compute target-https-proxies update TARGET_HTTPS_PROXY_NAME \
        --http-keep-alive-timeout-sec=HTTP_KEEP_ALIVE_TIMEOUT_SEC \
        --global
    

次のように置き換えます。

  • TARGET_HTTP_PROXY_NAME: ターゲット HTTP プロキシの名前。
  • TARGET_HTTPS_PROXY_NAME: ターゲット HTTPS プロキシの名前。
  • HTTP_KEEP_ALIVE_TIMEOUT_SEC: HTTP キープアライブ タイムアウト値(5~600 秒)。

制限事項

  • バックエンド バケットは、グローバル外部アプリケーション ロードバランサと従来のアプリケーション ロードバランサでのみサポートされます。リージョン外部アプリケーション ロードバランサやその他の種類のロードバランサではサポートされません。
  • Identity-Aware Proxy ではバックエンド バケットはサポートされていません。
  • グローバル外部アプリケーション ロードバランサは、Cloud Storage バケットへのアップロードをサポートしていません。

次のステップ