Azure Stack Development Kit をインストールしてみた

# TL;DR
Azure Stack Hub の機能限定、開発者向けバージョンであるところの ASDK をご自宅で使えるようにするためのあれこれ。

# はじめに
Azure はマイクロソフトの提供するパブリッククラウドサービスです。機密情報保護などの観点でパブリッククラウドが使用できないが、Azure の機能をどうにかマイクロソフトの運用するデータセンターではなく、オンプレミスで使用できないか、という希望を叶えるのが、Azure Stack シリーズの製品群になります。

2021年12月時点では 3 つの製品があり、ざっくりですが、以下のような製品があります。

- 主に仮想マシン環境の管理を対象とした ***Azure Stack HCI***
- Azure と同じように IaaS, PaaS サービスを使用できるようにした ***Azure Stack Hub***
- 収集されたデータをクラウド/データセンターへ送る前の前処理等で使用できる ***Azure Stack Edge***

Azure Stack の違いや詳細なドキュメントに関しては以下のドキュメントをご確認ください。

- 製品: Azure Stack<br/>
https://azure.microsoft.com/ja-jp/overview/azure-stack/#overview
- グローバル Azure、Azure Stack Hub、および Azure Stack HCI の違い<br/>
https://docs.microsoft.com/ja-jp/azure-stack/operator/compare-azure-azure-stack?view=azs-2102


そういうソフトウェアがあるなら、是非ともご自宅にデプロイしたくなるところですが、このいずれも、ハードウェアとのセットでのみ提供されており、ソフトウェアだけでは入手できません。またハードウェアも 4 ノードなど、クラスター構成が前提となり、個人宅に設置するのはかなり無理がでてきます (買えたとしても、年収を全額投資になるので、宝くじを当てるなどの準備が必要)。

# Azure Stack Development Kit (ASDK) とは
前述の通り、Azure Stack は Azure データセンターの一区画を模した仕組みである都合上、高性能な複数サーバーでのクラスターを準備する必要があります。一方で、開発者向けの SQL Server Developer Edition が存在するように、開発者向けの機能限定版 Azure Stack Hub も公開されており、それが Azure Stack Development Kit (ASDK) になります。

ASDK では、Azure Stack Hub と異なり、シングルノードでの構成となるため、それによる制約 (Event Hubs、メトリックが使用できないなど) も多々出てきますが、Azure Stack Hub とほぼ同じ機能を試すことが可能になります。

詳細は、Azure Stack Development Kit のドキュメントをご確認ください。

- Azure Stack 開発キット (ASDK) とは<br/>
https://docs.microsoft.com/ja-jp/azure-stack/asdk/asdk-what-is?view=azs-2102

# インストール要件について
ASDK は、~~一般のご家庭~~ 逸般の誤家庭にあるマシンにインストールすることが可能です。[ASDK の要件と考慮事項](https://docs.microsoft.com/ja-jp/azure-stack/asdk/asdk-deploy-considerations?view=azs-2102) より引用 (2021年12月5日)。

|コンポーネント |最小値 |推奨 |
|--------------|------------|-----------|
|ディスク ドライブ: オペレーティング システム | システム パーティション用に最低 200 GB の空きがある、1 つのオペレーティング システム ディスク (SSD または HDD)。 | システム パーティション用に最低 200 GB の空きがある 1 OS ディスク (SSD または HDD)。|
|ディスク ドライブ: 開発キット データ全般* | ***4 つのディスク。 各ディスクに最低 240 GB の空き容量が必要 (SSD または HDD)***。 すべての使用可能なディスクが使われます。 | 4 つのディスク。 各ディスクに最低 400 GB の空き容量が必要 (SSD または HDD)。 すべての使用可能なディスクが使われます。|
|コンピューティング: CPU | ***デュアル ソケット: 16 個の物理コア (合計)。*** | デュアル ソケット: 20 個の物理コア (合計)。|
|コンピューティング: メモリ | ***192 GB の RAM。*** | 256 GB の RAM。|
|コンピューティング: BIOS | Hyper-V 対応 (SLAT サポートあり)。 | Hyper-V 対応 (SLAT サポートあり)。|
|[ネットワーク]\: NIC | Windows Server 2012 R2 認定。 特別な機能は必要ありません。 | Windows Server 2012 R2 認定。 特別な機能は必要ありません。|
|ハードウェア ロゴ認定 | Windows Server 2012 R2 認定。 | Windows Server 2016 認定。|

無い場合には、条件を満たすサーバーを購入するか、ワークステーションで代用する手もあります ([その１](https://www.oshaw53.com/blog/2021/12/03/build-hp-z840-workstation-1/)，[その２](https://www.oshaw53.com/blog/2021/12/06/build-hp-z840-workstation-2/))。

上記のハードウェア要件が一番ハードルが高いと思われますが、Azure Active Directory のテナント管理者権限なども必要になるので、[ASDK の要件と考慮事項](https://docs.microsoft.com/ja-jp/azure-stack/asdk/asdk-deploy-considerations?view=azs-2102) を確認しましょう。

検証環境は、Visual Studio Enterprise 付属のサブスクリプション (自分で管理してる *.onmicrosoft.com テナント)、Windows Server 2019 評価版を使用して構築します。


# ASDK 構築手順
以降に流れを記載しますが、構築は基本的に、公式ドキュメントをベースに行います。構築時のつまづきポイントやドキュメント記載との差違などを中心に記載するので、参考にしてください。

ASDK は製品として (IIS や SQL Server, WebSphere Application Server などのミドルウェアのように) ベース OS に導入するわけではなく、構築済の[仮想ハードディスクイメージから起動](https://docs.microsoft.com/ja-jp/windows-hardware/manufacture/desktop/boot-to-vhd--native-boot--add-a-virtual-hard-disk-to-the-boot-menu) して実行します。
そのため、既存の OS 環境は VHDX で起動するまでの踏み台でしかありません。


## ASDK のダウンロードと抽出
参考：[ASDK のダウンロードと抽出](https://docs.microsoft.com/ja-jp/azure-stack/asdk/asdk-download?view=azs-2102)

ASDK のダウンロード申込を行い、ダウンロードします。
2021年11月時点では、ASDK_1.2102.0.9 が提供されており、2 GB 二分割された 13+1 のファイルをダウンロードしました (合計 25GB程度)。
含まれていた AzureStackDevelopmentKit.exe を実行することで CloudBuilder.vhdx 60 GB という仮想ハードディスクが復元されます。
展開するのに、それなりに時間がかかります (USB 3.0 接続の USB メモリを使用したが、おおよそ 50 分程度かかった)。


## ASDK ホスト コンピューターの準備
参考：[ASDK ホスト コンピューターの準備](https://docs.microsoft.com/ja-jp/azure-stack/asdk/asdk-prepare-host?view=azs-2102)

ドキュメントに従って以下を実行します。
1. CloudBuilder.vhdx ファイルを "C:\CloudBuilder.vhdx" に配置 (USB HDD に保存してあった分割イメージを展開して移動)
2. ASDK インストーラー ファイル (asdk-installer.ps1) を入手して実行

- ASDK が起動する OS 環境での Administorator ユーザーのパスワードを設定します。このパスワードは ASDK の管理で使用する別のユーザーでも使用されるので、必ずメモを取りましょう。
- ASDK のホスト名、IP を必要に応じて設定します。

スクリプトの最後で、CloudBuilder.vhdx に設定ファイルが配置され、再起動すると VHDX からブートされた環境に変わります。


## ASDK のインストール前の準備
参考：[ASDK のインストール](https://docs.microsoft.com/ja-jp/azure-stack/asdk/asdk-install?view=azs-2102)

この時点で、ベース OS とは異なる、VHDX 内のファイルシステムから起動するので、ドライバや各種設定は初期状態に戻ります (インターフェースも英語版 Windows Server になります)。Administrator でログインする際、最初の Windows Server ではなく、ASDK 用に設定した Administrator パスワードでログインします。

必要に応じてドライバや設定を再度行いましょう。検証環境では、有線ではなく無線 LAN でネットワークに繋がっているので、その設定のやり直し (無線LAN の有効化とドライバーのインストール) を実施しています。

ドライブレターは以下のようになっていました。
- C ドライブ: ASDK の VHDX
- D ドライブ: 元々起動時に使用していた Windows Server の HDD (元C ドライブ)


### ASDK のインストール
参考：[ASDK のインストール](https://docs.microsoft.com/ja-jp/azure-stack/asdk/asdk-install?view=azs-2102#install-the-asdk)

```AzureStack_Installer\asdk-installer.ps1``` を実行します。

ID Provider and Credentials では以下のように設定しました。
- Type: Azure Cloud
- AAD Directory: (自分のテナント名).onmicrosoft.com
- Local Administorator Password: (ASDK Administorator ユーザーのパスワード)

```AAD Directory``` に関しては、Azure ポータルのサブスクリプションのディレクトリ名や Azure Active Directory のプライマリドメイン等の形で表示されています。

続いて、ネットワークの設定。
![20211019-2a.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349915/1e59545b-76e1-56a2-f6ce-9a7d862b8997.jpeg)

- Network Adopter は使用しているものを選択。
- NTP Server, DNS Forwarder (オプション) の設定。NTP のみ設定。
- NTP サーバーとして ntp.jst.mfeed.ad.jp -> IP 指定なので ntp3 の IP を指定: 210.173.160.87<br />
(特に意味は無い。ntp1 は使ってる人が多そうというだけ)。

参考：https://www.mfeed.ad.jp/ntp/detail.html

この設定が完了し、[Deploy] ボタンをクリックすると、デプロイ手続きが開始される。NTP の設定など、再開する際に使用できるパラメータが表示されるものの、残念ながらコピーは出来ない模様。
![20211019-4a.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349915/356c357e-10ec-901c-a4ee-96d6981cf8eb.jpeg)

記載されてるとおり、2-3 分経つと、Azure へのサインインページが表示されるので、ID, パスワードを入力してサインインする。
![20211019-3a.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349915/09d4424e-aee7-386b-52d0-ee8b8a2980d8.jpeg)


デプロイ進行中に何度か再起動が行われるが、進行状況を確認する際は、```AzureStackAdmin``` としてログインする (パスワードは ASDK の Administorator と同じ)。
リモートデスクトップで接続する場合は ```azurestack\AzureStackAdmin``` としてログインする。


デプロイ作業は順調にいけば、40 ~ 60 分程度で完了する。
4 つのストレージもクラスターが構成され、```SU1_Volume``` というボリューム名で [CSVFS (クラスター共有ボリューム ファイル システム)](https://docs.microsoft.com/ja-jp/windows-server/failover-clustering/failover-cluster-csvs) でフォーマットされる。
![20211019-5a.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349915/cb1c6190-1644-5408-ecdd-cac53dd60744.jpeg)


Hyper-V の使用用件を満たしていなかった (VT-x が無効になってた) 場合、以下のようなメッセージが出てきます。メッセージに書かれているとおり、UEFI から VT-x, VT-d の設定を確認しましょう。
> Virtual machine 'AzS-DC01' could not be started because the hypervisor is not running.
>  :
> 1) Verify that the processor of the physical computer has a supported version of hardware-assisted virtualization.

```powershell
Invoke-EceAction : Type 'Deployment' of Role 'Domain' raised an exception:
'AzS-DC01' failed to start.
Virtual machine 'AzS-DC01' could not be started because the hypervisor is not running.
'AzS-DC01' failed to start. (Virtual machine ID AAA3C330-73AC-4808-9DD0-789129F99D66)
Virtual machine 'AzS-DC01' could not be started because the hypervisor is not running (Virtual machine ID
AAA3C330-73AC-4808-9DD0-789129F99D66).
The following actions may help you resolve the problem:
1) Verify that the processor of the physical computer has a supported version of hardware-assisted virtualization.
2) Verify that hardware-assisted virtualization and hardware-assisted data execution protection are enabled in the
BIOS of the physical computer.  (If you edit the BIOS to enable either setting, you must turn off the power to the
physical computer and then turn it back on.  Resetting the physical computer is not sufficient.)
3) If you have made changes to the Boot Configuration Data store, review these changes to ensure that the hypervisor
is configured to launch automatically.
at New-ManagementVM, C:\Program Files\WindowsPowerShell\Modules\NewManagementVM\NewManagementVM.psm1: line 761
at DeployOneVM, C:\CloudDeployment\Classes\Common\Image\VirtualMachineRole.psm1: line 1761
at DeployVms, C:\CloudDeployment\Classes\Common\Image\VirtualMachineRole.psm1: line 1980
at Deployment, C:\CloudDeployment\Classes\Common\Image\VirtualMachineRole.psm1: line 2116
at <ScriptBlock>, <No file>: line 60
at <ScriptBlock>, <No file>: line 58
At C:\CloudDeployment\Setup\Common\DeploySingleNodeCommon.ps1:924 char:5
+     Invoke-EceAction -RolePath $masterRole -ActionType $ActionPlan @d ...
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Invoke-EceAction], InterfaceInvocationFailedException
    + FullyQualifiedErrorId : OperationFailed,Microsoft.HyperV.PowerShell.Commands.StartVM,CloudEngine.Cmdlets.InvokeC
   mdlet

Invoke-EceAction : Action: Invocation of step 0.PhysicalMachineAndInitialConfiguration.15 failed. Stopping invocation
of action plan.
At C:\CloudDeployment\Setup\Common\DeploySingleNodeCommon.ps1:924 char:5
+     Invoke-EceAction -RolePath $masterRole -ActionType $ActionPlan @d ...
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [Invoke-EceAction], ActionExecutionException
    + FullyQualifiedErrorId : Unspecified error,CloudEngine.Cmdlets.InvokeCmdlet

Invoke-EceAction : Action: Invocation of step 0.PhysicalMachineAndInitialConfiguration failed. Stopping invocation of
action plan.
At C:\CloudDeployment\Setup\Common\DeploySingleNodeCommon.ps1:924 char:5
+     Invoke-EceAction -RolePath $masterRole -ActionType $ActionPlan @d ...
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [Invoke-EceAction], ActionExecutionException
    + FullyQualifiedErrorId : Unspecified error,CloudEngine.Cmdlets.InvokeCmdlet

Invoke-EceAction : Action: Invocation of step 0 failed. Stopping invocation of action plan.
At C:\CloudDeployment\Setup\Common\DeploySingleNodeCommon.ps1:924 char:5
+     Invoke-EceAction -RolePath $masterRole -ActionType $ActionPlan @d ...
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [Invoke-EceAction], ActionExecutionException
    + FullyQualifiedErrorId : Unspecified error,CloudEngine.Cmdlets.InvokeCmdlet
```

## ASDK のデプロイ後の構成
### Azure Stack PowerShell のインストール
参考：[Azure Stack PowerShell のインストール](https://docs.microsoft.com/ja-jp/azure-stack/asdk/asdk-post-deploy?view=azs-2102&tabs=az1%2Caz2%2Caz3#install-azure-stack-powershell)

```AzureStack\AzureStackAdmin``` ユーザーでログインして、Azure Stack PowerShell をインストールする


### Azure Stack Hub 用の PowerShell Az モジュールをインストールする
参考：[Azure Stack Hub 用の PowerShell Az モジュールをインストールする](https://docs.microsoft.com/ja-jp/azure-stack/operator/powershell-install-az-module?view=azs-2102)

この手順に従って、Azure Stack PowerShell をインストールする前提を確認します。具体的には以下を満たす必要があります。
- Windows PowerShell 5.1 
- .NET Framework 4.7.2 以降
- PowerShellGet がインストールされている

```powershell
Install-Module PowerShellGet -MinimumVersion 2.2.3 -Force
```


既存のバージョンの Azure Stack Hub PowerShell モジュールをアンインストールする。

```powershell
Get-Module -Name Azure* -ListAvailable | Uninstall-Module -Force -Verbose -ErrorAction Continue
Get-Module -Name Azs.* -ListAvailable | Uninstall-Module -Force -Verbose -ErrorAction Continue
Get-Module -Name Az.* -ListAvailable | Uninstall-Module -Force -Verbose -ErrorAction Continue
```

WindowsPowerShell\Modules ($PSHOME\Modules, 既定では "C:\Windows\System32\WindowsPowerShell\v1.0\Modules") フォルダからも削除されているか確認する。モジュールを入れ替えたら、念のために PowerShell コンソールも再起動しましょう。

AzureStack スタックモジュールのインストール。```Set-PSRepository -Name "PSGallery" -InstallationPolicy Trusted``` はPSGallery からのインストールを許可するだけなので、1 回実行すれば再実行は不要。

```powershell
Set-PSRepository -Name "PSGallery" -InstallationPolicy Trusted

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12

  Install-Module -Name Az.BootStrapper -Force
  Install-AzProfile -Profile 2020-09-01-hybrid -Force
  Install-Module -Name AzureStack -RequiredVersion 2.1.0

  Get-Module -Name "Az*" -ListAvailable
  Get-Module -Name "Azs*" -ListAvailable
```

PowerShellGet をアップデートしておかないと、Install-Module で "AllowPrerelease" オプションが使用できないなどが起きるので注意。


### Azure Stack ツールをダウンロードする
参考：[Azure Stack ツールをダウンロードする](https://docs.microsoft.com/ja-jp/azure-stack/asdk/asdk-post-deploy?view=azs-2102&tabs=az1%2Caz2%2Caz3#download-the-azure-stack-tools)

Azure Stack ツールを、GitHub から取得して、"C:\AzureStack-Tools-az" に展開します。

```powershell
# Change directory to the root directory.
cd \

# Download the tools archive.
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 
invoke-webrequest `
  https://github.com/Azure/AzureStack-Tools/archive/az.zip `
  -OutFile az.zip

# Expand the downloaded files.
expand-archive az.zip `
  -DestinationPath . `
  -Force

# Change to the tools directory.
cd AzureStack-Tools-az
```


## ASDK インストールを検証する
検証：[ASDK インストールを検証する](https://docs.microsoft.com/ja-jp/azure-stack/asdk/asdk-post-deploy?view=azs-2102&tabs=az1%2Caz2%2Caz3#validate-the-asdk-installation)

```AzureStack\AzureStackAdmin``` ユーザーでログインして、PowerShell を 管理者権限で実行。

```powershell
Enter-PSSession -ComputerName AzS-ERCS01 -ConfigurationName PrivilegedEndpoint
Test-AzureStack
```

何か問題があった場合は、エラーが表示されるのでメッセージに従って対応する。

## ASDK の Azure への登録
Azure Stack Hub はインストールしただけでは基本的な機能しか利用できず、VM イメージなどをマーケットプレイスからダウンロードして使用する必要があります。マーケットプレイスを利用するために Azure 上のテナント、サブスクリプションと紐付けを行います。

### 前提条件
参考：[前提条件](https://docs.microsoft.com/ja-jp/azure-stack/asdk/asdk-register?view=azs-2102&tabs=az1%2Caz2%2Caz3%2Caz4%2Caz5%2Caz6%2Caz7#prerequisites)

PowerShell を管理者権限で実行して、PowerShell 言語モードが FullLanguage で実行されることを確認する。

```powershell
$ExecutionContext.SessionState.LanguageMode
```


### ASDK の登録
参考：[ASDK の登録](https://docs.microsoft.com/ja-jp/azure-stack/asdk/asdk-register?view=azs-2102&tabs=az1%2Caz2%2Caz3%2Caz4%2Caz5%2Caz6%2Caz7#register-the-asdk)

Connect-AzAccount のあと、Azure のログイン ID を聞かれるので認証を行う。
Get-Credential で聞かれる ```AZURESTACK\CloudAdmin``` ユーザーのパスワードは、```AzureStackAdmin``` ユーザーと同じく、ASDK の Administorator として登録したのと同じパスワード。

```powershell
# Add the Azure cloud subscription environment name. 
# Supported environment names are AzureCloud, AzureChinaCloud, or AzureUSGovernment depending which Azure subscription you're using.
Connect-AzAccount -EnvironmentName "AzureCloud"

# Register the Azure Stack Hub resource provider in your Azure subscription
Register-AzResourceProvider -ProviderNamespace Microsoft.AzureStack

# Import the registration module that was downloaded with the GitHub tools
Import-Module C:\AzureStack-Tools-az\Registration\RegisterWithAzure.psm1

# If you have multiple subscriptions, run the following command to select the one you want to use:
# Get-AzSubscription -SubscriptionID "<subscription ID>" | Select-AzSubscription

# Register Azure Stack Hub
$AzureContext = Get-AzContext
$CloudAdminCred = Get-Credential -UserName AZURESTACK\CloudAdmin -Message "Enter the credentials to access the privileged endpoint."
$RegistrationName = "AzureStackRegistration1"
Set-AzsRegistration `
-PrivilegedEndpointCredential $CloudAdminCred `
-PrivilegedEndpoint AzS-ERCS01 `
-BillingModel Development `
-RegistrationName $RegistrationName `
-UsageReportingEnabled:$true
```

登録されるまで 7 分ぐらいかかった。

```powershell
VERBOSE: 2021-10-21.15-17-50: Retrieving activation key.
VERBOSE: 2021-10-21.15-17-50: Getting activation key from AzureStackRegistration1...
VERBOSE: 2021-10-21.15-17-52: Activation key successfully retrieved.
VERBOSE: 2021-10-21.15-17-52: Your activation key has been collected.
VERBOSE: 2021-10-21.15-17-52: *********************** End log: Get-AzsActivationKey ***********************
 :
VERBOSE: 2021-10-21.15-17-52: Activating Azure Stack (this may take up to 10 minutes to complete).
VERBOSE: Action plan instance ID specified: 9861ddb2-****-****-****-************
VERBOSE: 2021-10-21.15-23-38: Removing any existing PSSession...
VERBOSE: 2021-10-21.15-23-38: Your environment is now registered and activated using the provided parameters.
VERBOSE: 2021-10-21.15-23-38: *********************** End log: Set-AzsRegistration ***********************
```

### 登録が成功したことを確認する
参考：[登録が成功したことを確認する](https://docs.microsoft.com/ja-jp/azure-stack/asdk/asdk-register?view=azs-2102&tabs=az1%2Caz2%2Caz3%2Caz4%2Caz5%2Caz6%2Caz7#verify-the-registration-was-successful)


ASDK マシンで Web ブラウザを開いて、以下にアクセスする。
```https://adminportal.local.azurestack.external```
ログインページにリダイレクトされるので、(パブリッククラウドの) Azure ID のユーザー名とパスワードを入力して認証を行う。

以下のようなページが表示されれば ASDK の基本的な構成は完了。
![20211207-1a.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349915/f7bb1022-f629-e324-5169-3bb291c78c1d.jpeg)

# まとめ
この段階では Azure Stack Hub は基本的な機能しか使用できませんが、[Azure Stack Hub Marketplace からのダウンロード](https://docs.microsoft.com/ja-jp/azure-stack/operator/azure-stack-marketplace?view=azs-2102) を行うことで、出来ることが増えます。
スタートラインに立った状態になるので、それぞれの目的に合わせて色々なチャレンジを行う際の参考になれば幸いです。