このチュートリアルは、Microsoft Active Directory、SQL Server、Internet Information Services(IIS)を使用して高可用性の Windows アーキテクチャをデプロイする方法を説明するシリーズの第 3 部です。このチュートリアルでは、同じリージョン内の異なるゾーンで稼働する 2 つの IIS ウェブサーバーを設定します。次に、ウェブサーバーを SQL Server 可用性グループとドメイン コントローラに接続します。ロードバランサの背後にウェブサーバーを設定することで、個々のサーバーへの負荷を軽減できます。いずれかのサーバーがオフラインになった場合でも、アプリの実行を継続できます。
このシリーズは次のチュートリアルで構成されています。
- フォールト トレラントな Microsoft Active Directory 環境のデプロイ
- マルチ サブネット SQL Server のデプロイ
- 負荷分散された IIS ウェブサーバーのデプロイ(このドキュメント)
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 ネットワーク内に配置する必要はありません。ワークステーションに次のものがインストールされていることを確認します。
- Visual Studio 2013 以降
- Git
- Tools for Visual Studio。このツールはリンク先のページからダウンロードできます。
共通変数の初期化
このシリーズの最初のチュートリアルで、インフラストラクチャの要素をデプロイする Google Cloud 内の場所を制御する変数を定義しました。変数が正しく設定され、前に設定した値と一致していることを確認します。
Cloud Shell を開きます。
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 アドレス範囲を提供します。このアドレス範囲を使用して、サブネットに基づくオプションのファイアウォール ポリシーを設定できます。
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
内部 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 のイメージを使用して、ウェブサーバーをプロビジョニングします。ウェブサーバーをプロビジョニングしたら、それらをターゲットとしてウェブアプリをデプロイできます。
最初のサーバーを作成する
Google Cloud Marketplace に移動します。
Google Cloud Console で、ウェブサーバーを実行する Cloud プロジェクトを選択します。このチュートリアルでは、前のチュートリアルで使用したものと同じプロジェクトを使用します。
ページで次の値を設定します。
- デプロイメント名:
webserver1
- ゾーン: zone_1
- Windows Server OS バージョン: 2016
- ブートタイプ: SSD 永続ディスク
- ディスクサイズ: 200 GB
- ネットワーク名: vpc_name
- サブネットワーク名:
public-webapp-zone
- ファイアウォール: WebDeploy トラフィックを許可する、HTTP トラフィックを許可する
zone_1 と vpc_name は、このチュートリアルで変数を初期化したときに使用した値に置き換えます。
- デプロイメント名:
[デプロイ] をクリックしてGoogle Cloud Console でデプロイの完了が表示されるまで待ちます。
サーバー インスタンスに接続する
Cloud Shell で、
webserver1
インスタンスのパスワードを作成します。gcloud compute reset-windows-password webserver1 \ --zone $zone_1 \ --project $project_id \ --quiet
リモート デスクトップ プロトコル(RDP)を使用して、新しい Windows インスタンスに接続します。前の手順で作成した認証情報を使用します。
サーバー インスタンスを構成する
webserver1
インスタンスで、管理者として PowerShell ターミナルを開きます。DNS IP アドレスとドメイン名の変数を設定します。
$DNS1 = "10.1.0.100" $DNS2 = "10.2.0.100" $DomainName = "example-gcp.com"
webapp.service
というローカル サービス アカウントを作成します。これは、後でウェブアプリを公開するときに使用します。net user webapp.service * /add
プロンプトが表示されたら、パスワードを入力します。安全なパスワードを使用してください。後で使用するので、このパスワードは安全な場所に保管してください。
アカウントを有効にして、Administrators ローカル グループに追加します。
net user webapp.service /active:yes net localgroup administrators webapp.service /add
DNS サーバーを構成します。
netsh interface ip set dns Ethernet static $DNS1 netsh interface ip add dns Ethernet $DNS2 index=2
ウェブサーバーを
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.
VM を再起動します。
Restart-Computer
これで、開いている RDP セッションが終了します。
2 つ目のサーバー インスタンスを作成して構成する
前の手順を繰り返し、2 つ目のサーバー インスタンスを作成します。
次の値を使用して、サーバーの作成手順を繰り返します。
- デプロイメント名:
webserver2
- ゾーン: zone_2
- マシンタイプ: 2 vCPU
- Windows Server OS バージョン: 2016
- ブートタイプ: SSD 永続ディスク
- ディスクサイズ: 200 GB
- ネットワーク名: vpc_name
- サブネットワーク名:
public-webapp-zone
- ファイアウォール: WebDeploy トラフィックを許可する、HTTP トラフィックを許可する
zone_2 と vpc_name は、このチュートリアルで変数を初期化したときに使用した値に置き換えます。
- デプロイメント名:
webserver2
Windows インスタンスのパスワードを作成します。gcloud compute reset-windows-password webserver2 \ --zone $zone_2\ --project $project_id \ --quiet
この手順では、RDP との接続に使用するユーザー アカウントのパスワードを設定します。ユーザー名は、Google アカウント名(
gcloud config get-value core/account
コマンドで返されるユーザー名)です。このチュートリアルの後の手順で使用するため、ユーザー名とパスワードをメモしておきます。RDP を使用してインスタンスに接続します。前の手順で作成した認証情報を使用します。
webserver2
インスタンスに接続します。最初のインスタンスで使用した手順に沿って進めます。ただし、今回は 2 つ目のサーバー インスタンスに作成したパスワードを使用します。webserver2
インスタンスを構成します。最初のインスタンスの構成で使用した手順に従います。同じパスワードを使用して、同じサービス アカウントを作成します。
ウェブアプリのクローンを作成する
次に、各 IIS サーバーを構成し、そこに ASP.NET のサンプルアプリをデプロイします。ウェブアプリには、前のチュートリアルで構成した SQL Server インスタンスに自動的に接続するための認証情報が設定されています。
Visual Studio と Git がインストールされている Windows ワークステーションにログインしていることを確認します。
Windows ワークステーションのコマンド ウィンドウで、ワークステーションにサンプル ソースコードのリポジトリのクローンを作成します。
cd c:\ git clone https://github.com/GoogleCloudPlatform/getting-started-dotnet.git cd getting-started-dotnet git checkout ad49d787eec88fb30a4b45b4146f5cb63c0519e
次のフォルダに移動します。
C:\getting-started-dotnet\aspnet\2-structured-data
Visual Studio でサンプルアプリ ソリューションを開くには、
2-structured-data.sln
ファイルをダブルクリックします。[ソリューション エクスプローラー] ペインで、
Web.config
ファイルをダブルクリックして開きます。GoogleCloudSamples:ProjectId
キーにプロジェクト ID を設定します。プロジェクト ID が
webapp-sql-ad
の場合、次のような行になります。<add key="GoogleCloudSamples:ProjectId" value="webapp-sql-ad" />
GoogleCloudSamples:BookStore
値をsqlserver
に設定します。<add key="GoogleCloudSamples:BookStore" value="sqlserver" />
ファイルの最後のほうにある
<connectionStrings>
で、name="LocalSqlServer"
属性を持つconnectionStrings
XML サブ要素を見つけます。次に、以下の操作を行います。connectionString
の値を SQL Server 可用性グループ リスナーの名前(sql-listener
)に更新します(このシリーズのチュートリアルでは、マルチサブネット SQL Server のデプロイでこのリスナーを設定しています)。Initial Catalog
をbookshelf
に変更します。Integrated Security
をTrue
に設定します。- データベースの設定時にデータベース サービス アカウントに作成したユーザー名とログイン パスワードを使用します。
Web.config
ファイルを保存して閉じます。ソリューションをビルドするには、Visual Studio のメニューで [ビルド] > [ソリューションのビルド] の順にクリックします。
ASP.NET アプリをデプロイする
このセクションでは、両方のウェブサーバーにウェブアプリをデプロイします。
ワークステーションで
2-structured-data.sln
ファイルを閉じた場合は、もう一度開きます。このファイルを次のフォルダで探し、ダブルクリックします。C:\getting-started-dotnet\aspnet\2-structured-data
Visual Studio で、[ツール] > [Google Cloud Tools] > [Google Cloud Explorer] の順にクリックします。
作業中のプロジェクトを選択し、[Google Compute Engine] を展開します。
webserver1
インスタンスを右クリックします。[Manage Windows Credentials] を選択します。
[Add credentials] をクリックします。
webapp.service
というユーザー名を入力します。[I have password for this user] を選択し、ウェブサーバーの起動時に作成したパスワードを入力します。
[Create a password for me] が選択されていないことを確認して、[保存] をクリックします。
[Windows Credentials] ウィンドウを閉じるには、[閉じる] をクリックします。
Google Cloud Explorer を閉じます。
Visual Studio で、[ツール] > [Google Cloud Tools] > [Publish 2-structured-data to Google Cloud] の順にクリックします。
[発行] ダイアログ ボックスで、[Compute Engine] をクリックします。
webserver1
VM を選択し、認証情報をwebapp.service
に設定します。サンプルアプリをビルドしてデプロイするには、[発行] をクリックします。
サンプルアプリが発行されると、デフォルトのウェブブラウザでアプリが開きます。
この手順を
webserver2
に繰り返します。
負荷分散の設定
これで、ウェブサーバーのネットワーク負荷分散を設定できるようになりました。ここでは、ロードバランサにヘルスチェックを追加します。グローバル ロードバランサは、IIS サーバー間でリクエストを自動的に分散します。また、IIS サーバーの 1 つがヘルスチェックに失敗し、オフラインになっている場合、ロードバランサは他のサーバーにトラフィックを自動的に転送します。
Cloud Shell で、ロードバランサに静的外部 IP アドレスを作成します。
gcloud compute addresses create webapp-lb-ip \ --region $region \ --project $project_id
VM インスタンスは、この IP アドレスを宛先とするパケットを受信します。
HTTP ヘルスチェック オブジェクトを追加します。
gcloud compute http-health-checks create bookshelf-check \ --project $project_id \ --request-path /Books
この例では、ヘルスチェック メカニズムのデフォルト設定を使用しますが、独自にカスタマイズすることもできます。サンプル ウェブアプリが使用するパスであるため、
/Books
リクエストパスを指定します。VM インスタンスと同じリージョンにあるターゲット プールを追加します。ターゲット プールにはヘルスチェック サービスが必要です。このターゲット プールにステップ 2 で作成したヘルスチェック オブジェクトを使用します。
gcloud compute target-pools create books-lb \ --region $region \ --http-health-check bookshelf-check \ --project $project_id
ターゲット サーバーに、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
ターゲット プール内のインスタンスは同じリージョンにする必要があります。ただし、同じリージョン内の異なるゾーンにあってもかまいません。
ターゲット プールを指す外部 IP アドレスとポート範囲の代わりに転送ルールを追加します。
gcloud compute forwarding-rules create www-rule \ --region $region \ --ports 80 \ --address webapp-lb-ip \ --target-pool books-lb \ --project $project_id
インスタンスへのトラフィックの送信
負荷分散サービスを構成したら、ロードバランサへのトラフィックの送信を開始できます。
- 構成が完全に読み込まれるように、負荷分散を設定してから 1 分以上待ちます。
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
ipAddress
値(ロードバランサの IP アドレス)をコピーします。ブラウザ ウィンドウで、ロードバランサの IP アドレスを入力します。
すべてが正常に機能している場合は、デプロイした ASP.NET ウェブアプリのデフォルト ページが表示されます。
負荷分散と冗長性のテスト
これで、コンポーネントがオフラインになったときのクラスタの動作を確認できるようになりました。Active Directory、SQL Server、IIS サーバーのインスタンスを個別にシャットダウンすることで、複数レベルで負荷分散と冗長性をテストできます。
Google Cloud コンソールで、[VM インスタンス] ページに移動します。
Active Directory、SQL Server、IIS のいずれかのインスタンスを選択します。オフラインになるコンポーネントをシミュレートするために、これらのインスタンスのいずれかを選択します。
[停止] をクリックします。
ブラウザ ウィンドウで、ロードバランサの IP アドレスをもう一度入力します。
Bookshelf アプリのデフォルト ページが表示されます。これは、インフラストラクチャのコンポーネントが使用できなくなっても、アプリが実行中であることを示します。
必要に応じて、手順 2 と 3 を繰り返します。たとえば、前に SQL Server インスタンスをシャットダウンした場合は、今回は IIS インスタンスをシャットダウンします。
各コンポーネントのいずれかのインスタンスが実行されている限り、アプリは継続して実行されます。
クリーンアップ
チュートリアルが終了したら、作成した Google Cloud リソースをクリーンアップして今後料金が発生しないようにします。プロジェクト全体を削除することも、リソースを削除することもできます。以降のセクションでは、このようなリソースを削除する方法を説明します。
プロジェクトの削除
プロジェクト内のリソースを削除する
チュートリアルの最初で、インフラストラクチャの要素をデプロイする場所を制御する変数を定義しました。このセクションでは、これらの変数を使用してクリーンアップを行います。次の変数が設定されていることを確認します。
region=us-east1 zone_1=${region}-b zone_2=${region}-c vpc_name=webappnet project_id=your-project-id
your-project-id は、使用している Cloud プロジェクトの ID に置き換えます。
このチュートリアルで作成した 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
このチュートリアルで作成したファイアウォール ルールとルートを削除します。
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
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
VPC ネットワークを削除します。
gcloud compute networks delete $vpc_name \ --project $project_id \ --quiet
作成したロードバランサの静的 IP アドレスを削除します。
gcloud compute addresses delete webapp-lb-ip \ --region $region \ --project $project_id \ --quiet
ロードバランサのインフラストラクチャを削除します。
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
次のステップ
- スケーラブルで可用性の高いワークロードを設計するためのベスト プラクティスを確認する。
- Google Cloud に関するリファレンス アーキテクチャ、図、ベスト プラクティスを確認する。Cloud Architecture Center を確認します。