演習 - Web アプリを手動でスケーリングする

完了

トラフィックの増加が予想される場合は、システムをスケール アウトする必要があります。 また、パフォーマンスの低下に対処するためにスケール アウトする場合もあります。

ホテル予約システムの例で、特別なイベント、特別なサービス、または季節的な変動により追加のトラフィックが見込まれる場合、Web アプリのインスタンス数を増やします。 需要が低下したら、システムのスケールを元に戻します。

この演習では、App Service プランを作成し、このプランを使用して Web アプリをデプロイします。 負荷がかかっている Web アプリのパフォーマンスを監視します。 次に、アプリをスケールアウトし、そのプランによってアプリのパフォーマンスが改善したことを確認します。

この演習では、Web API を実装するサンプル Web アプリを使用します。 Web API を使用すると、ホテル予約 Web サイトに対して、顧客の予約を作成して取得する HTTP POST 操作と GET 操作を公開できます。 予約は保存されません。 GET 操作は単にダミー データを取得するだけです。

この演習では、POST 操作と GET 操作を同時に発行する複数のユーザーをシミュレートするクライアント アプリも実行します。 このアプリによって、スケーリングの前後に、Web アプリのパフォーマンスのテストに使用するワークロードが提供されます。

App Service プランと Web アプリを作成する

重要

この演習を行うには、独自の Azure サブスクリプションが必要です。また、料金が発生することがあります。 Azure サブスクリプションをお持ちでない場合は、開始する前に無料アカウントを作成してください。

  1. Azure portal にサインインします。

  2. Azure portal のメニューまたは [ホーム] ページで [リソースの作成] を選択します。 [リソースの作成] ウィンドウが表示されます。

  3. 左側のメニュー ペインで、[カテゴリ] の下の [Web] を選択し、[Web アプリ] を探して選択し、[作成] を選択します。 [Web アプリの作成] ペインが表示されます。

  4. [基本] タブで、各設定に対して次の値を入力します。

    注意

    Web アプリは一意の名前にする必要があります。 <ご自分の名前やイニシャル>hotelsystem のような名前を使用することをお勧めします。 この演習では、<your-webapp-name> と書かれているところではすべて、この名前を使用します。

    設定
    プロジェクトの詳細
    サブスクリプション この演習で使用する Azure サブスクリプションを選択します
    リソース グループ [新規作成] リンクを選択し、mslearn-scale という名前の新しいリソース グループを入力します
    インスタンスの詳細
    名前 表の前の注を参照してください。 この演習で後で思い出すことができる一意の名前を入力します
    公開する コード
    ランタイム スタック .NET 6 (LTS)
    オペレーティング システム Windows
    リージョン "既定値" をそのまま使用します。
    App Service プラン
    Windows プラン "既定値" をそのまま使用します。
    料金プラン "既定値" をそのまま使用します。
  5. [確認と作成]>[作成] の順に選択します。 Web アプリが作成され、デプロイされるまで待ちます。

Web アプリをビルドしてデプロイする

  1. Azure タスク バーで、Cloud Shell アイコンを選択して Azure Cloud Shell を開き、次のコマンドを実行してホテル予約システムのソース コードをダウンロードします。

    Screenshot of Cloud Shell icon in taskbar.

    git clone https://github.com/MicrosoftDocs/mslearn-hotel-reservation-system.git
    
  2. mslearn-hotel-reservation-system/src フォルダーに移動します。

    cd mslearn-hotel-reservation-system/src
    
  3. ホテル システム用のアプリをビルドします。 システム用の Web API を実装する Web アプリと、Web アプリのロード テストに使用するクライアント アプリの 2 つのアプリがあります。

    dotnet build
    
  4. HotelReservationSystem Web アプリの発行を準備します。

    cd HotelReservationSystem
    dotnet publish -o website
    
  5. 公開されたファイルが格納されている website フォルダーに移動します。 ファイルを zip 圧縮し、前のタスクで作成した Web アプリにデプロイします。 次のコードをメモ帳にコピーし、<your-webapp-name> を Web アプリの名前に置き換えた後、編集したコード ブロックを Cloud Shell に貼り付けて実行します。

    cd website
    zip website.zip *
    az webapp deployment source config-zip --src website.zip --name <your-webapp-name> --resource-group mslearn-scale
    
  6. Web ブラウザーを使用して、http://<your-webapp-name>.azurewebsites.net/api/reservations/1 に移動します。 予約番号 1 の詳細を含む、JSON ドキュメントが表示されます。

    Screenshot of the running web app, showing the details for reservation number 1 in JSON format.

スケール アウトの前に Web アプリのパフォーマンスを監視する

  1. Cloud Shell に戻り、~/mslearn-hotel-reservation-system/src/HotelReservationSystemTestClient フォルダーに移動します。

    cd ~/mslearn-hotel-reservation-system/src/HotelReservationSystemTestClient
    
  2. コード エディターを使用して、このフォルダーの App.config ファイルを編集します。

    code App.config
    
  3. ReservationsServiceURI が指定されている行をコメント解除し、YOUR WEBSITE NAME 値を Web アプリの名前に置き換えます。 ファイルは、この例のようになります。

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
        <appSettings>
            <add key="NumClients" value="100" />
            <add key="ReservationsServiceURI" value="https://<your-webapp-name>.azurewebsites.net/" />
            <add key="ReservationsServiceCollection" value="api/reservations" />
        </appSettings>
    </configuration>
    

    注意

    このファイルの NumClients 設定には、同時に Web アプリに接続して処理の実行を試みることができるクライアントの数を指定します。 この作業は、予約の作成と、その後、予約の詳細をフェッチするクエリの実行で構成されます。 使用されるすべてのデータはフェイクです。 それはどこにも保存されません。 この値は 100 に設定したままにします。

  4. Ctrl+S キーを押して、ファイルを保存します。

  5. コード エディターを使用して、このフォルダー内にある HotelReservationSystemTestClient.csproj ファイルを編集します。

    code HotelReservationSystemTestClient.csproj
    
  6. Web アプリで選択したランタイム スタックに一致するように、TargetFramework を指定する行を編集します。 TargetFramework の値を netcoreapp7.0 に変更します。 ファイルは、この例のようになります。

    <Project Sdk="Microsoft.NET.Sdk">
    
      <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFramework>netcoreapp7.0</TargetFramework>
      </PropertyGroup>
    
      <ItemGroup>
        <PackageReference Include="Newtonsoft.Json" Version="12.0.1" />
        <PackageReference Include="System.Configuration.ConfigurationManager" Version="4.5.0" />
      </ItemGroup>
    
      <ItemGroup>
        <ProjectReference Include="..\HotelReservationSystemTypes\HotelReservationSystemTypes.csproj" />
      </ItemGroup>
    
    </Project>
    
  7. Ctrl+S キーを押してファイルを保存し、Ctrl+Q キーを押してコード エディターを閉じます。

  8. 新しい構成でテスト クライアント アプリをリビルドします。

    dotnet build
    
  9. クライアント アプリを実行します。 クライアントの実行が開始され、予約が行われて、クエリが実行されると、複数のメッセージが表示されます。 システムを数分間実行したままにします。 応答が遅くなり、間もなくクライアント要求は HTTP 408 (タイムアウト) エラーで失敗し始めます。

    dotnet run
    

    Screenshot of a running client app, showing the responses and error messages that occur.

  10. Azure portal で [リソースに移動] を選択して Web アプリを開きます。

  11. 左側のメニュー ペインで、[監視] を選択し、[メトリック] を選択します。

  12. Web アプリ ペインのメニュー バーの右側で、[ローカル時刻: 過去 24 時間 (自動)] 時間範囲を選択し、[過去 30 分間] を選択してから、[適用] を選択します。

  13. ペインの [グラフのタイトル] で、次のメトリックをグラフに追加します。

    • [メトリックの追加] を選択し、[メトリック] ドロップダウン リストで [CPU 時間] を選択します。 [集計][合計] を選択します。
    • [メトリックの追加] を選択し、[メトリック] ドロップダウン リストで [HTTP サーバー エラー] を選択します。 [集計][合計] を選択します。
    • [メトリックの追加] を選択し、[メトリック] ドロップダウン リストで [Http 4xx] を選択します。 [集計][合計] を選択します。
    • [メトリックの追加] を選択し、[メトリック] ドロップダウン リストで [応答時間] を選択します。 [集計][平均] を選択します。
  14. 右側のメニュー バーで、[ダッシュボードにピン留め] を選択します。 [ダッシュ ボードに固定] ペインが表示されるので、[新規作成] タブを選択します。

  15. [ダッシュボード名] ドロップダウン リストに Web アプリ名を入力し、[Create and pin](作成してピン留めする) を選択します。

  16. システムを 5 分間実行して安定するまで待ってから、CPU 時間、HTTP 4xx エラーの数、および平均応答時間を書き留めます。 多数の HTTP 4xx エラーが表示されます。 これらのエラーは HTTP 408 タイムアウト エラーです。 平均応答時間は数秒です。 負荷に対する Web サーバーの対処方法によっては、HTTP サーバー エラーが発生することがあります。

    Screenshot showing the performance metrics for the web app before scaling out.

  17. 次のタスクの実行中、クライアント アプリを実行したままにします。

Web アプリをスケール アウトし、パフォーマンスの向上を確認する

  1. Azure portal で、Web アプリ名 (App Service) を選択し、左側のメニュー ペインの [設定][スケールアウト (App Service プラン)] を選択します。 [スケールアウト (App Service プラン)] ペインが表示されます。

  2. [構成] タブで、[自動スケーリング] を選択し、[インスタンス数][5] に設定します。 [保存] を選択します。

    Screenshot of the Configure page for the App Service plan, scaling out to five instances.

  3. クライアント アプリが実行されている Cloud Shell に切り替えます。 一部の要求は依然としてタイムアウトしますが、エラーで失敗する要求は少なくなるはずです。

  4. さらに 5 分間アプリを実行します。 次に、Azure portal のダッシュボードでアプリのメトリックを示すグラフに移動します。 使用可能な CPU パワーが 5 倍になったため、CPU 時間が大幅に増加していることがわかります。 平均応答時間が短縮され、HTTP 4xx エラーの数も減少します。 次のグラフでは、標準的な結果のセットを示します。 スケール アウトが発生した時点が示されています。

    Screenshot showing the performance metrics for the web app after scaling out to five instances.

  5. もう少し実験したい場合は、App Service プランのインスタンス数を 10 に増やしてみてください。 S1 レベルでサポートされているインスタンスの最大数は 10 です。 CPU 時間がさらに増大し、それに応じて、応答時間と HTTP 4xx エラー数が減少するはずです。

  6. クライアント アプリが実行されている Cloud Shell に戻ります。 Enter キーを押してアプリを停止します。

  7. Azure portal で、[インスタンス数] の設定を [1] に戻します。 Web アプリを選択し、左側のメニュー ペインから [スケールアウト (App Service プラン)] を選択します。 [構成] タブで、インスタンス数を 1 に設定し、[保存] を選択します。