こんにちは、マイクロソフト Azure サポートにてインターンシップをしているニューヨーク大学在籍の福川です。
インターンシップ プロジェクトの中で先ほどのポストに加えて、Azure の災害対策について研究をしてみました。
Azureは非常に信頼性が高いですが、Webサイト、Webアプリケーション、およびデータの可用性を予期できないイベントで危険にさらす可能性があります。もし地震等で、使っていたデータセンターがオフラインになったらどうしますか?休日に急に今までにない大量のユーザートラッフィクがアプリをアクセスして運用が停止してしまったらどうしますか?このようなイベントへの準備をしておくことはとても重要です。
Azureではこの様な時にアプリの運用を守るTraffic Managerや、データを保管するGeo-replicationツール 等を提供しています。この二つのサービスの機能性を確かめる為に簡単なアプリを作って色々と実験してみました。
この記事ではAzureのWeb Appサービスを使っての簡単なウェブアプリの作り方と、Azure のtraffic managerとgeoreplicationサービスを使ってのディザスターリカバリーの概略を述べます。
まず、アプリの構造から説明します。例として使う アプリはユーザーの選んだ科目に関連する情報をAzureのSQLデータベースから引っ張り出し、表示します。このデータベースは東日本のデータセンターに置きました。そしてこのデータセンターに異常があった時の為にgeo-replicationサービスを使って西日本のデータセンターにも私のデータベースをバックアップしました。もし東日本のデータセンターから私のデータベースがアクセスできなくなっても、西日本にデータが保存されているので心配ないです。この機能を確認するためにAzure portalで東日本のデータベースをフェールオーバー機能で西日本のデータベースとスウィッチしてみました。ブラウザーで確認すると、フェールオーバー完了後、アプリが異常なくデータをアクセスすることに成功しました。この様なチェックで、geo-replicationの機能の成功が観れました。もし使っていたデータベースにアクセスできなくなってしまっても、geo-replicateされたデータベースでバックアップが取れているのでデータ紛失の心配はないですね。しかし、このバックアップは常にされていないのでRPOによりディザスター何分か前までのデータが紛失する可能性があります。
次はもしウェブアプリ・ウェブサイトのが何かしらの理由で使えなくなってしまったら、というシナリオをみてみました。これにはtraffic managerを使います。このドキュメントを参考にしました 。ドキュメントによると、一つのエンドポイントが使えなくなった時点から健康なエンドポイントへtraffic managerがスウィッチするまではtraffic managerの DNS time-to-live足す2分かかるようです。
Traffic managerの機能を確かめるためにまずウェブアプリの同一コピーを違う場所のデータセンターに作りました。そして、両コピーをエンドポイントとしてポータル上でtraffic manager繋げました。このセットアップが終わった後に、一つのエンドポイントを無効にしてみました。¬¬エンドポイントを無効にするというのはtraffic managerにそのエンドポイントが使えなくなったと伝えることです。この状態でTraffic managerがどう反応するかブラウザーとパワーシェルで確認しました。エンドポイントのスウィッチ完了後、ブラウザーは通常通りアプリにアクセスが出来、パワーシェルでアプリのIPアドレスを確認すると健康な方のエンドポイントのIPアドレスに変わってました。
ディザスターリカバリーの設定と確認ができました。
Azure Appサービスを使ってウェブアプリを作成
- Azureポータルにログインし、 [新規]→[Web App]→をクリックします。
パフォーマンスと操作のしやすさをを意識しリソースグループを私と仮想ユーザーがいるエリア、東日本で作成します。 - アプリをローカルで開発します。
私はsublime text editorでHTML, CSS, PHPを書きました。 - コードをAzureにアップロードします。
まず簡単なindexとウェブサイトの骸骨を載せます。
FTP/デプロイユーザー名はポータルでApp Servicesの [概要]にあります。 パスワードはazureアカウントパスワードと同じです。
私はFTPを使うfetchというトランスファークライアントを使いました。
この時点からアップロードした内容がブラウザーで見れるようになります。 - アプリが使うSQLデータベースを作成します。
Web App + SQLのサービスもありますが、Web AppとSQLデータベースを別々に作った場合の説明をします。
SQLデータベースの作成
- Azureポータルで[新規]→ [SQL データベース] をクリックします。
データベースの名前を入れます。これはテーブル名とは異なります。リソースグループとサーバーも選びます。この時点で入れるデータを用意してない場合は空のデータベースを選択。 - サーバーファイアウォールを設定します。
使うコンピューターのIPアドレスからサーバーにアクセスするためにそのコンピューターから[概要]にある[クライアントIPの追加]をクリックしてセーブします。例えば、私は二つのコンピューターを使ってSQLをアクセスしていたので、両方のコンピューターからファイアウォールを設定しました。
- Microsoft SQL Server Management Studioを使います。
SQLデータベースにデータを入れたりテーブルを編集するのにはMicrosoft SQL Server Management Studioが使い易いです(windowsでしか使えません)。アプリをインストールする必要が有ります。
このチュートリアルを参考にしてインストールします。 - Import and Export Wizardを使ってデータをインポートします。
Microsoft SQL Server Management Studioの右側にある Object Explorerを右クリック→ tasks -> Import Data…をクリックします。私のデータは Microsoft Excel形式だったので、 Microsoft Excelを選択しました。 Browseボタンで ファイルを探し、Nextをクリックします。
- DestinationはSQL Server Native Clientを選択し、Nextをクリックします。
- Authenticationは Use SQL Server Authenticationを選択し、自分のユーザー名とパスワードを入力し、 Nextをクリックします。
- Copy data from one or more tables or viewsを選択し、 Nextをクリックします。
- インポートしたいテーブルを選択します。
私は何個かExcelのファイルに入ってたので、インポートしたいテーブルだけを選択しました。 - インポート後はSQLコマンドで直せますが、Edit Mappingsをクリックするとインポートする前からテーブルの形式や欄名が治せます。Previewをで今の時点のテーブルが確認できます。
終わったらFinishをクリックします。
Web appからSQL database に接続
データベースの接続文字列をコピーします。
AzureポータルのSQLデータベースの概要タブからデータベース接続文字列の表示をクリックします。
私のサーバー側のコードはPHPで書きましたので PHP のSQL認証をコピーして コードに入れました。
私のウェブアプリはフォーム形式だったので、ユーザーが[Submit]を押した時にPHPのスクリプトが呼ばれるようになっています。
コードを書き終えたら(3)でやったようにazureへアップロード。ブラウザーでコードとSQLの接続を確認しながらデバッグします。
ディザスターリカバリーの準備:SQLデータベースのGeoレプリケーション
- データベースのgeoレプリケーションを設定します。
一番簡単な方法はazureポータルからの設定です。
ポータルからSQL データベースの [geoレプリケーション]を開きます。
- バックアップのデータベースの場所を選択します。
ターゲットサーバーを選びまたは作り、必要な欄を入力します。終わったらOKをクリックします。 - Geoレプリケーションの確認をします
[Geoレプリケーション] から、第2データベースの左にある “…” をクリックし フェールオーバーを選択します。
フェールオーバーは第1SQLデータベースが使えなくなったとazureへの指示です。
データベースのスウィッチをポータルで確認後、ウェブアプリを開いてデータが問題なくアクセスできているかチェックします。
ディザスターリカバリーの準備: Traffic Managerのセットアップ
- Azureポータルで[App Service] を選択します。
- 自分のウェブアプリの同一コピーを存在しているアプリとは違う場所のサーバーで作成します。
この新しいコピーもオリジナルのアプリと同じデータベースからデータを取るように設定します。 - Azureポータルで Traffic Manager プロファイルを作成します。
- 今作ったTraffic Manager プロファイルを選択し、[エンドポイント]を開き、[追加]をクリックします。
まず第1アプリをエンドポイントに追加 したいので、 ターゲットリソースの種類をApp Serviceにして、ターゲットリソースからアプリを選択します。
- アプリのコピーも同じく第2エンドポイントとして追加します。
- 両方ともアクセス出来るかの確認は、エンドポイントを1つずつ交互に無効にしながら確認をします。
まず、第1エンドポイント をクリックします。 - [Edit]を選択します。
- 状態を無効に変えてSaveをクリックします。
- このチュートリアルを参考にしながらパワーシェルでipconfig /flushdns、nslookup でIPアドレスを確認
- もう一つのエンドポイントも同じく確認します。
両方とも確認できたら、もしどちらかのアプリがアクセス出来なくなった場合、Traffic Managerがもう一つのコピーの方にユーザーを送るということが成立できました。