「高可用性構成で Azure Stack Hub の App Service をデプロイ」した後の作業補足

## はじめに

[高可用性構成で Azure Stack Hub の App Service をデプロイする](https://docs.microsoft.com/ja-jp/azure-stack/operator/app-service-deploy-ha) の「デプロイ後の手順」を補足します。
リソースプロバイダのインストール手順については [公式ドキュメント](https://docs.microsoft.com/ja-jp/azure-stack/operator/azure-stack-app-service-deploy) を参照ください。


## 環境

- Azure Stack Hub 1907
- App Service 1.7

※バージョンによって必要な作業が異なる可能性が高いので、注意してください。

（2021/02/24追記）
App Service 2020.Q2 では [ログインユーザーの追加](#ログインユーザーの追加) の作業は不要でした。


## デプロイ後の手順

### SQL Server でデータベースを可用性グループに追加する

SQL Server のプライマリサーバーに、以下の二つのデータベースが作られているので、これを可用性グループに追加します。

- appservice_hosting
- appservice_metering

aps-sql-0, aps-sql-1 のどちらがプライマリになっているかは状況により異なるはずなので、実際に接続して確認してください。

オペレーションはプライマリサーバーで行います。

まず、この二つのデータベースのバックアップを取得します（可用性グループにデータベースを追加する際には必須の作業です）。
SQL Server Management Studio からは、対象のデータベースを右クリック > Tasks > Backup で実行できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64309/868b1b0a-9dd9-38ff-b9dd-024dfafa45a9.png)


データベースを可用性グループに追加します。
alwayson-ag 以下の Availability Databases を右クリックし、Add Databases を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64309/ccea5f7f-923a-80f7-0e41-cddbcceb47f0.png)

「Select Databases」で appservice_hosting, appservice_metering の両方を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64309/350915e9-a5fe-e52e-8aac-3f739e4c2b5d.png)



可用性データベースに登録され、セカンダリサーバーでもこの二つのデータベースが作成された事が確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64309/66ea625c-afc8-4ad2-a08b-b0af6861ee19.png)



### ログインユーザーの追加


**（2021/02/24追記）
App Service 2020.Q2 では、この作業は不要です。以下の記述は App Service 1.7 でのものになります。
また、1.8 或いは 2020.Q1 の時点で不要となっている可能性があります。**




レプリカ間でログインを同期させます。
下記サイトのスクリプトを、プライマリ, セカンダリの両方のサーバーで実行します。
https://blog.sqlauthority.com/2017/11/30/sql-server-alwayson-availability-groups-script-sync-logins-replicas/

プライマリで15件, セカンダリでは6件の結果（ログイン作成クエリ）が返されるはずです。
プライマリから差分の9件(appservice_hosting_\*, appservice_metering_\*)の結果をコピーし、セカンダリで実行します。

プライマリの実行結果。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64309/b6789667-1d97-a4b0-4362-a9afb2409f50.png)

セカンダリの実行結果。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64309/bf30e6b5-e649-86a7-47c8-e39dd87564af.png)

以上で、SQL Server が高可用性構成になります。

公式ドキュメントには「インポートすることもできます」と書かれていますが、これをやらないとファイルオーバーされません。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64309/41f42804-197d-d90a-fcaa-e461d04f5cad.png" width="480">



### Worker サブネットからの SMB アクセスを有効化する

ドキュメントに記載の通り、WorkerNsg の Outbound に以下を追加します。
初期状態では CN-0/1 上の Web Cloud Management Console で Worker Role にエラーが発生している事が確認できますが、この設定によって解消されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64309/58ad1a8a-29c0-f9ed-d57c-3c158f1e73bd.png)


### Worker Role のインスタンスを追加する

デプロイ直後は Shared Worker Role のみ存在しています。
Small/Medium/Large の各 Worker Role は、その実体である VMSS からインスタンスを追加します。
Worker Role のインスタンス追加にはかなりの時間を要します（1時間くらい）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64309/c456a335-e11c-f7b6-022c-ccb97dd1cbec.png)


## おまけ

### Plan に App Service を追加する

テナントユーザーが App Service を利用する為に、Plan にサービスを割り当てます。
特に既存ユーザー向けのサブスクリプションで忘れがちなので注意しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64309/48f0468b-f12f-81aa-dde8-3824fc1b27bf.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64309/b48dfb29-3983-46ce-da28-ecd4aaa35d7d.png)


割り当てられていない場合、リソース名のバリデーションでエラーになったり、App Service Plan が作成できなかったりします（わかりにくい）。
![2020-08-11_12h11_36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64309/742384f0-76ac-378b-7684-f0755b2bd9f3.png)
![2020-08-11_12h12_20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64309/18d467ba-5914-6fc1-7984-499bbe05568e.png)


## おわりに

App Service インストール後の作業について補足しました。
SQL Server Always On や IaaS (特に App Service の IaaS レイヤ)を熟知している人にとっては当たり前かも知れませんが、そうでなければ大ハマりする（実際した）部分かと思います。

インストーラー自体の改善で徐々に良くなって行くのでしょうが。


## 参考

- [Docs - Azure Stack Hub に App Service をデプロイする](https://docs.microsoft.com/ja-jp/azure-stack/operator/azure-stack-app-service-deploy)