Azure で Windows Server 2019 Datacenter をセットアップするお話

# この記事について
Windows Server 2019 Datacenter を Azure 上に立てて、色々やろうとしている/したときの備忘録です。
Azure を利用した Windows Server 2019 Datacenter のセットアップを取り扱っている記事って意外と少ない感じですし、折角なので記事にしてみました。
まだまだ試行錯誤中なので、適宜記事の追加/修正があると思います。

# そもそもの話
社内で Windows Serverを使った新サービスを展開する運びとなり、気付けば当面のインフラ構築係になっていました。
あまりタッチできてない分野だったので触れる機会を頂けたこと自体は嬉しいのだけれど、インフラ初心者の自分にとっては色々なところに躓くので難しいなぁ、というお話です。

# 1. AzureでVirtual Machineを立てる
Azure Portalを用いてVirtual Machineを立てました。
手順に従ってマシンリソースを設定するだけなのですが、マシン名が15文字以内という制限は、ネーミングセンスが虫食いにあった障子のような自分にとっては些か難敵でした。

# 2. Azure Portalで接続制限をかける
パスワード認証を外に公開するのは躊躇われたので、ネットワーク設定でIPとポートの制限を掛けました。
一先ずはAzure Portal上でRDPへのアクセスに制限を掛けるのみとしますが、「SSHで接続してからトンネリングしたRDPを使う」という形を目指したいと思います。公開鍵認証方式であればまだ安心できます。あと楽だし。
マシン性能はそれなりにあるものを用意したので、仮想通貨採掘マシンにされたら、それはそれは貢献してしまいそうなものです。

# 3. Virtual Machineにログイン
WindowsパソコンからRDPを用いてログインします。
なんとなく分かってはいましたが、ディスプレイ言語は英語でした。画面一面に英語が出てきた暁には、悲鳴を上げて椅子から転げ落ちるまである。

# 4. Windows Update
とりあえずアップデートをかけます。

# 5. Userを追加する
作業用のAdminユーザを追加しました。
Windowsにユーザを追加する手順と全く同じなので割愛します。

# 6. 日本語化する
躓きました。大いに躓きました。
一般的に思い浮かべる手順は以下の通りだと思います。

1. WindowsアイコンからSettingsを開く
2. Time and Languageを選択
3. Languageを選択
4. Add a languageを選択
5. japan/日本語の言語パックをインストール
6. display languageを日本語に設定
7. Region周りの設定を「English」から「日本」に変更

うまく通れば簡単な作業なのですが、手順6以降がうまく行きません。display languageを変えるべく、プルダウンメニューをクリックしてもEnglish以外の選択肢が出てこないのです。

調べてみると、Windows Server 2019ではデフォルトの言語パックインストールツールで日本語をインストールすることができないみたいです。（他の言語もなのかはわからないです）
なので、自分で取ってきて入れればいいっぽいです。[マイクロソフトのサポートページ](https://support.microsoft.com/en-za/help/4466511/cannot-configure-language-pack-for-windows-server-2019)に色々書いてあります。
（言語パックは「Download an ISO image that contains the language packs here.」ってところにリンクがあります）

言語パックをダウンロードしたら、以下の手順でインストールします。

1. ダウンロードしたISOファイルをマウント
2. Windowsキー + R を実行
3. lpksetup.exe を実行
4. マウントした言語パッケージの「langpacks」ファイル下の「Microsoft-Windows-Server-Language-Packx64ja-jp.cab」を選択
5. インストールが行われる

これで、手順6以降の作業が可能になります。

# 7. SSHD を有効にして、トンネリングする
Windows Server 2019にはデフォルトでOpenSSHが搭載されているらしいので、まずはそれを有効にします。
手順は以下の通り。

1. 「設定」を開く
2. 「アプリ」を選択
3. 「オプション機能の管理」を選択
4. 「機能の追加」を選択
5. 「OpenSSH サーバー」をインストール
6. 「サービス一覧」に「OpenSSH Server」があるので、スタートアップを「自動」に変更

以上の作業でSSHDの準備ができましたので、次に公開鍵認証方式による接続ができるように設定を加えます。
手順は以下の通り。

1. 「C:\ProgramData\ssh\sshd_config」を開く
2. 下から二行（Match Group Administoratorsの部分）をコメントアウト
3. ログインユーザのホームディレクトリに「.ssh」フォルダを作成
4. 「authorized_keys」を作成
5. 公開鍵を適宜登録する

# 8. ディスクをマウントする
手順は以下の通りです。

1. 「ディスクの管理」を開く
2. Azure Portalで用意したストレージを特定する
3. 右クリックで「ディスクの初期化」を行う
4. ３）完了後、再び右クリックで「新しいシンプルボリューム」を選択する
5. 何もなければ特に設定は変えずに「次へ」を選択し、マウントする

# 9. Dockerをインストールする
Windows Server 2019 には、Windows Server コンテナなるものがあるらしく、それを使えばHyper-Vを用いずにDockerを使用することができるみたいです。Hyper-Vを用いない利点としては、使用するリソースが少なくて済む点でしょう。

導入は管理者権限のPowershellで以下のコマンドを叩くだけです。
選択肢には、全てYesで答えましょう。

```powershell:
Enable-WindowsOptionalFeature -Online -FeatureName Containers
Install-Module -Name DockerMsftProvider -Repository PSGallery -Force
Install-Package -Name docker -ProviderName DockerMsftProvider
```

確認は管理者権限のPowershellで以下のコマンドを叩きます。

```powershell:
docker version
```

# 10. DockerのSSHDを有効にする
かなり躓きました。
以下の手順でインストール&公開鍵登録を行えば大丈夫です。

1. OpenSShを「C:\ProgramData\ssh」に上書きする
2. 要件に沿う形で「sshd_conf」を書き換える
3. 「install-sshd.ps1」でsshdをインストールする
4. SSHDを開始させる(この際、パスワード認証によるログインを許可しておく)
5. コンテナが立ち上がる度にSSHDが自動で起動するようにする
6. ユーザを作成する 
7. sshを用いて作成ユーザにログインする(ログインしないとホームディレクトリが作られず、authorized_keysが設定できない)
8. 作成ユーザのホームディレクトリ下に「.ssh」フォルダを作る
9. 「.ssh」フォルダの下に「authorized_keys」を作成する
10. 適宜「authorized_keys」を編集する
11. 「authorized_keys」の所有者をAdministratorsグループに変更する
12. 必要に応じて「sshd_cpnf」を設定し、パスワード認証をオフにする

以下に上の手順で使ったコマンドになります。
なお、ファイルの編集については、Dockerでマウントしたフォルダで作業を行い、ファイルをコピーするなりしていました。

```powershell:
# OpenSSHをインストールする。
install-sshd.ps1

# インストール後、SSHDをサービスとして起動させる
Start-Service -Name "sshd"

# SSHDがサービスとして動いているか確認する。
Get-Service -Name "sshd" | select-Object

# コンテナ起動時にSSHDが自動で動くように設定する。
Set-Service -Name "sshd" -StartupType Automatic

# Userを追加する。
New-LocalUser -Name {User_Name}

# 所有者をAdministratorsグループに変更する
takeown -f authorized_keys -A

# 「sshd_conf」を編集した後、設定を反映させるためにSSHDを再起動させる。
Restart-Service -Name "sshd"
```

# 最後に
いつかはAnsibleとかで自動化するんだ……っ!

# 注意および免責事項
本記事の内容はあくまで私個人の見解であり、所属する組織の公式見解ではありません。
本記事の内容を実施し、利用者および第三者にトラブルが発生しても、筆者および所属組織は一切の責任を負いかねます。