Microsoft IIS バックエンドによるクロスリージョン ロード バランシング

このチュートリアルでは、Compute Engine の外部アプリケーション ロードバランサ サービスを使用して、異なる Compute Engine のリージョンにある複数の Microsoft インターネット インフォメーション サービス(IIS)ウェブサーバーにトラフィックを分散する方法について説明します。

シナリオ

サイト www.example.com のトラフィックを負荷分散する必要があります。受信リクエストが最も近いリージョンにルーティングされるようにします。必要に応じて、次に近いリージョンの正常なインスタンスにリクエストがフェイルオーバーされるようにします。

このシナリオで構成する外部アプリケーション ロードバランサでは、1 つのグローバル IP アドレスからリクエストを受け取ります。この IP アドレスで、接続タイプが HTTP と HTTPS のどちらであるかに応じて受信リクエストをルーティングできます。HTTPS リクエストの場合は、リクエストを送信したクライアントとロードバランサの間で SSL / TLS 暗号化が実施されます。

次の図に、このロードバランサのアーキテクチャを示します。

クロスリージョン ロード バランシングの図。
クロスリージョン ロード バランシングの図(クリックして拡大)

このロードバランサは、構成の柔軟性を高めるために複数のコンポーネントで構成されます。各コンポーネントの詳細については、外部アプリケーション ロードバランサの概要をご覧ください。

  • Compute Engine 仮想マシン インスタンス
  • Compute Engine 永続ディスク
  • Windows Server 2012 マシンイメージ

このチュートリアルの実行にかかる費用は、実行時間、インスタンス数、ディスクサイズ、マシンタイプによって変動します。料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを出すことができます。Google Cloud を初めて使用する方は、無料トライアルをご利用いただける場合があります。

このチュートリアルの前提条件は次のとおりです。

バックエンド インスタンスを設定する

このセクションでは、異なるリージョンに 2 つのバックエンド サービスを作成します。各バックエンド サービスに 2 つのバックエンド インスタンスを含め、それぞれ Windows Server 2012 で Microsoft IIS ウェブサーバーを実行します。サーバーを 1 つずつ手動で構成する手間を省くため、1 つのサーバー インスタンスからディスク イメージを作成し、そのイメージを使用して残りのサーバー インスタンスを作成します。

ソースイメージ インスタンスを作成する

ソースイメージとして使用するインスタンスを作成します。

  1. ローカル Windows マシンで PowerShell を開きます。
  2. us-central1 リージョンに新しい Windows Server 2012 インスタンスを作成し、そのインスタンスに rdp-tag タグと www-tag タグを追加します。後で、これらのタグを指定するファイアウォール ルールを作成して、インスタンスへの外部アクセスを有効にします。

    PS C:\> gcloud compute instances create src-img ^
         --zone us-central1-f --image windows-2012-r2 ^
         --tags rdp-tag,www-tag

ソースイメージ インスタンスを作成したら、インスタンスへの外部アクセスを許可するファイアウォール ルールを設定します。

  1. rdp-tag というタグが付いたすべてのインスタンスに対して、ポート 3389 への外部アクセスを許可するファイアウォール ルールを作成します。このルールにより、ソースイメージ インスタンスと rdp-tag タグを使用する以降のすべてのインスタンスに RDP を使用してアクセスできるようにします。

    PS C:\> gcloud compute firewall-rules create rdp-rule ^
         --allow tcp:3389 --source-ranges 0.0.0.0/0 ^
         --target-tags rdp-tag
  2. www-tag のタグが付いたすべてのインスタンスに対して、ポート 80 への外部アクセスを許可する別のファイアウォール ルールを作成します。このルールにより、ソースイメージ インスタンスと www-tag タグを使用する以降のすべてのインスタンスで HTTP トラフィックを送受信できるようにします。

     PS C:> gcloud compute firewall-rules create www-rule ^
         --allow tcp:80 --source-ranges 0.0.0.0/0 ^
         --target-tags www-tag

ソースイメージ インスタンスを構成する

次に、ソースイメージ インスタンスの新しい Windows ユーザーを作成し、RDP 接続を確立します。

  1. ウェブブラウザで Google Cloud コンソール[VM インスタンス] ページに移動し、ソースイメージ インスタンスの名前(src-img)をクリックします。
  2. [Windows パスワードを設定] ボタンをクリックします。
  3. [新しい Windows パスワードの設定] ダイアログで、ユーザー名を追加します。
  4. [設定] をクリックして、インスタンスにユーザー アカウントを作成します。
  5. 表示されたパスワードをコピーし、ダイアログを閉じます。
  6. [RDP] プルダウンをクリックし、[RDP ファイルをダウンロード] オプションを選択して、インスタンスの RDP ファイルをダウンロードします。

    このファイルを RDP クライアントで使用することで、インスタンスに接続できます。詳細については、Microsoft リモート デスクトップ クライアントをご覧ください。

ソースイメージ インスタンスとの RDP 接続を確立したら、IIS をインストールしてデフォルトのホームページを追加します。

  1. ソースイメージ インスタンスで、管理者として PowerShell を開きます。
  2. PowerShell で、次のコードを貼り付けて IIS サービスと依存関係をインストールします。

    PS C:\> Dism /Online /Enable-Feature /FeatureName:IIS-WebServerRole /FeatureName:IIS-WebServer /FeatureName:IIS-StaticContent /FeatureName:IIS-DefaultDocument /FeatureName:IIS-DirectoryBrowsing /FeatureName:IIS-HttpErrors /FeatureName:IIS-HealthAndDiagnostics /FeatureName:IIS-HttpLogging /FeatureName:IIS-LoggingLibraries /FeatureName:IIS-RequestMonitor /FeatureName:IIS-Security /FeatureName:IIS-RequestFiltering /FeatureName:IIS-HttpCompressionStatic /FeatureName:IIS-WebServerManagementTools /FeatureName:IIS-ManagementConsole /FeatureName:WAS-WindowsActivationService /FeatureName:WAS-ProcessModel /FeatureName:WAS-NetFxEnvironment /FeatureName:WAS-ConfigurationAPI /All
  3. サービスをインストールしたら、IIS のデフォルトのウェブ ディレクトリ C:\inetpub\wwwroot に新しいホームページを作成します。

    PS C:\> Echo '<!doctype html><html><body><h1>Hello World!</h1></body></html>' > C:\inetpub\wwwroot\index.html

ソースイメージ インスタンスからコンテンツを配信できることを確認する

ウェブブラウザで [VM インスタンス] ページにアクセスします。インスタンスの外部 IP をクリックして、前のステップで作成したホームページが表示されることを確認します。

ソースイメージ インスタンスから再利用可能な Windows Server 2012 イメージを作成する

ソースイメージ インスタンスが適切に構成され、コンテンツを配信できることを確認したら、インスタンスのルート永続ディスクから再利用可能なディスク イメージを作成します。

  1. ソースイメージ インスタンスで、管理者として PowerShell を開きます。
  2. システムのクローンを作成する準備として、次のコマンドを実行します。

     PS C:> GCESysprep

    GCESysprep のオペレーションが完了すると、RDP セッションが自動的に切断されます。

  3. ローカルマシンで次のコマンドを実行して、ソース インスタンスを削除します。ただし、インスタンスのルート永続ディスクは残します。

     PS C:> gcloud compute instances delete src-img --keep-disks boot

  4. インスタンスを削除したら、削除せずに残したルート永続ディスクから新しいイメージを作成します。

     PS C:> gcloud compute images create win-be-img --source-disk src-img --source-disk-zone us-central1-f

ソースイメージを使用してインスタンス テンプレートを作成する

構成した Windows サーバーからディスク イメージを作成したら、そのイメージをインスタンス テンプレートのソースイメージとして使用できます。その後、このテンプレートを使用して新しいインスタンスを作成する 2 つのマネージド インスタンス グループを構成します。

ローカルマシンで次のコマンドを実行してインスタンス テンプレートを作成します。ソースイメージには win-be-img、インスタンス タグには rdp-tagwww-tag を使用します。

PS C:\> gcloud compute instance-templates create win-be-tmpl ^
    --tags rdp-tag,www-tag ^
    --image win-be-img

各リージョンのマネージド インスタンス グループを作成する

次に、各リージョンのマネージド インスタンス グループを作成します。インスタンス グループを作成すると、前のステップで定義したインスタンス テンプレートに基づいて、それぞれ 2 つの同一インスタンスが追加されます。これらのインスタンス グループは、後でロードバランサを構成するときにバックエンド ターゲットとして使用します。

マネージド インスタンス グループを作成する手順は次のとおりです。

  1. ローカルマシンで次のコマンドを実行して、ゾーン us-central1-f に新しいマネージド インスタンス グループを作成し、そのグループに 2 つの同一インスタンスを追加します。

     PS C:> gcloud compute instance-groups managed create us-be-group ^
          --base-instance-name us ^
          --size 2 ^
          --zone us-central1-f ^
          --template win-be-tmpl

  2. ゾーン europe-west1-d についても同様に処理します。

    PS C:\> gcloud compute instance-groups managed create eu-be-group ^
          --base-instance-name eu ^
          --size 2 ^
          --zone europe-west1-d ^
          --template win-be-tmpl

バックエンド インスタンスが実行されていることを確認する

ウェブブラウザで [VM インスタンス] ページにアクセスします。各バックエンドの外部 IP をクリックして、前のステップで作成したホームページが表示されることを確認します。

負荷分散サービスを作成して構成する

Compute Engine 負荷分散サービスは複数のコンポーネントで構成されます。このセクションでは、それらのコンポーネントを作成して連携させます。

  1. ローカルマシンで次のコマンドを実行して新しいヘルスチェックを作成します。ロードバランサは、このヘルスチェックを使用してバックエンド インスタンスの状態を確認します。

    PS C:\> gcloud compute http-health-checks create basic-check
  2. バックエンド サービスを作成します。

    PS C:\> gcloud compute backend-services create be-srv ^
          --protocol HTTP --http-health-check basic-check --global-health-checks
  3. インスタンス グループをバックエンド サービスのバックエンド ターゲットとして追加します。

    PS C:\> gcloud beta compute backend-services add-backend be-srv ^
          --instance-group us-be-group --zone us-central1-f
    PS C:\> gcloud beta compute backend-services add-backend be-srv ^
          --instance-group eu-be-group --zone europe-west1-d
  4. すべての受信リクエストをすべてのインスタンスに転送するデフォルトの URL マップを作成します。

    PS C:\> gcloud compute url-maps create lb-map --default-service be-srv
  5. SSL 証明書リソースを作成します。このリソースは、ロードバランサでトラフィックの暗号化と復号に使用します。

    秘密鍵と認証局が発行した SSL 証明書を入手済みの場合は、次のコマンドを実行すると、それらを使用して新しい SSLCertificate リソースを作成できます。それ以外の場合は、テスト用の自己署名証明書を作成して使用できます。詳しくは、秘密鍵と証明書を作成するをご覧ください。

    次のコマンドを実行して SSL 証明書リソースを作成します。<crt_file_path> は証明書のローカルパス、<key_file_path> は秘密鍵のパスで置き換えてください。

    PS C:\> gcloud beta compute ssl-certificates create www-cert ^
    --certificate  --private-key 
  6. URL マップにリクエストをルーティングするターゲットの HTTP プロキシと HTTPS プロキシを作成します。プロキシはロードバランサにおいてロードバランサ用の SSL 証明書を保持するコンポーネントであるため、ここで証明書とプロキシの関連付けもあわせて行います。

     PS C:> gcloud compute target-http-proxies create http-lb-proxy ^
          --url-map lb-map
     PS C:> gcloud beta compute target-https-proxies create https-lb-proxy ^
          --url-map lb-map --ssl-certificate www-cert

  7. ロードバランサで確実にトラフィックを受信するように、ロードバランサのグローバル転送ルールにグローバル静的 IP アドレスを割り当てる必要があります。グローバル静的 IP リソースを作成するには、次のコマンドを実行します。

     PS C:> gcloud compute addresses create lb-ip --global

    IP アドレスはメモしておいてください。

  8. HTTP と HTTPS の受信リクエスト用にグローバル転送ルールを 2 つ作成します。それぞれの転送ルールにより、IP アドレス、IP プロトコル、ポートの指定に応じて、作成したいずれかのターゲット プロキシにトラフィックが送信されます。

    次のコマンドの <lb_ip_addr> は、前のステップで作成した静的 IP アドレスに置き換えてください。

    PS C:\> gcloud compute forwarding-rules create http-fwd-rule ^
          --address <lb_ip_addr> --global ^
          --target-http-proxy http-lb-proxy --port-range 80
    PS C:\> gcloud beta compute forwarding-rules create https-fwd-rule ^
          --address <lb_ip_addr> --global ^
          --target-https-proxy https-lb-proxy --port-range 443

グローバル転送ルールを作成した後、構成が反映されるまでに数分かかることがあります。進行状況を確認するには、Google Cloud コンソールで構成をモニタリングするか、ローカルマシンで次のコマンドを実行します。

PS C:\> gcloud compute backend-services get-health be-srv

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

負荷分散サービスの構成が完了したので、転送ルールへのトラフィックの送信を開始し、各インスタンスにトラフィックが分散されるようすを観測できます。

バックエンドにトラフィックを送信する手順は次のとおりです。

  1. Google Cloud コンソール[ロード バランシング] ページを開きます。
  2. ロードバランサの名前をクリックします。
  3. ページの [バックエンド] セクションで [正常] 列を見て、インスタンスが正常であることを確認します。インスタンスが正常であることが画面に表示されるまでに少し時間がかかる場合があります。
  4. インスタンスが正常と表示されたら、[フロントエンド] セクションから [IP: ポート] の内容をコピーし、ブラウザに貼り付けます。
  5. ブラウザにデフォルトのコンテンツ ページが表示されます。

バックエンドへのアクセスを制限する

ここまでの作業に問題がないことを確認したら、インスタンスで負荷分散サービスからの HTTP(S) トラフィックのみを受け入れるようにファイアウォール ルールを変更します。

  1. ローカルマシンで次のコマンドを実行して、www-rule ファイアウォール ルールを更新します。このコマンドを実行すると、ロードバランサのプロキシとヘルスチェックの IP 範囲 130.211.0.0/22 および 35.191.0.0/16 以外のすべての IP 範囲からのトラフィックが制限されます。

    PS C:\> gcloud compute firewall-rules update www-rule ^
           --source-ranges 130.211.0.0/22,35.191.0.0/16 ^
           --target-tags www-tag
  2. ウェブブラウザで [VM インスタンス] ページにアクセスします。

  3. 各インスタンスをクリックして、インスタンスにアクセスできなくなったことを確認します。

停止のシミュレーションを行う

1 つのリージョン内の 1 つ以上のインスタンスについて停止のシミュレーションを実施できます。このシミュレーションによって、停止したインスタンス以外の正常なインスタンス間で負荷がどのように分散されるかを確認できます。

インスタンスでのリクエストの受信を停止するには:

  1. インスタンスへの RDP 接続を確立します。
  2. インスタンスで、管理者として PowerShell を開きます。
  3. 次のコマンドを実行して、インスタンスに適用する新しいファイアウォール ルールを作成します。このコマンドを実行すると、ヘルス チェッカーからのヘルスチェック トラフィックがブロックされ、ロードバランサからインスタンスへの新しい HTTP 接続もすべて阻止されます。

    PS C:\> netsh advfirewall firewall add rule name="Outage Test" protocol=tcp dir=in localport=80 action=block remoteip=130.211.0.0/22,35.191.0.0/16
  4. ローカルマシンで次のコマンドを実行して、インスタンスのステータスが UNHEALTHY になったことを確認します。

    PS C:\> gcloud compute backend-services get-health be-srv
  5. インスタンスのステータスが UNHEALTHY になったら、ロードバランサにリクエストを送信します。正常なインスタンスからのみレスポンスが返されます。

  6. 停止のシミュレーションが終了したら、ファイアウォール ルールを削除してインスタンスの接続を復元します。停止したインスタンスで管理者として PowerShell を開き、次のコマンドを実行してルールを削除します。

    PS C:\> netsh advfirewall firewall delete rule name="Outage Test"

クリーンアップ

チュートリアルが終了したら、作成したリソースをクリーンアップして、割り当ての使用を停止し、課金されないようにできます。以下のセクションで、リソースを削除または無効にする方法を説明します。

Google Cloud プロジェクトを削除する

課金をなくす最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。

プロジェクトを削除するには:

  1. Google Cloud コンソールで、[リソースの管理] ページに移動します。

    [リソースの管理] に移動

  2. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
  3. ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。

インスタンスを削除する

Compute Engine インスタンスを削除するには:

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

    [VM インスタンス] に移動

  2. 削除するインスタンスのチェックボックスを選択します。
  3. インスタンスを削除するには、 [その他の操作] をクリックし、[削除] をクリックしてから、指示に沿って操作します。

永続ディスクを削除する

Compute Engine ディスクを削除するには:

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

    [ディスク] に移動

  2. 削除するディスクのチェックボックスを選択します。
  3. ディスクを削除するには、[削除] をクリックします。

次のステップ

Compute Engine での Windows の運用方法の詳細を確認する

Compute Engine での Windows インスタンスの作成と管理に関するドキュメントをご覧ください。

他のチュートリアルを試す

Google Cloud に関するリファレンス アーキテクチャ、図、ベスト プラクティスを確認する。Cloud Architecture Center をご覧ください。