EC2でシリアルポートアクセスが可能になったのでWindows Serverの緊急管理サービス(EMS)を試してみた

2021.03.31

しばたです。

本日EC2でシリアルポート経由でのアクセスがサポートされDevelopersIOでも早速紹介されています。

上の記事ではAmazon Linuxの接続例が記載されていますがWindows Serverでもシリアルポート経由での接続は可能ですので、本記事でその概要と接続手順を紹介したいと思います。

緊急管理サービス(EMS)とは?

Windows Serverでも主にメンテナンス用途にシリアルポート経由で接続する機能が提供されており緊急管理サービス(Emergency Management Services : EMS)と呼ばれています。

この機能については@ITのこちらの記事で詳しく解説されていますので一読いただくのが良いでしょう。

Azureでは以前からシリアルポート接続がサポートされておりこのEMSを使ってWindows仮想マシンに接続することができています。

今回AWSでも同様の行為ができる様になったというわけです。

試してみた

ここからは実際に試してみたほうが分かりやすいと思います。

0. 検証環境

検証環境として東京リージョンで英語版の最新Windows Server 2019のAMI(ami-0f3651a900e33262f : Windows_Server-2019-English-Full-Base-2021.03.10)を使います。

先に説明しておくと日本語版Windowsでも不可能ではないのですが文字化けがひどかったので最初は英語版OSで解説します。
あとで日本語版Windowsでの注意点も説明します。

1. EMSの有効化

素のWindows Serverでは既定でEMSが有効になっていないので最初に機能を有効化する必要があります。

Windows Server 2008以降ではbcdeditコマンドを使い以下の様にすることでEMSを有効にできます。
設定変更後、再起動でEMSが有効になります。

# bcdeditコマンドを使いEMSを有効化
#  * EC2ではCOM1を使うので EMSPORT:1 に。ボーレートはよしなに指定
bcdedit /emssettings EMSPORT:1 EMSBAUDRATE:115200
#  * PowerShellコンソールの場合は '{current}' とシングルシングルクオートでくくる必要有り
bcdedit /ems '{current}' on

# 再起動
Restart-Computer -Force

パラメーター指定における注意点としては以下となります。

  • EC2はCOM1ポートを使うため bcdedit /emssettings の EMSPORT は 1 にする
  • ボーレートに対する指定は特にない模様

設定内容の確認はbcdeditコマンドを実行し、Windows Boot Loaderの設定にems Yesの欄があれば問題ありません。

2. シリアルコンソール接続

これで事前準備が整ったので実際に接続していきます。

マネジメントコンソールから対象のEC2を選び「モニタリングとトラブルシューティング」→「EC2シリアルコンソール」を選びます。
(ちなみに「接続」選んでもシリアルコンソール接続可能です)

接続情報が表示されるのでそのまま「接続」します。

※初回は機能のオプトインを要求されるので適宜機能を有効にしてください。

すると下図の様な感じでシリアルポート経由でSpecial Administration Console(SAC)に接続されます。

(画面に何も表示されない場合は一度Enterを押してみてください。Enterを押しても一切反応が無い場合はEMSが有効になっていない可能性が高いです)

SACの使い方はhelpコマンドで確認するか、最初に紹介した@ITの記事を参照してください。

本記事でも軽く紹介しておくとざっくり以下のコマンドが使えます。

コマンド 内容 備考
d カーネルダンプを取得
i IPアドレス情報を取得
id サーバーの基本情報を取得
t プロセス情報などの詳細を取得 tasklist相当
f tコマンドでスレッド情報も取得するか設定
k 指定のプロセスをKillする
r, l 指定のプロセスの優先度を上げる、下げる
m 指定のプロセスのメモリ使用量を制限する
s OSの時刻を表示する
restart OSを再起動する
shutdown OSを停止する
crashdump OSを意図的にクラッシュさせクラッシュダンプを取得する

3. OSへログイン

SACからコンソールログインするためには

  1. cmdコマンドで新しいチャネルを作る
  2. chコマンドで作ったチャネルからログインする

の手順を踏む必要があります。

cmd

上図ではCmd0001といchう新しいチャネルが作成されました。
次にch -sn cmd0001コマンドでこのチャネルにスイッチします。

ch -sn cmd0001

するとこの様な画面になるので任意のキーを入力し処理を続行します。
(前画面に戻りたい場合はesc + tab + 0を押します)

次にログイン情報の入力を促されるので、ログインユーザー名、ドメイン名、パスワードの順に入力します。

認証に成功するとコマンドプロンプトが使える様になります。

あとは自由に作業してください。
コマンドプロンプトを終了するとSACに戻ります。

SACを終了する場合はそのままウィンドウを閉じてください。

日本語版Windowsでの注意点

ここからは日本語版Windowsでの注意点について触れておきます。
残念ながら現時点では英語以外の言語は文字化けする様で日本語の表示も化けてしまします。

日本語版WindowsでもEMSは英語版と全く同じ手順で設定でき、マネジメントコンソールから接続することも可能です。
以下が日本語版WindowsでSACにつないでhelpコマンドを入力した結果です。

日本語が悲惨なことになっています。

OSへのログインも機能としては問題なく可能なのですが、

cmd
ch -sn <作成されたチャネル>

ログイン情報の入力は完全に化けているので入力順を覚えておく必要があります。

何とかログインできても日本語の表示は文字化けします。

この場合は仕方ないのでchcpコマンドでロケールを変更してやります。

# 古いOSだとコードページ65001だと上手く動作しない場合があるので注意 (chcp 437あたりが良いかも)
chcp 65001

完全に文字化けを無くせるわけではないですがだいぶマシになります。

【補足】文字化けをよく見ると...

最初この文字化けはエンコーディング周りのエラーなのかと思っていたのですが、よく見ると化けている文字にはすべてコードポイントが記載されています。
詳細は全くわかりませんがどうやらエンコーディングではなく表示上の問題の様で、化けている部分をローカルのテキストエディタなどにコピペすると正しく文字が表示されます。

表示上の問題であるならAWSへフィードバックしたら直りそうな予感がするのでフィードバックしておこうと思います。

最後に

以上となります。

AWSにありそうでずっと無かったシリアルポートアクセスですが遂に利用可能になりました。
これまではEC2Rescue for Windows Serverが同等の役割を担っていましたが、EMSを使うことでより柔軟な対応ができるでしょう。

EMSは初期設定が必要なため既存の環境で直ちに使うことはできませんが、必要に応じて適宜導入し利用すると良いのではないかと思います。