AWS WindowsインスタンスにPowerShellでリモート接続する場合の問題点

はじめに

PowerShellのバージョン2.0からリモート接続が可能になっています。
いくらかの準備は必要ですが、特に追加のソフトをインストールなどすることなく他のマシンからのリモート接続ができます。
Googleで探すとセットアップのやり方や裏で動いているサービスの情報は普通に見つかるので、ここでは技術的詳細は省きます。
しかし、本来必要な手順を行った場合でも、AWSWindows Serverでこれを実現しようとすると上手くいかなかったので、その現象、原因、対処法を書き記しておきます。

発生状況

Amazonが用意したWindows Serverの日本語版AMIを利用する場合。
今回はamazonが提供しているAMI "Windows_Server-2008-R2_SP1-Japanese-64Bit-Base-2013.09.11" (ami-e3dd41e2) で実験。
初めてハマったのはこれ以前に提供されていたWindowsServer 2008 R2ですが、やっぱり直っていませんでした。


もしかすると、今後のバージョンでは直っているかもしれません。

現象

サーバーを立ち上げた段階ではWinRM(リモート管理を行うサーバー側のサービス)は立ち上がっています。
しかし、PowerShellのリモート接続の手順に従ってリモート機能を有効にしようとすると以下のようなエラーが発生します。
(なお、PowerShellコンソールは管理者権限で実行することを前提とします)

PS C:\Windows\system32> Enable-PSRemoting

WinRM クイック構成
Windows リモート管理 (WinRM) サービスを使用して、このコンピューターのリモート管理を有効にするコマンド
"Set-WSManQuickConfig" を実行します。
 これには、次の処理が含まれます:
    1. WinRM サービスを開始または (既に開始されている場合は) 再起動します。
    2. WinRM サービスのスタートアップの種類を [自動] に設定します。
    3. どの IP アドレスでも要求を受け付けるリスナーを作成します。
    4. WS-Management トラフィック用の Windows ファイアウォールの受信規則の例外を有効にします (HTTP のみ)。

続行しますか?
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "Y"): A
WinRM は既にこのコンピューター上で要求を受信するように設定されています。
Set-WSManQuickConfig : <f:WSManFault xmlns:f="http://schemas.microsoft.com/wbem/wsman/1/wsmanfault" Code="2" Machine="l
ocalhost"><f:Message><f:ProviderFault provider="Config provider" path="%systemroot%\system32\WsmSvc.dll"><f:WSManFault
xmlns:f="http://schemas.microsoft.com/wbem/wsman/1/wsmanfault" Code="2" Machine="WIN-***********"><f:Message>ファイアウ
ォールの状態を確認できません。 </f:Message></f:WSManFault></f:ProviderFault></f:Message></f:WSManFault>
発生場所 行:69 文字:17
+                 Set-WSManQuickConfig -force
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [Set-WSManQuickConfig]、InvalidOperationException
    + FullyQualifiedErrorId : WsManError,Microsoft.WSMan.Management.SetWSManQuickConfigCommand

この結果から、

  • Enable-PSRemotingを実行する
  • その中でSet-WSManQuickConfigを実行する
  • 記載されている1〜4の手順を実行する
  • その中でエラーが発生している (そして、エラーコードは2を返している)

事が分かります。
エラーメッセージとして「ファイアウォールの状態を確認できません。」とありますが、
何故このようなメッセージが起きるのかが最初は分かりませんでした。
試しにテストしたクライアントのWindows7(日本語)では特に何も設定しなくてもEnable-PSRemotingコマンドは成功するためです。そして、このサービスに利用するポートは5985(デフォルト)であり、Windowsのインストール直後にデフォルトで作成されているファイアウォール受信規則が存在するためです。


同様の事例を色々と探してみましたが、同じ問題と思われる内容を記載している記事は見つかりませんでした。

問題の原因

Enable-PSRemotingは、最終的にはwinrm quickconfigを実行します。
ちなみに、これを単体で実行しても同様のエラーが発生します。

PS C:\Windows\system32> winrm quickconfig
WinRM サービスは、既にこのコンピューターで実行されています。
WSManFault
    Message
        ProviderFault
            WSManFault
                Message = ファイアウォールの状態を確認できません。

エラー番号:  -2147024894 0x80070002
指定されたファイルが見つかりません。

これらの問題の原因はAmazonの提供するWindows Serverの日本語化が不完全なため」です。そして、問題の発生個所は「4. WS-Management トラフィック用の Windows ファイアウォールの受信規則の例外を有効にします (HTTP のみ)。」です。
"ファイアウォールの受信規則の例外を有効にする"というのは、既存のファイアウォール規則の有効/無効を切り替えます。そして、その対象のファイアウォール規則名称は現在のWindows OSが使用している言語に依存します。
もちろん、この場合にWindowsが使用しているのは日本語です。


……もうお分かりでしょうか。
Amazonの提供するWindowsServerのAMIでは、winrmが書き換えるファイアウォール規則名称が英語版のまま*1なのです。そのため書き換え対象のルールが発見できないというエラーが発生してしまいます。


# 追記補足: どちらかというと問題は winrm quickconfig の仕様がイケてない事だとは思いますが、最初から日本語のWindowsだと特に問題は起きないのでこう書いてます。

対処方法

ファイアウォール規則が存在しないのが問題なので、日本語版にあるべき名前のファイアウォール受信規則を作成すれば問題は解決します。
TCPの5985番を受け入れる

Windows リモート管理 (HTTP 受信)

という名前*2の受信規則を新たに作成することで問題を解決できます。
受信規則を作成した後、もう一度Enable-PSRemotingを実行すると次のようになります。

PS C:\Windows\system32> Enable-PSRemoting

WinRM クイック構成
Windows リモート管理 (WinRM) サービスを使用して、このコンピューターのリモート管理を有効にするコマンド
"Set-WSManQuickConfig" を実行します。
 これには、次の処理が含まれます:
    1. WinRM サービスを開始または (既に開始されている場合は) 再起動します。
    2. WinRM サービスのスタートアップの種類を [自動] に設定します。
    3. どの IP アドレスでも要求を受け付けるリスナーを作成します。
    4. WS-Management トラフィック用の Windows ファイアウォールの受信規則の例外を有効にします (HTTP のみ)。

続行しますか?
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "Y"): A
WinRM は既にこのコンピューター上で要求を受信するように設定されています。
このコンピューター上でのリモート管理には、WinRM が既に設定されています。

確認
この操作を実行しますか?
対象 "名前: microsoft.powershell SDDL:
O:NSG:BAD:P(A;;GA;;;BA)S:P(AU;FA;GA;;;WD)(AU;SA;GXGW;;;WD)。これにより、選択したユーザーがリモートから Windows
PowerShell コマンドをこのコンピューターで実行できるようになります" に対して操作 "Set-PSSessionConfiguration"
を実行しています。
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "Y"): A
PS C:\Windows\system32>


ばっちりですね!

まとめ

今回の内容から分かるように、この問題は英語のAMIを使う限りは発生しません。
そのため発生事例も少ないと思われます。
(実際、この問題の原因特定に数日かかりました......)

日本語版のWindowsでも、日本語化されてない箇所がありそうなので、そこは注意が必要ですね。

追記

Windows Server 2012ではどうなってるのか少し気になったので調べてみました。
以下のAMIでは特になにもしなくても動作を確認できましたが、もしかすると他のAMIとかでは上手く動かないのかもしれません。

動作確認済AMI: amazon/Windows_Server-2012-RTM-Japanese-64Bit-Base-2013.09.11(ami-c5df43c4)

*1:名称: Windows Remote Management (HTTP-In), 定義済みの規則であるためいくつかは変更できないと言われる。

*2:半角、半角、スペースまで完全一致する必要あり。上記の枠内をコピーすると確実です。