4 – パフォーマンスの向上
このチュートリアルでは、基本的なラウンドロビンのために2つ目のオリジンを追加し、必要に応じてトラフィックをフェイルオーバーするためにCloudflare Load Balancing製品を使用します。また、エンドユーザーに地理的に最も近いオリジンサーバーから結果を提供するために「ジオスティアリング」を使用して、ロードバランシングの設定を強化します。
まず、アジアにある2つ目のウェブサーバーのDNSレコードを追加します。このサーバーのIPアドレスは198.51.100.15です。
git checkout -b step4-loadbalance新しいブランチ 'step4-loadbalance' に切り替えました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}EOFresourceの名前は異なりますが、同じタイプのTerraformリソースは一意に名前を付ける必要があるため、DNS名、つまり顧客がブラウザに入力するものは同じであることに注意してください: www。
terraform planを確認し、変更をマージして適用します。
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」を実行した場合に正確にこれらのアクションを実行することを保証できません。git add cloudflare.tfgit commit -m "ステップ4 - アジアデータセンターのための追加の 'www' DNSレコードを追加。"[step4-loadbalance 6761a4f] ステップ4 - アジアデータセンターのための追加の 'www' DNSレコードを追加。 1ファイルが変更され、7行が追加されましたgit checkout masterブランチ 'master' に切り替えましたgit merge step4-loadbalancee1c38cf..6761a4f を更新中ファストフォワード cloudflare.tf | 7 +++++++ 1ファイルが変更され、7行が追加されましたwww.example.com ↗のための2つ目のDNSレコードを追加します。
terraform apply --auto-approvecloudflare_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レコードが設置されたので、トラフィックがどこから提供されるかを確認するためにいくつかのリクエストを行います。
curl https://www.example.comこんにちは、これは203.0.113.10です!curl https://www.example.comこんにちは、これは203.0.113.10です!curl https://www.example.comこんにちは、これは198.51.100.15です!curl https://www.example.comこんにちは、これは203.0.113.10です!上記のように、どのオリジンがリクエストを受け取るかに明確なパターンはありません。Cloudflareが複数のDNSレコードを持つオリジンに接続すると、IPアドレスの1つがランダムに選択されます。両方のIPが同じデータセンターにあり、セッションを共有できる場合(つまり、同じユーザーがオリジンサーバー間を移動しても問題ない場合)、これはうまく機能するかもしれません。しかし、異なる地理的なオリジンやアクティブなヘルスチェックなど、より複雑な場合には、Cloudflareのロードバランシング製品を使用する必要があります。
ロードバランシングチュートリアルで説明されているように、3つのタスクを完了する必要があります。
- オリジンサーバーに対してヘルスチェックを実行するモニターを作成します。
- ロードバランスされたトラフィックを受け取る1つ以上のオリジンサーバーのプールを作成します。
- 外部ホスト名(例:
www.example.com)と1つ以上のプールを持つロードバランサーを作成します。
オリジンを監視するために、https://www.example.comの各オリジンにGETリクエストを行う基本的なヘルスチェックを作成します。オリジンが5秒以内に200ステータスコード(OK)を返す場合、それは正常と見なされます。3回連続して失敗した場合、それは異常と見なされます。このヘルスチェックは、いくつかの地域から1分ごとに実行され、失敗が検出された場合は、あなたのメールアドレス(<YOUR_EMAIL>として設定)にメール通知を送信します。
git checkout step4-loadbalance新しいブランチ 'step4-loadbalance' に切り替えました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この例では、プールはwww-serversと呼ばれ、2つのオリジンが追加されます:
www-us(203.0.113.10)www-asia(198.51.100.15)
今のところ、ジオルーティングはスキップします。
前のステップで追加したモニターへの参照に注意してください。この設定を適用するとき、Terraformは最初にモニターを作成する必要があることを判断し、その後IDを取得して作成したいプールに提供します。
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ロードバランサー(LB)を作成すると、同じ名前の既存のDNSレコードは置き換えられます。たとえば、以下のwww.example.comロードバランサーを作成すると、以前に定義した2つのwww DNSレコードは上書きされます。DNSレコードをそのまま残しておく利点の1つは、ロードバランシングを一時的に無効にしても、このホスト名への接続が可能であることです(上記のステップ2を参照)。
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通常通り、変更を適用する前に提案された計画を確認します。
terraform plancloudflare_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」を実行した場合に正確にこれらのアクションを実行することを保証できません。計画は良さそうです。計画をマージして適用します。
git add cloudflare.tfgit commit -m "ステップ4 - ロードバランサー(LB)モニター、LBプール、LBを作成。"[step4-loadbalance bc9aa9a] ステップ4 - ロードバランサー(LB)モニター、LBプール、LBを作成。 1ファイルが変更され、35行が追加されましたterraform apply --auto-approvecloudflare_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削除。ロードバランシングが設定されたので、再度4回 curl リクエストを実行して、トラフィックがどこから提供されるかを確認します。
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つのオリジン間で各リクエストが均等にロードバランスされているのが確認できるはずです。