負荷分散された IIS ウェブサーバーのデプロイ


このチュートリアルは、Microsoft Active Directory、SQL Server、Internet Information Services(IIS)を使用して高可用性の Windows アーキテクチャをデプロイする方法を説明するシリーズの第 3 部です。このチュートリアルでは、同じリージョン内の異なるゾーンで稼働する 2 つの IIS ウェブサーバーを設定します。次に、ウェブサーバーを SQL Server 可用性グループとドメイン コントローラに接続します。ロードバランサの背後にウェブサーバーを設定することで、個々のサーバーへの負荷を軽減できます。いずれかのサーバーがオフラインになった場合でも、アプリの実行を継続できます。

このシリーズは次のチュートリアルで構成されています。

Google Cloud プロジェクトにドメイン コントローラと SQL Server インスタンスを設定します。また、このデプロイメントの各コンポーネントは、ドメイン コントローラが提供する Windows 認証と安全に統合できるように設計されています。

このチュートリアルで説明するアーキテクチャは、Google Cloud 上で動作するように設計されています。Active Directory や SQL Server などの一部のコンポーネントはオンプレミスで実行できますが、このチュートリアルでは、すべてのコンポーネントを Google Cloud 上で実行するシナリオについてのみ説明します。

目標

  • 2 つのゾーンにまたがる 2 つのネットワーク サブネットを作成する。
  • 各ゾーンに Microsoft SQL Server 仮想マシン(VM)をデプロイする。
  • Active Directory ドメインに参加するように SQL Server インスタンスを構成する。
  • Windows Server フェイルオーバー クラスタを作成する。
  • SQL Server Bookshelf サンプル データベースを作成して設定する。
  • SQL Server Always On Availability グループを設定する。

費用

このチュートリアルでは、前のチュートリアルで構成した Google Cloud リソースを引き続き使用します。次の課金対象コンポーネントを使用します。

料金計算ツールの見積もりでは、この環境の費用は 1 日あたり約 $4 です。

始める前に

このチュートリアルで使用する構成には、Windows ドメイン コントローラと作業中の Active Directory ドメインへのアクセス権が必要です。この環境がない場合は、次のチュートリアルの手順を完了します。

このチュートリアルでは、Windows ワークステーションでタスクを実行します。これはローカル PC でもかまいません。また、IIS ウェブサーバーに使用する VPC ネットワーク内に配置する必要はありません。ワークステーションに次のものがインストールされていることを確認します。

共通変数の初期化

このシリーズの最初のチュートリアルで、インフラストラクチャの要素をデプロイする Google Cloud 内の場所を制御する変数を定義しました。変数が正しく設定され、前に設定した値と一致していることを確認します。

  1. Cloud Shell を開きます。

    Cloud Shell を開く

  2. Cloud Shell で次の環境変数を作成して、チュートリアルの以降の部分で必要となる値を設定します。

    下のコマンドは、リージョンを us-east1 に設定します。前のチュートリアルで別のリージョンを使用した場合は、このスクリプトのリージョンを以前に使用したものに変更します。

    region=us-east1
    zone_1=${region}-b
    zone_2=${region}-c
    vpc_name=webappnet
    project_id=your-project-id
    

    your-project-id は、使用している Cloud プロジェクトの ID に置き換えます。

ネットワーク インフラストラクチャの作成

このセクションでは、既存の Virtual Private Cloud(VPC)ネットワークにサブネットワークを追加します(VPC ネットワークは前のチュートリアルで作成しています)。これらのサブネットは、ウェブサーバー インスタンスに割り当てられる一意の IP アドレス範囲を提供します。このアドレス範囲を使用して、サブネットに基づくオプションのファイアウォール ポリシーを設定できます。

  1. Cloud Shell で、既存の VPC ネットワークにサブネットを追加します。

    gcloud compute networks subnets create public-webapp-zone \
        --network $vpc_name \
        --region $region \
        --range 10.5.0.0/24 \
        --project $project_id
    
  2. 内部 IP アドレス間のトラフィックを許可する内部ファイアウォール ルールを作成します。

    gcloud compute firewall-rules create  allow-internal-ports-public-webapp \
        --network $vpc_name \
        --allow tcp:1-65535,udp:1-65535,icmp \
        --source-ranges 10.5.0.0/24 \
        --project $project_id
    

ウェブサーバーの起動

Google Cloud Marketplace のイメージを使用して、ウェブサーバーをプロビジョニングします。ウェブサーバーをプロビジョニングしたら、それらをターゲットとしてウェブアプリをデプロイできます。

最初のサーバーを作成する

  1. Google Cloud Marketplace に移動します。

    Google Cloud Marketplace に移動

  2. Google Cloud Console で、ウェブサーバーを実行する Cloud プロジェクトを選択します。このチュートリアルでは、前のチュートリアルで使用したものと同じプロジェクトを使用します。

  3. ページで次の値を設定します。

    • デプロイメント名: webserver1
    • ゾーン: zone_1
    • Windows Server OS バージョン: 2016
    • ブートタイプ: SSD 永続ディスク
    • ディスクサイズ: 200 GB
    • ネットワーク名: vpc_name
    • サブネットワーク名: public-webapp-zone
    • ファイアウォール: WebDeploy トラフィックを許可するHTTP トラフィックを許可する

    zone_1vpc_name は、このチュートリアルで変数を初期化したときに使用した値に置き換えます。

  4. [デプロイ] をクリックしてGoogle Cloud Console でデプロイの完了が表示されるまで待ちます。

サーバー インスタンスに接続する

  1. Cloud Shell で、webserver1 インスタンスのパスワードを作成します。

    gcloud compute reset-windows-password webserver1 \
        --zone $zone_1 \
        --project $project_id \
        --quiet
    
  2. リモート デスクトップ プロトコル(RDP)を使用して、新しい Windows インスタンスに接続します。前の手順で作成した認証情報を使用します。

サーバー インスタンスを構成する

  1. webserver1 インスタンスで、管理者として PowerShell ターミナルを開きます。

  2. DNS IP アドレスとドメイン名の変数を設定します。

    $DNS1 = "10.1.0.100"
    $DNS2 = "10.2.0.100"
    $DomainName = "example-gcp.com"
    
  3. webapp.serviceというローカル サービス アカウントを作成します。これは、後でウェブアプリを公開するときに使用します。

    net user webapp.service * /add
    

    プロンプトが表示されたら、パスワードを入力します。安全なパスワードを使用してください。後で使用するので、このパスワードは安全な場所に保管してください。

  4. アカウントを有効にして、Administrators ローカル グループに追加します。

    net user webapp.service /active:yes
    net localgroup administrators webapp.service /add
    
  5. DNS サーバーを構成します。

    netsh interface ip set dns Ethernet static $DNS1
    netsh interface ip add dns Ethernet $DNS2 index=2
    
  6. ウェブサーバーを example-gcp.com ドメインに参加させます。

    Add-Computer -DomainName $DomainName -Credential (Get-Credential "example\Administrator")
    

    メッセージが表示されたら、管理者アカウントのパスワードを入力します。これは、このシリーズの最初のチュートリアルで Active Directory フォレストを作成したときに使用したドメイン アカウントです。安全なパスワードを使用してください。後で使用するので、このパスワードは安全な場所に保管してください。

    次のエラー メッセージは無視してください。

    WARNING: The changes will take effect after you restart the computer webserver1.
    
  7. VM を再起動します。

    Restart-Computer
    

    これで、開いている RDP セッションが終了します。

2 つ目のサーバー インスタンスを作成して構成する

前の手順を繰り返し、2 つ目のサーバー インスタンスを作成します。

  1. 次の値を使用して、サーバーの作成手順を繰り返します。

    • デプロイメント名: webserver2
    • ゾーン: zone_2
    • マシンタイプ: 2 vCPU
    • Windows Server OS バージョン: 2016
    • ブートタイプ: SSD 永続ディスク
    • ディスクサイズ: 200 GB
    • ネットワーク名: vpc_name
    • サブネットワーク名: public-webapp-zone
    • ファイアウォール: WebDeploy トラフィックを許可するHTTP トラフィックを許可する

    zone_2vpc_name は、このチュートリアルで変数を初期化したときに使用した値に置き換えます。

  2. webserver2 Windows インスタンスのパスワードを作成します。

    gcloud compute reset-windows-password webserver2 \
        --zone $zone_2\
        --project $project_id \
        --quiet
    

    この手順では、RDP との接続に使用するユーザー アカウントのパスワードを設定します。ユーザー名は、Google アカウント名(gcloud config get-value core/account コマンドで返されるユーザー名)です。このチュートリアルの後の手順で使用するため、ユーザー名とパスワードをメモしておきます。

  3. RDP を使用してインスタンスに接続します。前の手順で作成した認証情報を使用します。

  4. webserver2 インスタンスに接続します。最初のインスタンスで使用した手順に沿って進めます。ただし、今回は 2 つ目のサーバー インスタンスに作成したパスワードを使用します。

  5. webserver2 インスタンスを構成します。最初のインスタンスの構成で使用した手順に従います。同じパスワードを使用して、同じサービス アカウントを作成します。

ウェブアプリのクローンを作成する

次に、各 IIS サーバーを構成し、そこに ASP.NET のサンプルアプリをデプロイします。ウェブアプリには、前のチュートリアルで構成した SQL Server インスタンスに自動的に接続するための認証情報が設定されています。

  1. Visual Studio と Git がインストールされている Windows ワークステーションにログインしていることを確認します。

  2. Windows ワークステーションのコマンド ウィンドウで、ワークステーションにサンプル ソースコードのリポジトリのクローンを作成します。

    cd c:\
    git clone https://github.com/GoogleCloudPlatform/getting-started-dotnet.git
    cd getting-started-dotnet
    git checkout ad49d787eec88fb30a4b45b4146f5cb63c0519e
    
  3. 次のフォルダに移動します。

    C:\getting-started-dotnet\aspnet\2-structured-data
    
  4. Visual Studio でサンプルアプリ ソリューションを開くには、2-structured-data.sln ファイルをダブルクリックします。

  5. [ソリューション エクスプローラー] ペインで、Web.config ファイルをダブルクリックして開きます。

  6. GoogleCloudSamples:ProjectId キーにプロジェクト ID を設定します。

    プロジェクト ID が webapp-sql-ad の場合、次のような行になります。

    <add key="GoogleCloudSamples:ProjectId" value="webapp-sql-ad" />
    
  7. GoogleCloudSamples:BookStore 値を sqlserver に設定します。

    <add key="GoogleCloudSamples:BookStore" value="sqlserver" />
    
  8. ファイルの最後のほうにある <connectionStrings> で、name="LocalSqlServer" 属性を持つ connectionStrings XML サブ要素を見つけます。次に、以下の操作を行います。

    • connectionString の値を SQL Server 可用性グループ リスナーの名前(sql-listener)に更新します(このシリーズのチュートリアルでは、マルチサブネット SQL Server のデプロイでこのリスナーを設定しています)。
    • Initial Catalogbookshelf に変更します。
    • Integrated SecurityTrue に設定します。
    • データベースの設定時にデータベース サービス アカウントに作成したユーザー名とログイン パスワードを使用します。
  9. Web.config ファイルを保存して閉じます。

  10. ソリューションをビルドするには、Visual Studio のメニューで [ビルド] > [ソリューションのビルド] の順にクリックします。

ASP.NET アプリをデプロイする

このセクションでは、両方のウェブサーバーにウェブアプリをデプロイします。

  1. ワークステーションで 2-structured-data.sln ファイルを閉じた場合は、もう一度開きます。このファイルを次のフォルダで探し、ダブルクリックします。

    C:\getting-started-dotnet\aspnet\2-structured-data
    
  2. Visual Studio で、[ツール] > [Google Cloud Tools] > [Google Cloud Explorer] の順にクリックします。

  3. 作業中のプロジェクトを選択し、[Google Compute Engine] を展開します。

  4. webserver1 インスタンスを右クリックします。

  5. [Manage Windows Credentials] を選択します。

  6. [Add credentials] をクリックします。

  7. webapp.service というユーザー名を入力します。

  8. [I have password for this user] を選択し、ウェブサーバーの起動時に作成したパスワードを入力します。

  9. [Create a password for me] が選択されていないことを確認して、[保存] をクリックします。

  10. [Windows Credentials] ウィンドウを閉じるには、[閉じる] をクリックします。

  11. Google Cloud Explorer を閉じます。

  12. Visual Studio で、[ツール] > [Google Cloud Tools] > [Publish 2-structured-data to Google Cloud] の順にクリックします。

  13. [発行] ダイアログ ボックスで、[Compute Engine] をクリックします。

  14. webserver1 VM を選択し、認証情報webapp.service に設定します。

  15. サンプルアプリをビルドしてデプロイするには、[発行] をクリックします。

    サンプルアプリが発行されると、デフォルトのウェブブラウザでアプリが開きます。

  16. この手順を webserver2 に繰り返します。

負荷分散の設定

これで、ウェブサーバーのネットワーク負荷分散を設定できるようになりました。ここでは、ロードバランサにヘルスチェックを追加します。グローバル ロードバランサは、IIS サーバー間でリクエストを自動的に分散します。また、IIS サーバーの 1 つがヘルスチェックに失敗し、オフラインになっている場合、ロードバランサは他のサーバーにトラフィックを自動的に転送します。

  1. Cloud Shell で、ロードバランサに静的外部 IP アドレスを作成します。

    gcloud compute addresses create webapp-lb-ip \
        --region $region \
        --project $project_id
    

    VM インスタンスは、この IP アドレスを宛先とするパケットを受信します。

  2. HTTP ヘルスチェック オブジェクトを追加します。

    gcloud compute http-health-checks create bookshelf-check \
        --project $project_id \
        --request-path /Books
    

    この例では、ヘルスチェック メカニズムのデフォルト設定を使用しますが、独自にカスタマイズすることもできます。サンプル ウェブアプリが使用するパスであるため、/Books リクエストパスを指定します。

  3. VM インスタンスと同じリージョンにあるターゲット プールを追加します。ターゲット プールにはヘルスチェック サービスが必要です。このターゲット プールにステップ 2 で作成したヘルスチェック オブジェクトを使用します。

    gcloud compute target-pools create books-lb \
        --region $region \
        --http-health-check bookshelf-check \
        --project $project_id
    
  4. ターゲット サーバーに、IIS サーバー インスタンスを追加します。

    gcloud compute target-pools add-instances books-lb \
        --instances webserver1 \
        --instances-zone $zone_1 \
        --project $project_id
    
    gcloud compute target-pools add-instances books-lb \
        --instances webserver2 \
        --instances-zone $zone_2 \
        --project $project_id
    

    ターゲット プール内のインスタンスは同じリージョンにする必要があります。ただし、同じリージョン内の異なるゾーンにあってもかまいません。

  5. ターゲット プールを指す外部 IP アドレスとポート範囲の代わりに転送ルールを追加します。

    gcloud compute forwarding-rules create www-rule \
        --region $region \
        --ports 80 \
        --address webapp-lb-ip \
        --target-pool books-lb \
        --project $project_id
    

インスタンスへのトラフィックの送信

負荷分散サービスを構成したら、ロードバランサへのトラフィックの送信を開始できます。

  1. 構成が完全に読み込まれるように、負荷分散を設定してから 1 分以上待ちます。
  2. Cloud Shell で、ロードバランサ内のインスタンスの状態を確認します。

    gcloud compute target-pools get-health books-lb \
        --region $region \
        --project $project_id
    

    出力は次のようになります。

    ---
    healthStatus:
    - healthState: HEALTHY
    instance: https://www.googleapis.com/compute/v1/projects/sales-enablement-support/zones/us-east1-c/instances/webserver1
    ipAddress: 35.190.170.76
    kind: compute#targetPoolInstanceHealth
    ---
    healthStatus:
    - healthState: HEALTHY
    instance: https://www.googleapis.com/compute/v1/projects/sales-enablement-support/zones/us-east1-b/instances/webserver2
    ipAddress: 35.190.170.76
    
  3. ipAddress 値(ロードバランサの IP アドレス)をコピーします。

  4. ブラウザ ウィンドウで、ロードバランサの IP アドレスを入力します。

    すべてが正常に機能している場合は、デプロイした ASP.NET ウェブアプリのデフォルト ページが表示されます。

    Bookshelf アプリのデフォルトのウェブページ。

負荷分散と冗長性のテスト

これで、コンポーネントがオフラインになったときのクラスタの動作を確認できるようになりました。Active Directory、SQL Server、IIS サーバーのインスタンスを個別にシャットダウンすることで、複数レベルで負荷分散と冗長性をテストできます。

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

    [VM インスタンス] ページに移動

  2. Active Directory、SQL Server、IIS のいずれかのインスタンスを選択します。オフラインになるコンポーネントをシミュレートするために、これらのインスタンスのいずれかを選択します。

    このアーキテクチャ用に作成されたイメージのリスト。

  3. [停止] をクリックします。

  4. ブラウザ ウィンドウで、ロードバランサの IP アドレスをもう一度入力します。

    Bookshelf アプリのデフォルト ページが表示されます。これは、インフラストラクチャのコンポーネントが使用できなくなっても、アプリが実行中であることを示します。

  5. 必要に応じて、手順 2 と 3 を繰り返します。たとえば、前に SQL Server インスタンスをシャットダウンした場合は、今回は IIS インスタンスをシャットダウンします。

    各コンポーネントのいずれかのインスタンスが実行されている限り、アプリは継続して実行されます。

クリーンアップ

チュートリアルが終了したら、作成した Google Cloud リソースをクリーンアップして今後料金が発生しないようにします。プロジェクト全体を削除することも、リソースを削除することもできます。以降のセクションでは、このようなリソースを削除する方法を説明します。

プロジェクトの削除

  • In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  • In the project list, select the project that you want to delete, and then click Delete.
  • In the dialog, type the project ID, and then click Shut down to delete the project.
  • プロジェクト内のリソースを削除する

    チュートリアルの最初で、インフラストラクチャの要素をデプロイする場所を制御する変数を定義しました。このセクションでは、これらの変数を使用してクリーンアップを行います。次の変数が設定されていることを確認します。

    region=us-east1
    zone_1=${region}-b
    zone_2=${region}-c
    vpc_name=webappnet
    project_id=your-project-id
    

    your-project-id は、使用している Cloud プロジェクトの ID に置き換えます。

    1. このチュートリアルで作成した VM を削除します。

      gcloud compute instances delete ad-dc1 \
          --zone $zone_1 \
          --project $project_id \
          --quiet
      
      gcloud compute instances delete ad-dc2 \
          --zone $zone_2 \
          --project $project_id \
          --quiet
      
      gcloud compute instances delete cluster-sql1 \
          --zone $zone_1 \
          --project $project_id \
          --quiet
      
      gcloud compute instances delete cluster-sql2 \
          --zone $zone_2 \
          --project $project_id \
          --quiet
      
      gcloud compute instances delete webserver1 \
          --zone $zone_1 \
          --project $project_id \
          --quiet
      
      gcloud compute instances delete webserver2 \
          --zone $zone_2 \
          --project $project_id \
          --quiet
      
    2. このチュートリアルで作成したファイアウォール ルールとルートを削除します。

      gcloud compute firewall-rules delete \
          allow-internal-ports-private-ad \
          allow-internal-ports-private-sql \
          allow-internal-ports-public-webapp \
          allow-rdp \
        --project $project_id \
        --quiet
      
      gcloud compute firewall-rules delete \
          webserver1-tcp-80 \
          webserver1-tcp-8172 \
          webserver2-tcp-80 \
          webserver2-tcp-8172 \
        --project $project_id \
        --quiet
      
      gcloud compute routes delete \
          cluster-sql1-route \
          cluster-sql1-route-listener \
          cluster-sql2-route \
          cluster-sql2-route-listener \
        --project $project_id \
        --quiet
      
    3. VPC ネットワーク内のサブネットを削除します。

      gcloud compute networks subnets delete \
          --region $region \
          private-ad-zone-a \
          private-ad-zone-b \
          private-sql-zone-a \
          private-sql-zone-b \
          public-webapp-zone \
        --project $project_id \
        --quiet
      
    4. VPC ネットワークを削除します。

      gcloud compute networks delete $vpc_name \
          --project $project_id \
          --quiet
      
    5. 作成したロードバランサの静的 IP アドレスを削除します。

      gcloud compute addresses delete webapp-lb-ip \
          --region $region \
          --project $project_id \
          --quiet
      
    6. ロードバランサのインフラストラクチャを削除します。

      gcloud compute forwarding-rules delete www-rule \
          --region $region \
          --project $project_id \
          --quiet
      gcloud compute target-pools delete books-lb \
          --region $region \
          --project $project_id \
          --quiet
      gcloud compute http-health-checks delete bookshelf-check \
          --project $project_id \
          --quiet
      

    次のステップ