目次
はじめに/
オートスケーリングとは、サーバー負荷に応じて自動的にクラウドサーバーの台数を増減させる機能を指します。
システムやサービスに負荷が集中したときにはサーバーを自動で増やし、アクセスが少ないときはサーバーを減らすことで、常に必要最小限のサーバー数でシステムを安定的に稼働させることを実現します。 ここでは、AWSのオートスケーリング機能をArcGIS Serverにて試してみたいと思います。
前提条件としましては、
「ArcGIS Server は互いに通信しないこと」
「非同期ジオプロセシングや分散マップ キャッシングなどの操作に使用することはできない」
などがあげられます。
利用したArcGIS Server のバージョンは11.1になります。また、OSはWindows Server 2019 を利用しました。
オートスケーリングを利用するにあたりライセンスの注意点としましては、スケールアウト時の最大の物理コア数がライセンスとして必要になります。例えば、AWSのt3.xlargeでは物理コア数が2なので、8コア分のライセンスを保持していれば、t3.xlargeを最大4つスケールアウトさせられます。
オートスケーリングを利用する流れは以下の通りです。
- ArcGIS Server のセットアップ
- ArcGIS Web Adapter の設定
- ロードバランサーの設定
- セットアップしたEC2インスタンスからAMIを作成
- オートスケーリングの起動テンプレート設定
- オートスケーリンググループの作成
ArcGIS Server のセットアップ
ヘルプページに従い、EC2インスタンスにセットアップしてみてください。 ここでは1台のコンピューターに配置する手順を前提とします。
オートスケーリングの設定に焦点を当てたいため、詳細のセットアップ手順は省略しますが、注意点を記載したいと思います。
- Windows Server のサポートバージョンは、2016、2019、2022 になります。
- 最小のメモリは8GBです。公開したい地図のサービスが多い場合はより多くのメモリ数が必要となります。
- OSのファイアウォールやAWSのセキュリティグループにてArcGIS Server の利用ポート「6443」の通信許可設定をしておく必要があります。
- ArcGIS Server のインストール後にサイトの作成を実行します。
ArcGIS Web Adapter の設定
オートスケーリングで作成されたEC2インスタンスは標準では443ポートへ転送されるため、ArcGIS Web Adapter の設定をしておきます。
ArcGIS Web Adapter はIIS上で動作します。 最初にWindows Server にてIISを有効化します。
ここでは自己証明書をPowershell にて生成して、IISマネージャーの管理画面にてHTTPSにバインド設定してます。
SubjectとDnsName は、個別の環境にあわせて設定しなおしてください。 New-SelfSignedCertificate -Subject “autotest.esrij.com” -DnsName “autotest.esrij.com” -CertStoreLocation “cert:\LocalMachine\My” -KeyAlgorithm RSA -KeyLength 2048 -KeyExportPolicy Exportable -NotAfter (Get-Date).AddYears(10)
Default Web Site を選択し、右側の操作パネルのバインドを選択します。 種類でhttpsを選択し、SSL証明書は生成した証明書を選択します。
また、バージョン11.1からArcGIS Web Adapter を利用するには以下のコンポーネントが必要になります。
( https://enterprise.arcgis.com/ja/system-requirements/latest/windows/arcgis-web-adaptor-system-requirements.htm )
IISの有効化後に以下のコンポーネントをインストールしてください。
- Microsoft Web Deploy 3.6
- ASP.NET Core ランタイム – Windows ホスティング バンドル 6.x
ArcGIS Web Adapter のインストールはウィザードに従って実行してください。
ロードバランサーの設定
AWSにてターゲットグループを作成して、ロードバランサーを作成していきます。
詳細は、「AWS のロードバランサーを利用して ArcGIS Server を活用する」のブログを参照ください。
注意点としましては、上記のブログでは、ターゲットグループ作成時のProtocolで、「HTTPS:6443」にしてますが、ここでは、IIS経由で通信させたいため、「HTTPS:443」とします。 また、ロードバランサーのセキュリティグループ → ArcGIS Server インスタンスの属するセキュリティグループ への通信でHTTPS:443の許可設定をしておきます。(※ロードバランサーとEC2インスタンスのセキュリティグループを分けている場合)
作成したロードバランサーのDNS名をRoute53にてCNAMEで登録すれば、アクセスしたい名前で登録できます。
また、検証したいマシンのhostファイルを編集して、ロードバランサーのグローバルIPアドレスを取得して、一時的に定義してもよいかと思います。(※アプリケーションロードバランサーのIPはAWS側で管理され、時間が経つと変更されます。)
その場合は、nslookup [ロードバランサーのDNS名] とコマンドを発行してみてください。 グローバルのIPアドレスが取得できます。
マップサービスの公開
AWSのEC2にセットアップしたArcGIS Server にマップサービスを公開します。
挿入>接続>サーバー>新しいArcGIS Server にて、ArcGIS Server に接続します。
マップサービスを公開するには、ArcGIS Server を右クリックし、公開>マップサービス を選択します。
公開したいマップを選択します。
「すべてのデータをコピー」を選択して公開を実行します。
セットアップしたEC2インスタンスからAMIを作成
EC2インスタンスを右クリックして、イメージとテンプレート>イメージを作成 を選択します。
イメージ名を入力して、イメージ作成を実行します。
オートスケーリングの起動テンプレート作成
起動テンプレート名を入力します。
さきほど作成したイメージを自己所有から選択します。
インスタンスタイプは検証用にt3.largeを選択しています。利用用途に応じて適切なタイプを選択してください。
ネットワーク設定にて、起動したいサブネットとセキュリティグループを設定します。 そのほかの項目はデフォルトにしています。
オートスケーリンググループの作成
Auto Scaling グループ名を入力し、さきほど作成した起動テンプレートを選択します。
起動したいネットワークのVPCとアベイラビリティゾーン・サブネットを選択します。 アベイラビリティゾーン・サブネットは複数選択できます。
作成していたロードバランサーとターゲットグループを選択します。
グループサイズを設定します。ここでは、最大3つのインスタンスをスケールアウトできるようにします。 また、スケーリングポリシーで平均CPU使用率が50%を超えたら、スケールアウトさせるように設定します。
そのほかの項目はデフォルトで次へを選択し、最後に「Auto Scaling グループを作成する」を実行します。
オートスケーリングの確認
分かりやすいように最初に作成したEC2インスタンスは起動停止しておきます。(unused で認識されます。) Auto Scaling グループ作成で設定したインスタンスが自動起動で立ち上がり、healthy で認識されています。
ただしく設定されていれば、https://[ArcGIS Server のDNS名]/arcgis/rest/ のURLにて、REST Services Direcgtory が表示されます。 (※ArcGIS Web Adapter は /arcgis で設定した場合)
マップサービスより地図画像を取得するAPIのリクエストをキャプチャして、構築したオートスケーリングの環境に負荷をかけてみようと思います。
https://[ArcGIS Server のDNS名]/arcgis/rest/services//%E5%B8%82%E5%8C%BA%E7%94%BA%E6%9D%91/MapServer?f=jsapi にて、地図画像を表示できます。
ブラウザとJMeterで地図画像表示のリクエストをキャプチャし、BlazeMeterで負荷をかけます。
JMeter を日本語環境にするには、apache-jmeter-x.x.x\bin\jmeter.bat にて、
rem set JMETER_LANGUAGE=-Duser.language=”en” -Duser.region=”EN”
set JMETER_LANGUAGE=-Duser.language=”ja” -Duser.region=”JP”
の言語設定を行います。
テスト計画を右クリックし、追加>Threads(Users)>スレッドグループ にて、スレッドグループを追加します。
スレッドグループを右クリックし、追加>ロジックコントローラ>記録コントローラ にて、記録コントローラを追加します。
また、スレッドグループを右クリックし、追加>タイマ>定数タイマ にて、定数タイマを追加します。
テスト計画を右クリックし、追加>Non-Testエレメント>HTTP プロキシサーバにて、HTTPプロキシサーバを追加します。
対象となるコントローラは、「テスト計画>スレッドグループ>記録コントローラ」を選択します。
Global Settings のポートにて待ち受けポートを決定します。(デフォルトの待ち受けポートは8888です。) キャプチャするリクエストのフィルタリングをかけたい場合、Request Filtering にて、挿入するパターン・除外パターンなどを定義できます。
FireFoxにてJMeterのHTTPプロキシ経由で、ArcGIS Server のマップサービスにアクセスしてみます。
FireFoxの設定>ネットワーク設定>接続設定 にて、
「手動でプロキシーを設定する」を選択し、HTTPプロキシサーバにて127.0.0.1を指定し、ポートは8888にします。 また、このプロキシーをHTTPSで使用する、にチェックを付けます。
JMeter の HTTPプロキシの開始をクリックすると、HTTPプロキシサーバが起動します。
ブラウザにて地図画像を表示させて、縮尺を変えたり、地図を移動させたりしてリクエストをキャプチャします。
JMeterで作成した計画を保存すると「テスト計画.jmx」という名前で保存されます。
オートスケーリングの確認2(BlazeMeterによる負荷検証)
ArcGIS Pro のパッケージマネージャーにて、python 環境をクローンします。
詳細はClone an environmentヘルプページを参照ください。
コマンドプロンプトを開いて以下のコマンドを発行します。
Admin の部分は個別のログインユーザー名で異なるので、適時変更してください。
Set PATH=C:\Users\Admin\AppData\Local\ESRI\conda\envs\arcgispro-py3-clone\Scripts;%PATH%
Set PATH=C:\Users\Admin\AppData\Local\ESRI\conda\envs\arcgispro-py3-clone;%PATH%
BlazeMeter をインストールします。
python -m pip install –upgrade pip setuptools wheel
python -m pip install bzt
以下のYAMLファイルを作成します。test.yaml で保存します。
execution:
concurrency: 40 #number of target concurrent virtual users
hold-for: 10m30s # time to hold target concurrency
iterations: 200 #シナリオの反復回数を制限する.limit scenario iterations number
ramp-up: 1m #ramp-up time to reach target concurrency
scenario: Thread Group
scenarios:
Thread Group:
script: firefox.jmx
reporting:
- module: console # 実行中の情報を表示
- module: final-stats # サマリを表示
- module: blazemeter # オンラインレポートを作成
settings:
check-interval: 5s
default-executor: jmeter
さきほど作成した「テスト計画.jmx」をfirefox.jmx に変更してBlazeMeterを実行してみます。
bzt test.yaml 同時実行ユーザーが増えていき、MAX40ユーザーでさきほど作成したシナリオにて負荷がかかります。
オートスケーリンググループの設定で指定した最大キャパシティ3個分のインスタンスが自動起動され、 healthy と認識されたことが分かります。
ArcGIS Serverが1つのサーバーとして振る舞い、非同期処理などがない条件であればオートスケーリングの利用が可能になります。
GIS活用の中でのDX推進のヒントにしてみてください。