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 を有効にしない場合は、送信元の Cache-Control
ヘッダーを使用して、Cloud Storage メタデータで設定された小規模なコンテンツのキャッシュのみを制御できます。
ロードバランサのバックエンド
外部アプリケーション ロードバランサは、URL マップを使用して、指定された URL から指定されたサービスにトラフィックを転送します。次の表に、コンテンツとサービスをホストできるバックエンドの種類をまとめています。
ロードバランサのバックエンド構成 | 一般的なメディアタイプ | バックエンド タイプ |
---|---|---|
バックエンド サービス | 動的(データなど) |
|
バックエンド バケット | 静的(画像など) |
|
始める前に
- フロントエンドに HTTPS を使用している場合は、セルフ マネージドまたは Google マネージドの SSL 証明書を作成します。Google マネージド証明書を使用することをおすすめします。
- Google Cloud CLI を使用している場合は、gcloud ツールを使用してオブジェクト ストレージを検出するを確認してインストールします。
コンソール
- Google Cloud コンソールで、[ホーム] ページに移動します。
- 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 リージョンにオブジェクトを自動的に複製します。これにより、コンテンツの可用性が高まり、アプリケーション全体のフォールト トレラントが向上します。
コンソール
- Google Cloud コンソールで、Cloud Storage の [バケット] ページを開きます。
- [バケットを作成] をクリックします。
以下の表にあるフィールドの値を指定します。その他の値はデフォルトのままにします。
プロパティ 値(値を入力するか、指定されたオプションを選択) 名前 バケットごとに、グローバルに一意の名前を入力します。入力した名前が一意でない場合は、別の名前を入力するよう求めるメッセージが表示されます。 地域タイプ マルチリージョン 場所 [米国(マルチリージョン)] などのリージョンを選択します。 デフォルトのストレージ クラス Standard アクセス制御 均一 [作成] をクリックします。
新たに作成された 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
リソースを使用します。
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
Provisioner
と gcloud 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
リソースを使用します。
Terraform 構成を適用または削除する方法については、基本的な Terraform コマンドをご覧ください。
Google Cloud コンソールで [更新] をクリックして、グラフィック ファイルがコピーされることを確認します。
Cloud Storage バケットを公開する
この例では、Cloud Storage バケットを一般公開します。これは、公開コンテンツで推奨される方法です。この設定を使用すると、インターネット上のすべてのユーザーが、オブジェクトとそのメタデータ(ACL を除く)を表示および一覧表示できます。意図しないデータ漏洩のリスクを軽減するには、通常、公開オブジェクト専用の Cloud Storage バケットを用意する必要があります。
Cloud Storage バケット全体を公開する代わりに、次の方法を使用することもできます。
個々のオブジェクトを公開するこの方法は、以前の Cloud Storage 固有の権限システムを使用しているため、おすすめしません。
署名付き URL を使用する。
次の手順により、すべてのユーザーに Cloud Storage バケット内のオブジェクトを参照するためのアクセス権が付与され、バケットが一般公開されます。
コンソール
- Google Cloud コンソールで、Cloud Storage の [バケット] ページを開きます。
- バケットに移動して、[権限] タブをクリックします。
- [プリンシパルを追加] をクリックします。
- [新しいプリンシパル] に「
allUsers
」と入力します。 - ロールとして [Cloud Storage] > [Storage オブジェクト閲覧者] を選択します。
- [保存] をクリックします。
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
リソースを使用します。
Terraform 構成を適用または削除する方法については、基本的な Terraform コマンドをご覧ください。
外部 IP アドレスを予約
Cloud Storage バケットが稼働を開始したところで、次に顧客がロードバランサに接続する際に使用するグローバル静的外部 IP アドレスを設定します。
この手順は省略可能ですが、静的外部 IP アドレスはドメインを指定するための単一アドレスを提供するため、行うことをおすすめします。
コンソール
- Google Cloud コンソールで、[外部 IP アドレス] ページに移動します。
- IPv4 アドレスを予約するには、[静的アドレスを予約] をクリックします。
- [名前] に「
example-ip
」を割り当てます。 - [ネットワーク サービス階層] を [プレミアム] に設定します。
- [IP バージョン] で [IPv4] をオンにします。
- [タイプ] で [グローバル] をオンにします。
- [予約] をクリックします。
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
リソースを使用します。
Terraform 構成を適用または削除する方法については、基本的な Terraform コマンドをご覧ください。
外部アプリケーション ロードバランサを作成する
この手順では、ロードバランサのバックエンド バケットを作成します。これは、Cloud Storage バケットのラッパーとして機能します。バックエンド バケットを作成または編集するときに、Cloud CDN を有効にできます。
コンソール
外部アプリケーション ロードバランサの構成プロセスを開始する
- Google Cloud コンソールの [ロード バランシング] ページに移動します。
- [HTTP(S) 負荷分散] で [構成を開始] をクリックします。
- [インターネットから自分の VM へ] をオンにし、[続行] をクリックします。
- [高度なトラフィック管理] で、次のいずれかを選択します。
- 従来のアプリケーション ロードバランサの場合は、[従来の HTTP(S) ロードバランサ] を選択します。
- グローバル外部アプリケーション ロードバランサの場合は、[高度なトラフィック管理を行う HTTP(S) ロードバランサ] を選択します。
- [名前] を
http-lb
に設定し、次の手順に進みます。
バックエンドを構成して Cloud CDN を有効にする
ロードバランサのバックエンド バケットを作成します。これは、Cloud Storage バケットのラッパーとして機能します。バックエンド バケットを作成または編集するときに、Cloud CDN を有効にできます。
- [バックエンドの構成] をクリックします。
- [バックエンド サービスとバックエンド バケット] で、[バックエンド サービスとバックエンド バケットの作成または選択] をクリックし、[バックエンド バケット] > [バックエンド バケットの作成] の順にクリックします。
- [名前] を
cat-backend-bucket
に設定します。この名前はグローバルに一意である必要はなく、実際の Cloud Storage バケットとは異なる名前を設定できます。 - [Cloud Storage バケット] で、[参照] をクリックします。
- 作成した Cloud Storage のグローバルに一意な
BUCKET_NAME
を選択し、[選択] をクリックします。 [Cloud CDN を有効にする] をクリックします。
[作成] をクリックします。
ホストルールとパスマッチャーを構成する
ホストルールとパスマッチャーは、外部アプリケーション ロードバランサの URL マップの構成要素です。
[ホストとパスのルール] では、デフォルト設定をそのまま使用できます。
カスタマイズされた設定の例については、バックエンド バケットをロードバランサに追加するをご覧ください。
ホストルールとパスマッチャーの詳細については、URL マップの概要をご覧ください。
フロントエンドを構成する
- [フロントエンドの構成] をクリックします。
オプションが次の値で構成されていることを確認します。
プロパティ 値(値を入力するか、指定されたオプションを選択) プロトコル HTTP ネットワーク サービス階層 Premium IP バージョン IPv4 IP アドレス example-ip
ポート 80 HTTP ロードバランサの代わりに HTTPS ロードバランサを作成する場合は、SSL 証明書(
gcloud compute ssl-certificates list
)が必要です。また、次のようにフィールドに入力する必要があります。プロパティ 値(値を入力するか、指定されたオプションを選択) プロトコル HTTPS ネットワーク サービス階層 Premium IP バージョン IPv4 IP アドレス example-ip
ポート 443 証明書 証明書を選択する、または新しい証明書を作成する [完了] をクリックします。
構成を確認する
- [確認と完了] をクリックします。
- [バックエンド バケット]、[ホストとパスのルール]、[フロントエンド] セクションを確認します。
- [作成] をクリックします。
- ロードバランサの作成が完了するまで待ちます。
- ロードバランサの名前(http-lb)をクリックします。
- ロードバランサの 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
レスポンス ヘッダー内のprivate
、no-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
リソースを使用します。
URL マップの構成
バックエンドを構成するには、google_compute_url_map
リソースを使用します。
ターゲット プロキシの構成
ターゲット プロキシを構成するには、google_compute_target_http_proxy
リソースまたは google_compute_target_https_proxy
リソースを使用します。
転送ルールの構成
転送ルールを構成するには、google_compute_global_forwarding_rule
リソースを使用します。
- グローバル外部アプリケーション ロードバランサの場合は、
load_balancing_scheme="EXTERNAL_MANAGED"
とともに使用します。この設定では、高度なトラフィック管理機能が提供されます。 - 従来のアプリケーション ロードバランサの場合は、
load_balancing_scheme="EXTERNAL"
を使用します。
Terraform 構成を適用または削除する方法については、基本的な Terraform コマンドをご覧ください。
バックエンド バケットにトラフィックを送信する
グローバル転送ルールの作成後、構成が全世界に反映されるまでに数分かかることがあります。数分後、ロードバランサの IP アドレスへのトラフィック送信を開始できます。
コンソール
- Google Cloud コンソールの [ロード バランシング] ページに移動します。
http-lb
をクリックして、先ほど作成したロードバランサを展開します。[バックエンド] セクションで、バックエンド バケットが正常であることを確認します。バックエンド バケットの横に緑色のチェックマークが表示されます。それ以外の場合は、最初にページを再読み込みしてみてください。Google Cloud コンソールで、バックエンドが正常と表示されるまでに時間がかかることがあります。
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 コンソールで表示するには、ログ エクスプローラを開き、転送ルール名でフィルタリングします。
ログ エクスプローラ
{ 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" }
コンソール
- Google Cloud コンソールの [ロード バランシング] ページに移動します。
http-lb
をクリックして、先ほど作成したロードバランサを展開します。[バックエンド] セクションで、バックエンド バケットが正常であることを確認します。バックエンド バケットの横に緑色のチェックマークが表示されます。それ以外の場合は、最初にページを再読み込みしてみてください。Google Cloud コンソールで、バックエンドが正常と表示されるまでに時間がかかることがあります。
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 を無効にする
- Google Cloud コンソールで、[Cloud CDN] ページに移動します。
- 送信元の行の右側で [メニュー] をクリックし、[編集] を選択します。
- Cloud CDN の使用を停止するバックエンド バケットのチェックボックスをオフにします。
- [更新] をクリックします。
送信元のすべてのバックエンド バケットを対象に Cloud CDN の削除を実施する
- Google Cloud コンソールで、[Cloud CDN] ページに移動します。
- 送信元の行の右側で [メニュー] をクリックし、[削除] を選択します。
- 確認のため、もう一度 [削除] をクリックします。
gcloud
gcloud compute backend-buckets update BACKEND_BUCKET_NAME \ --no-enable-cdn
Cloud CDN を無効にしても、キャッシュの無効化や消去は行われません。Cloud CDN を無効にして再度有効にすると、キャッシュに保存されたコンテンツの大半はキャッシュに残っています。キャッシュのコンテンツを使用しないようにするには、コンテンツの無効化が必要です。
次のステップ
- キャッシュに保存されるコンテンツの詳細については、キャッシュの概要をご覧ください。
- GKE で Cloud CDN を使用するには、Ingress の機能をご覧ください。
- Cloud CDN がキャッシュからレスポンスを配信しているかどうかを確認するには、ログの表示をご覧ください。
- よくある問題と解決策については、トラブルシューティングをご覧ください。
- コンテンツのフィルタリングとアクセス制御ポリシーを構成するには、エッジ セキュリティ ポリシーをご覧ください。