コンテンツにスキップ

4 – パフォーマンスの向上

このチュートリアルでは、基本的なラウンドロビンのために2つ目のオリジンを追加し、必要に応じてトラフィックをフェイルオーバーするためにCloudflare Load Balancing製品を使用します。また、エンドユーザーに地理的に最も近いオリジンサーバーから結果を提供するために「ジオスティアリング」を使用して、ロードバランシングの設定を強化します。

1. wwwのための別のDNSレコードを追加

まず、アジアにある2つ目のウェブサーバーのDNSレコードを追加します。このサーバーのIPアドレスは198.51.100.15です。

Terminal window
git checkout -b step4-loadbalance
新しいブランチ 'step4-loadbalance' に切り替えました
Terminal window
cat >> cloudflare.tf <<'EOF'
resource "cloudflare_record" "www-asia" {
zone_id = var.zone_id
name = "www"
value = "198.51.100.15"
type = "A"
proxied = true
}
EOF

resourceの名前は異なりますが、同じタイプのTerraformリソースは一意に名前を付ける必要があるため、DNS名、つまり顧客がブラウザに入力するものは同じであることに注意してください: www

2. 変更をプレビューしてマージ

terraform planを確認し、変更をマージして適用します。

Terminal window
terraform plan | grep -v "(known after apply)"
計画の前にメモリ内のTerraform状態を更新しています...
更新された状態はこの計画を計算するために使用されますが、ローカルまたはリモートの状態ストレージに永続化されることはありません。
cloudflare_record.www: 状態を更新中... [id=c38d3103767284e7cd14d5dad3ab8669]
cloudflare_zone_settings_override.example-com-settings: 状態を更新中... [id=e2e6491340be87a3726f91fc4148b126]
------------------------------------------------------------------------
実行計画が生成され、以下に示されています。
リソースアクションは以下の記号で示されます:
+ create
Terraformは以下のアクションを実行します:
# cloudflare_record.www-asia が作成されます
+ resource "cloudflare_record" "www-asia" {
+ allow_overwrite = false
+ name = "www"
+ proxied = true
+ type = "A"
+ value = "198.51.100.15"
+ zone_id = "e2e6491340be87a3726f91fc4148b126"
}
計画: 1を追加、0を変更、0を削除。
------------------------------------------------------------------------
注意: この計画を保存するために -out オプションを使用しなかったため、Terraformは「terraform apply」を実行した場合に正確にこれらのアクションを実行することを保証できません。
Terminal window
git add cloudflare.tf
git commit -m "ステップ4 - アジアデータセンターのための追加の 'www' DNSレコードを追加。"
[step4-loadbalance 6761a4f] ステップ4 - アジアデータセンターのための追加の 'www' DNSレコードを追加。
1ファイルが変更され、7行が追加されました
git checkout master
ブランチ 'master' に切り替えました
Terminal window
git merge step4-loadbalance
e1c38cf..6761a4f を更新中
ファストフォワード
cloudflare.tf | 7 +++++++
1ファイルが変更され、7行が追加されました

3. 変更を適用して確認

www.example.comのための2つ目のDNSレコードを追加します。

Terminal window
terraform apply --auto-approve
cloudflare_record.www: 状態を更新中... [id=c38d3103767284e7cd14d5dad3ab8668]
cloudflare_zone_settings_override.example-com-settings: 状態を更新中... [id=e2e6491340be87a3726f91fc4148b126]
Terraformは選択されたプロバイダーを使用して以下の実行計画を生成しました。
リソースアクションは以下の記号で示されます:
+ create
Terraformは以下のアクションを実行します:
# cloudflare_record.www-asia が作成されます
+ resource "cloudflare_record" "www-asia" {
+ allow_overwrite = false
+ created_on = (適用後に知られる)
+ hostname = (適用後に知られる)
+ id = (適用後に知られる)
+ metadata = (適用後に知られる)
+ modified_on = (適用後に知られる)
+ name = "www"
+ proxiable = (適用後に知られる)
+ proxied = true
+ ttl = (適用後に知られる)
+ type = "A"
+ value = "198.51.100.15"
+ zone_id = "e2e6491340be87a3726f91fc4148b126"
}
計画: 1を追加、0を変更、0を削除。
cloudflare_record.www-asia: 作成中...
cloudflare_record.www-asia: 1秒後に作成完了 [id=fda39d8c9bf909132e82a36bab992864]
適用完了! リソース: 1追加、0変更、0削除。

2つ目のDNSレコードが設置されたので、トラフィックがどこから提供されるかを確認するためにいくつかのリクエストを行います。

Terminal window
curl https://www.example.com
こんにちは、これは203.0.113.10です!
Terminal window
curl https://www.example.com
こんにちは、これは203.0.113.10です!
Terminal window
curl https://www.example.com
こんにちは、これは198.51.100.15です!
Terminal window
curl https://www.example.com
こんにちは、これは203.0.113.10です!

上記のように、どのオリジンがリクエストを受け取るかに明確なパターンはありません。Cloudflareが複数のDNSレコードを持つオリジンに接続すると、IPアドレスの1つがランダムに選択されます。両方のIPが同じデータセンターにあり、セッションを共有できる場合(つまり、同じユーザーがオリジンサーバー間を移動しても問題ない場合)、これはうまく機能するかもしれません。しかし、異なる地理的なオリジンやアクティブなヘルスチェックなど、より複雑な場合には、Cloudflareのロードバランシング製品を使用する必要があります。

4. Cloudflareのロードバランシング製品を使用するように切り替え

ロードバランシングチュートリアルで説明されているように、3つのタスクを完了する必要があります。

  1. オリジンサーバーに対してヘルスチェックを実行するモニターを作成します。
  2. ロードバランスされたトラフィックを受け取る1つ以上のオリジンサーバーのプールを作成します。
  3. 外部ホスト名(例: www.example.com)と1つ以上のプールを持つロードバランサーを作成します。

i. ヘルスチェック(“モニター”)を定義して作成

オリジンを監視するために、https://www.example.comの各オリジンにGETリクエストを行う基本的なヘルスチェックを作成します。オリジンが5秒以内に200ステータスコード(OK)を返す場合、それは正常と見なされます。3回連続して失敗した場合、それは異常と見なされます。このヘルスチェックは、いくつかの地域から1分ごとに実行され、失敗が検出された場合は、あなたのメールアドレス(<YOUR_EMAIL>として設定)にメール通知を送信します。

Terminal window
git checkout step4-loadbalance
新しいブランチ 'step4-loadbalance' に切り替えました
Terminal window
cat >> cloudflare.tf <<'EOF'
resource "cloudflare_load_balancer_monitor" "get-root-https" {
account_id = var.account_id
expected_body = "alive"
expected_codes = "200"
method = "GET"
timeout = 5
path = "/"
interval = 60
retries = 2
description = "GET / over HTTPS - expect 200"
}
EOF

ii. オリジンのプールを定義して作成

この例では、プールはwww-serversと呼ばれ、2つのオリジンが追加されます:

  • www-us (203.0.113.10)
  • www-asia (198.51.100.15)

今のところ、ジオルーティングはスキップします。

前のステップで追加したモニターへの参照に注意してください。この設定を適用するとき、Terraformは最初にモニターを作成する必要があることを判断し、その後IDを取得して作成したいプールに提供します。

Terminal window
cat >> cloudflare.tf <<'EOF'
resource "cloudflare_load_balancer_pool" "www-servers" {
account_id = var.account_id
name = "www-servers"
monitor = cloudflare_load_balancer_monitor.get-root-https.id
origins {
name = "www-us"
address = "203.0.113.10"
}
origins {
name = "www-asia"
address = "198.51.100.15"
}
description = "www origins"
enabled = true
minimum_origins = 1
notification_email = "<YOUR_EMAIL>"
check_regions = ["WNAM", "ENAM", "WEU", "EEU", "SEAS", "NEAS"]
}
EOF

iii. ロードバランサーを定義して作成

ロードバランサー(LB)を作成すると、同じ名前の既存のDNSレコードは置き換えられます。たとえば、以下のwww.example.comロードバランサーを作成すると、以前に定義した2つのwww DNSレコードは上書きされます。DNSレコードをそのまま残しておく利点の1つは、ロードバランシングを一時的に無効にしても、このホスト名への接続が可能であることです(上記のステップ2を参照)。

Terminal window
cat >> cloudflare.tf <<'EOF'
resource "cloudflare_load_balancer" "www-lb" {
zone_id = var.zone_id
name = "www-lb"
default_pool_ids = [cloudflare_load_balancer_pool.www-servers.id]
fallback_pool_id = cloudflare_load_balancer_pool.www-servers.id
description = "example load balancer"
proxied = true
}
EOF

iv. 変更をプレビューしてマージ

通常通り、変更を適用する前に提案された計画を確認します。

Terminal window
terraform plan
cloudflare_record.www: 状態を更新中... [id=c38d3103767284e7cd14d5dad3ab8669]
cloudflare_record.www-asia: 状態を更新中... [id=fda39d8c9bf909132e82a36bab992864]
cloudflare_zone_settings_override.example-com-settings: 状態を更新中... [id=e2e6491340be87a3726f91fc4148b126]
Terraformは選択されたプロバイダーを使用して以下の実行計画を生成しました。
リソースアクションは以下の記号で示されます:
+ create
Terraformは以下のアクションを実行します:
# cloudflare_load_balancer.www-lb が作成されます
+ resource "cloudflare_load_balancer" "www-lb" {
+ created_on = (適用後に知られる)
+ default_pool_ids = (適用後に知られる)
+ description = "example load balancer"
+ enabled = true
+ fallback_pool_id = (適用後に知られる)
+ id = (適用後に知られる)
+ modified_on = (適用後に知られる)
+ name = "www-lb"
+ proxied = true
+ session_affinity = "none"
+ steering_policy = (適用後に知られる)
+ ttl = (適用後に知られる)
+ zone_id = "e2e6491340be87a3726f91fc4148b126"
+ country_pools {
+ country = (適用後に知られる)
+ pool_ids = (適用後に知られる)
}
+ pop_pools {
+ pool_ids = (適用後に知られる)
+ pop = (適用後に知られる)
}
+ region_pools {
+ pool_ids = (適用後に知られる)
+ region = (適用後に知られる)
}
}
# cloudflare_load_balancer_monitor.get-root-https が作成されます
+ resource "cloudflare_load_balancer_monitor" "get-root-https" {
+ account_id = "8baedd8d98bf4b0c9bc650acc307b441"
+ created_on = (適用後に知られる)
+ description = "GET / over HTTPS - expect 200"
+ expected_body = "alive"
+ expected_codes = "200"
+ id = (適用後に知られる)
+ interval = 60
+ method = "GET"
+ modified_on = (適用後に知られる)
+ path = "/"
+ retries = 2
+ timeout = 5
+ type = "http"
}
# cloudflare_load_balancer_pool.www-servers が作成されます
+ resource "cloudflare_load_balancer_pool" "www-servers" {
+ account_id = "8baedd8d98bf4b0c9bc650acc307b441"
+ check_regions = [
+ "EEU",
+ "ENAM",
+ "NEAS",
+ "SEAS",
+ "WEU",
+ "WNAM",
]
+ created_on = (適用後に知られる)
+ description = "www origins"
+ enabled = true
+ id = (適用後に知られる)
+ minimum_origins = 1
+ modified_on = (適用後に知られる)
+ monitor = (適用後に知られる)
+ name = "www-servers"
+ notification_email = "<YOUR_EMAIL>"
+ origins {
+ address = "198.51.100.15"
+ enabled = true
+ name = "www-asia"
+ weight = 1
}
+ origins {
+ address = "203.0.113.10"
+ enabled = true
+ name = "www-us"
+ weight = 1
}
}
計画: 3を追加、0を変更、0を削除。
------------------------------------------------------------------------
注意: この計画を保存するために -out オプションを使用しなかったため、Terraformは「terraform apply」を実行した場合に正確にこれらのアクションを実行することを保証できません。

計画は良さそうです。計画をマージして適用します。

Terminal window
git add cloudflare.tf
git commit -m "ステップ4 - ロードバランサー(LB)モニター、LBプール、LBを作成。"
[step4-loadbalance bc9aa9a] ステップ4 - ロードバランサー(LB)モニター、LBプール、LBを作成。
1ファイルが変更され、35行が追加されました
Terminal window
terraform apply --auto-approve
cloudflare_zone_settings_override.example-com-settings: 状態を更新中... [id=e2e6491340be87a3726f91fc4148b126]
cloudflare_record.www: 状態を更新中... [id=c38d3103767284e7cd14d5dad3ab8669]
cloudflare_record.www-asia: 状態を更新中... [id=fda39d8c9bf909132e82a36bab992864]
Terraformは選択されたプロバイダーを使用して以下の実行計画を生成しました。
リソースアクションは以下の記号で示されます:
# cloudflare_load_balancer.www-lb が作成されます
+ resource "cloudflare_load_balancer" "www-lb" {
+ created_on = (適用後に既知)
+ default_pool_ids = (適用後に既知)
+ description = "例のロードバランサー"
+ enabled = true
+ fallback_pool_id = (適用後に既知)
+ id = (適用後に既知)
+ modified_on = (適用後に既知)
+ name = "www-lb"
+ proxied = true
+ session_affinity = "none"
+ steering_policy = (適用後に既知)
+ ttl = (適用後に既知)
+ zone_id = "e2e6491340be87a3726f91fc4148b126"
+ country_pools {
+ country = (適用後に既知)
+ pool_ids = (適用後に既知)
}
+ pop_pools {
+ pool_ids = (適用後に既知)
+ pop = (適用後に既知)
}
+ region_pools {
+ pool_ids = (適用後に既知)
+ region = (適用後に既知)
}
}
# cloudflare_load_balancer_monitor.get-root-https が作成されます
+ resource "cloudflare_load_balancer_monitor" "get-root-https" {
+ account_id = "8baedd8d98bf4b0c9bc650acc307b441"
+ created_on = (適用後に既知)
+ description = "GET / over HTTPS - 200を期待"
+ expected_body = "alive"
+ expected_codes = "200"
+ id = (適用後に既知)
+ interval = 60
+ method = "GET"
+ modified_on = (適用後に既知)
+ path = "/"
+ retries = 2
+ timeout = 5
+ type = "http"
}
# cloudflare_load_balancer_pool.www-servers が作成されます
+ resource "cloudflare_load_balancer_pool" "www-servers" {
+ account_id = "8baedd8d98bf4b0c9bc650acc307b441"
+ check_regions = [
+ "EEU",
+ "ENAM",
+ "NEAS",
+ "SEAS",
+ "WEU",
+ "WNAM",
]
+ created_on = (適用後に既知)
+ description = "wwwオリジン"
+ enabled = true
+ id = (適用後に既知)
+ minimum_origins = 1
+ modified_on = (適用後に既知)
+ monitor = (適用後に既知)
+ name = "www-servers"
+ notification_email = "<YOUR_EMAIL>"
+ origins {
+ address = "198.51.100.15"
+ enabled = true
+ name = "www-asia"
+ weight = 1
}
+ origins {
+ address = "203.0.113.10"
+ enabled = true
+ name = "www-us"
+ weight = 1
}
}
cloudflare_load_balancer_monitor.get-root-https: 作成中...
cloudflare_load_balancer_monitor.get-root-https: 1秒後に作成完了 [id=4238142473fcd48e89ef1964be72e3e0]
cloudflare_load_balancer_pool.www-servers: 作成中...
cloudflare_load_balancer_pool.www-servers: 0秒後に作成完了 [id=906d2a7521634783f4a96c062eeecc6d]
cloudflare_load_balancer.www-lb: 作成中...
cloudflare_load_balancer.www-lb: 1秒後に作成完了 [id=cb94f53f150e5c1a65a07e43c5d4cac4]
適用完了!リソース: 3追加, 0変更, 0削除。

v. 変更をテストする

ロードバランシングが設定されたので、再度4回 curl リクエストを実行して、トラフィックがどこから提供されるかを確認します。

Terminal window
for i in {1..4}; do curl https://www.example.com && sleep 5; done
こんにちは、これは198.51.100.15です!
こんにちは、これは203.0.113.10です!
こんにちは、これは198.51.100.15です!
こんにちは、これは203.0.113.10です!

これで、定義した2つのオリジン間で各リクエストが均等にロードバランスされているのが確認できるはずです。