バックエンド バケットを設定する

Cloud CDN は、グローバル外部アプリケーション ロードバランサまたは従来のグローバル外部アプリケーション ロードバランサを利用して、ルーティング、ヘルスチェック、エニーキャスト IP のサポートを提供します。グローバル外部アプリケーション ロードバランサには、Compute Engine VM インスタンス、Google Kubernetes Engine Pod、Cloud Storage バケット、Google Cloud 以外の外部バックエンドなど、複数のバックエンド インスタンス タイプを設定できるため、Cloud CDN を有効にするバックエンド(送信元)を選択できます。

この設定ガイドでは、Cloud CDN を有効にした外部アプリケーション ロードバランサを作成する方法について説明します。この例では、次のリソースを使用します。

  • デフォルトの Virtual Private Cloud(VPC)ネットワーク
  • デフォルトの URL マップ
  • 予約済み外部 IP アドレス
  • バックエンドとしての Cloud Storage バケット
  • Cloud Storage バケットのラッパーとして機能する単一のロードバランサ バックエンド バケット

バックエンド バケットは以下の対象をサポートします。

Cloud CDN の仕組みについては、Cloud CDN の概要をご覧ください。

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

ロードバランサのバックエンド

外部アプリケーション ロードバランサは、URL マップを使用して、指定された URL から指定されたサービスにトラフィックを転送します。次の表に、コンテンツとサービスをホストできるバックエンドの種類をまとめています。

ロードバランサのバックエンド構成 一般的なコンテンツ タイプ バックエンド タイプ
バックエンド サービス 動的(データなど)
  • 非マネージド インスタンス グループ
  • マネージド インスタンス グループ
  • Google Cloud 内部のネットワーク エンドポイント グループ
  • Google Cloud 外部のネットワーク エンドポイント グループ
バックエンド バケット 静的(画像など)
  • Cloud Storage バケット(このページで説明)

始める前に

コンソール

  1. Google Cloud コンソールで、[ホーム] ページに移動します。

    Google Cloud のホームページに移動

  2. Google Cloud の右側にあるプルダウン メニューでプロジェクトを選択します。

gcloud

     gcloud config set project PROJECT_ID
   

PROJECT_ID を Google Cloud プロジェクト ID に置き換えます。

Terraform

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID
   

Cloud Storage バケットを作成する

ロードバランサにまだ割り当てられていない既存の Cloud Storage バケットがある場合は、次の手順にスキップできます。

Cloud CDN で外部アプリケーション ロードバランサのバックエンドとして使用する Cloud Storage バケットを作成する場合は、マルチリージョン バケットを選択することをおすすめします。このバケットは、複数の Google Cloud リージョンにオブジェクトを自動的に複製します。これにより、コンテンツの可用性が高まり、アプリケーション全体のフォールト トレラントが向上します。

コンソール

  1. Google Cloud コンソールで、Cloud Storage の [バケット] ページを開きます。

    [バケット] ページを開く

  2. [バケットを作成] をクリックします。
  3. 以下の表にあるフィールドの値を指定します。その他の値はデフォルトのままにします。

    プロパティ 値(値を入力するか、指定されたオプションを選択)
    名前 バケットごとに、グローバルに一意の名前を入力します。入力した名前が一意でない場合は、別の名前を入力するよう求めるメッセージが表示されます。
    ロケーション タイプ マルチリージョン
    ロケーション [米国(マルチリージョン)] などのリージョンを選択します。
    デフォルトのストレージ クラス Standard
    アクセス制御 均一
  4. [作成] をクリックします。

  5. 新たに作成された Cloud Storage バケットの名前をメモします。これは次のステップで使用します。

gcloud

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

Terraform

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

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

resource "google_storage_bucket" "default" {
  name                        = "${random_id.bucket_prefix.hex}-my-bucket"
  location                    = "us-east1"
  uniform_bucket_level_access = true
  storage_class               = "STANDARD"
  // delete bucket and contents on destroy.
  force_destroy = true
  // Assign specialty files
  website {
    main_page_suffix = "index.html"
    not_found_page   = "404.html"
  }
}

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

Cloud Storage バケットにグラフィック ファイルをコピーする

設定をテストするには、Cloud Storage の公開バケットから独自の Cloud Storage バケットにグラフィック ファイルをコピーします。

gcloud

Cloud Shell で次のコマンドを実行します。BUCKET_NAME を一意の Cloud Storage バケット名に置き換えます。

gcloud storage cp gs://gcp-external-http-lb-with-bucket/three-cats.jpg gs://BUCKET_NAME/never-fetch/

Terraform

オブジェクトをコピーするには、local-exec Provisionergcloud storage cp コマンドを使用します。

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

オブジェクトをアップロードするには、google_storage_bucket_object リソースを使用します。

# image object for testing, try to access http://<your_lb_ip_address>/test.jpg
resource "google_storage_bucket_object" "test_image" {
  name = "test-object"
  # Uncomment and add valid path to an object.
  #  source       = "/path/to/an/object"
  #  content_type = "image/jpeg"

  # Delete after uncommenting above source and content_type attributes
  content      = "Data as string to be uploaded"
  content_type = "text/plain"

  bucket = google_storage_bucket.default.name
}

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

Google Cloud コンソールで [更新] をクリックして、グラフィック ファイルがコピーされることを確認します。

Cloud Storage バケットを公開する

この例では、Cloud Storage バケットを一般公開します。これは、公開コンテンツで推奨される方法です。この設定を使用すると、インターネット上のすべてのユーザーが、オブジェクトとそのメタデータ(ACL を除く)を表示および一覧表示できます。意図しないデータ漏洩のリスクを軽減するには、通常、公開オブジェクト専用の Cloud Storage バケットを用意する必要があります。

Cloud Storage バケット全体を公開する代わりに、次の方法を使用することもできます。

次の手順により、すべてのユーザーに Cloud Storage バケット内のオブジェクトを参照するためのアクセス権が付与され、バケットが一般公開されます。

コンソール

  1. Google Cloud コンソールで、Cloud Storage の [バケット] ページを開きます。

    [バケット] ページを開く

  2. バケットに移動して、[権限] タブをクリックします。
  3. [プリンシパルを追加] をクリックします。
  4. [新しいプリンシパル] に「allUsers」と入力します。
  5. ロールとして [Cloud Storage] > [Storage オブジェクト閲覧者] を選択します。
  6. [保存] をクリックします。

gcloud

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

Terraform

Cloud Storage バケットを公開するには、google_storage_bucket_iam_member リソースを使用します。

# make bucket public
resource "google_storage_bucket_iam_member" "default" {
  bucket = google_storage_bucket.default.name
  role   = "roles/storage.objectViewer"
  member = "allUsers"
}

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

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

Cloud Storage バケットが稼働を開始したところで、次に顧客がロードバランサに接続する際に使用するグローバル静的外部 IP アドレスを設定します。

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

コンソール

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

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

  2. IPv4 アドレスを予約するには、[静的アドレスを予約] をクリックします。
  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"
}

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

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

この手順では、ロードバランサのバックエンド バケットを作成します。これは、Cloud Storage バケットのラッパーとして機能します。バックエンド バケットを作成または編集するときに、Cloud CDN を有効にできます。

コンソール

外部アプリケーション ロードバランサの構成プロセスを開始する

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

    [負荷分散] ページに移動

  2. [HTTP(S) 負荷分散] で [構成を開始] をクリックします。
  3. [インターネットから自分の VM へ] をオンにし、[続行] をクリックします。
  4. [高度なトラフィック管理] で、次のいずれかを選択します。
    • 従来のアプリケーション ロードバランサの場合は、[従来の HTTP(S) ロードバランサ] を選択します。
    • グローバル外部アプリケーション ロードバランサの場合は、[高度なトラフィック管理を行う HTTP(S) ロードバランサ] を選択します。
  5. [名前] を http-lb に設定し、次の手順に進みます。

バックエンドを構成して Cloud CDN を有効にする

ロードバランサのバックエンド バケットを作成します。これは、Cloud Storage バケットのラッパーとして機能します。バックエンド バケットを作成または編集するときに、Cloud CDN を有効にできます。

  1. [バックエンドの構成] をクリックします。
  2. [バックエンド サービスとバックエンド バケット] で、[バックエンド サービスとバックエンド バケットの作成または選択] をクリックし、[バックエンド バケット] > [バックエンド バケットの作成] の順にクリックします。
  3. [名前] を cat-backend-bucket に設定します。この名前はグローバルに一意である必要はなく、実際の Cloud Storage バケットとは異なる名前を設定できます。
  4. [Cloud Storage バケット] で、[参照] をクリックします。
  5. 作成した Cloud Storage のグローバルに一意な BUCKET_NAME を選択し、[選択] をクリックします。
  6. [Cloud CDN を有効にする] をクリックします。

  7. (省略可)キャッシュ モードTTL の設定を変更します。

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

ホストルールとパスマッチャーを構成する

ホストルールとパスマッチャーは、外部アプリケーション ロードバランサの URL マップの構成要素です。

[ホストとパスのルール] では、デフォルト設定をそのまま使用できます。

カスタマイズされた設定の例については、バックエンド バケットをロードバランサに追加するをご覧ください。

ホストルールとパスマッチャーの詳細については、URL マップの概要をご覧ください。

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

  1. [フロントエンドの構成] をクリックします。
  2. オプションが次の値で構成されていることを確認します。

    プロパティ 値(値を入力するか、指定されたオプションを選択)
    プロトコル HTTP
    ネットワーク サービス階層 Premium
    IP バージョン IPv4
    IP アドレス example-ip
    ポート 80

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

    プロパティ 値(値を入力するか、指定されたオプションを選択)
    プロトコル HTTPS
    ネットワーク サービス階層 Premium
    IP バージョン IPv4
    IP アドレス example-ip
    ポート 443
    証明書 証明書を選択する、または新しい証明書を作成する
  3. [完了] をクリックします。

構成を確認する

  1. [確認と完了] をクリックします。
  2. [バックエンド バケット]、[ホストとパスのルール]、[フロントエンド] セクションを確認します。
  3. [作成] をクリックします。
  4. ロードバランサの作成が完了するまで待ちます。
  5. ロードバランサの名前(http-lb)をクリックします。
  6. ロードバランサの IP アドレスをメモします(次のタスクで使用します)。次のタスクでは IP_ADDRESS とします。

gcloud

バックエンドを構成する

gcloud compute backend-buckets create cat-backend-bucket \
    --gcs-bucket-name=BUCKET_NAME \
    --enable-cdn \
    --cache-mode=CACHE_MODE

CACHE_MODE を次のいずれかに置き換えて、キャッシュ モードを設定します。

  • CACHE_ALL_STATIC または USE_ORIGIN_HEADERS: Cloud Storage のキャッシュ制御メタデータに従って設定されたヘッダーを使用します。Cloud Storage は常に Cloud CDN に Cache-Control ヘッダーを提供します。値を明示的に選択しない場合は、デフォルト値が送信されます。

  • FORCE_CACHE_ALL: Cloud Storage から送信された Cache-Control レスポンス ヘッダー内の privateno-store、または no-cache のディレクティブを無視して、すべてのコンテンツをキャッシュに保存します。

URL マップを構成する

gcloud compute url-maps create http-lb \
    --default-backend-bucket=cat-backend-bucket

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

gcloud compute target-http-proxies create http-lb-proxy \
    --url-map=http-lb

転送ルールを構成する

  • グローバル外部アプリケーション ロードバランサの場合は、load-balancing-scheme=EXTERNAL_MANAGED を指定して gcloud CLI コマンドを使用します。この設定では、高度なトラフィック管理機能が提供されます。
  • 従来のアプリケーション ロードバランサの場合は、load-balancing-scheme=EXTERNAL を使用します。
gcloud compute forwarding-rules create http-lb-forwarding-rule \
    --load-balancing-scheme=LOAD_BALANCING_SCHEME \
    --network-tier=PREMIUM \
    --address=example-ip \
    --global \
    --target-http-proxy=http-lb-proxy \
    --ports=80

Terraform

バックエンドを構成する

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

# backend bucket with CDN policy with default ttl settings
resource "google_compute_backend_bucket" "default" {
  name        = "cat-backend-bucket"
  description = "Contains beautiful images"
  bucket_name = google_storage_bucket.default.name
  enable_cdn  = true
  cdn_policy {
    cache_mode        = "CACHE_ALL_STATIC"
    client_ttl        = 3600
    default_ttl       = 3600
    max_ttl           = 86400
    negative_caching  = true
    serve_while_stale = 86400
  }
}

URL マップの構成

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

# url map
resource "google_compute_url_map" "default" {
  name            = "http-lb"
  default_service = google_compute_backend_bucket.default.id
}

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

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

# http 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 リソースを使用します。

# forwarding rule
resource "google_compute_global_forwarding_rule" "default" {
  name                  = "http-lb-forwarding-rule"
  ip_protocol           = "TCP"
  load_balancing_scheme = "EXTERNAL"
  port_range            = "80"
  target                = google_compute_target_http_proxy.default.id
  ip_address            = google_compute_global_address.default.id
}
  • グローバル外部アプリケーション ロードバランサの場合は、load_balancing_scheme="EXTERNAL_MANAGED" とともに使用します。この設定では、高度なトラフィック管理機能が提供されます。
  • 従来のアプリケーション ロードバランサの場合は、load_balancing_scheme="EXTERNAL" を使用します。

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

バックエンド バケットにトラフィックを送信する

グローバル転送ルールの作成後、構成が全世界に反映されるまでに数分かかることがあります。数分後、ロードバランサの IP アドレスへのトラフィック送信を開始できます。

コンソール

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

    [負荷分散] ページに移動

  2. http-lb をクリックして、先ほど作成したロードバランサを展開します。

    [バックエンド] セクションで、バックエンド バケットが正常であることを確認します。バックエンド バケットの横に緑色のチェックマークが表示されます。それ以外の場合は、最初にページを再読み込みしてみてください。Google Cloud コンソールで、バックエンドが正常と表示されるまでに時間がかかることがあります。

  3. Google Cloud コンソールでバックエンド バケットが正常であることが表示されたら、http://IP_ADDRESS/never-fetch/three-cats.jpg にアクセスし、ウェブブラウザでロードバランサをテストできます。IP_ADDRESSロードバランサの IP アドレスに置き換えます。グラフィック ファイルを含むコンテンツのページがブラウザに表示されます。

gcloud

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

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

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

curl リクエストを送信します。

curl http://IP_ADDRESS/never-fetch/three-cats.jpg

Cloud CDN が機能していることを確認する

http://IP_ADDRESS/never-fetch/three-cats.jpg ページを短時間で何度か再読み込みすると、複数のキャッシュ ヒットが発生します。

次のログエントリはキャッシュ ヒットを示しています。キャッシュ ヒットを表示するには、Google Cloud Console でログ エクスプローラを開き、転送ルール名でフィルタリングします。

ログ エクスプローラを開く

ログ エクスプローラ

{
    insertId: "1oek5rg3l3fxj7"
    jsonPayload: {
        @type: "type.googleapis.com/google.cloud.loadbalancing.type.LoadBalancerLogEntry"
        cacheId: "SFO-fbae48ad"
        statusDetails: "response_from_cache"
    }
    httpRequest: {
        requestMethod: "GET"
        requestUrl: "http://LOAD_BALANCER_IP_ADDRESS/never-fetch/three-cats.jpg"
        requestSize: "577"
        status: 254
        responseSize: "157"
        userAgent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36"
        remoteIp: "CLIENT_IP_ADDRESS"
        cacheHit: true
        cacheLookup: true
    }
    resource: {
        type: "http_load_balancer"
        labels: {
            zone: "global"
            url_map_name: "URL_MAP_NAME"
            forwarding_rule_name: "FORWARDING_RULE_NAME"
            target_proxy_name: "TARGET_PROXY_NAME"
            backend_service_name: ""
            project_id: "PROJECT_ID"
        }
    }
    timestamp: "2020-06-08T23:41:25.078651Z"
    severity: "INFO"
    logName: "projects/PROJECT_ID/logs/requests"
    trace: "projects/PROJECT_ID/traces/241d69833e64b3bf83fabac8c873d992"
    receiveTimestamp: "2020-06-08T23:41:25.588272510Z"
    spanId: "7b6537d3672e08e1"
}

コンソール

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

    [負荷分散] ページに移動

  2. http-lb をクリックして、先ほど作成したロードバランサを展開します。

    [バックエンド] セクションで、バックエンド バケットが正常であることを確認します。バックエンド バケットの横に緑色のチェックマークが表示されます。それ以外の場合は、最初にページを再読み込みしてみてください。Google Cloud コンソールで、バックエンドが正常と表示されるまでに時間がかかることがあります。

  3. Google Cloud コンソールでバックエンド バケットが正常であることが表示されたら、http://IP_ADDRESS/never-fetch/three-cats.jpg にアクセスし、ウェブブラウザでロードバランサをテストできます。IP_ADDRESSロードバランサの IP アドレスに置き換えます。グラフィック ファイルを含むコンテンツのページがブラウザに表示されます。

gcloud

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

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

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

curl リクエストを送信します。

curl -D- -o /dev/null /dev/null http://IP_ADDRESS/never-fetch/three-cats.jpg

コンテンツは Cloud Storage から取得され、Cloud CDN によってキャッシュに保存されます。コンテンツが期限切れになると検証されて再取得されますが、それ以外の場合はキャッシュから削除されます。

キャッシュのコンテンツには、ゼロを上回る Age ヘッダーがあります。

TTL よりも前に更新が必要なコンテンツは無効にして、Cloud Storage から再取得できます。

Cloud CDN を無効にする

コンソール

単一のバックエンド バケットを対象に Cloud CDN を無効にする

  1. Google Cloud コンソールで、[Cloud CDN] ページに移動します。

    [Cloud CDN] ページに移動

  2. 送信元の行の右側で [メニュー] をクリックし、[編集] を選択します。
  3. Cloud CDN の使用を停止するバックエンド バケットのチェックボックスをオフにします。
  4. [更新] をクリックします。

送信元のすべてのバックエンド バケットを対象に Cloud CDN の削除を実施する

  1. Google Cloud コンソールで、[Cloud CDN] ページに移動します。

    [Cloud CDN] ページに移動

  2. 送信元の行の右側で [メニュー] をクリックし、[削除] を選択します。
  3. 確認のため、もう一度 [削除] をクリックします。

gcloud

gcloud compute backend-buckets update BACKEND_BUCKET_NAME \
    --no-enable-cdn

Cloud CDN を無効にしても、キャッシュの無効化や消去は行われません。Cloud CDN を無効にして再度有効にすると、キャッシュに保存されたコンテンツの大半はキャッシュに残っています。キャッシュのコンテンツを使用しないようにするには、コンテンツの無効化が必要です。

次のステップ