❚ はじめに
皆さんこんにちは!25ぺーぺー新卒の shuto です。
Windows ServerをFleet Manager(Session Manager)経由で操作する際、
PowerShellにキーボードから文字を入力できないことがありました。
PowerShellの設定によりキーボード入力ができる状態にできるため、
その設定を自動化して楽をしたいと考えました。
本記事では、EC2起動時のユーザーデータを利用し、
初回のFleet Manager接続時点からPowerShellに文字入力できる状態を
自動で構成する方法を紹介します。
FleetManagerをEC2インスタンスに対して使用するにはインスタンス作成時に
いくつか設定必要項目がありますが本記事ではそれに言及しません。
❚ TL;DR
- Fleet Manager経由のWindows接続ではPowerShellに文字入力できないことがある
- PowerShellのとあるモジュールのバージョンがFleetManagerの文字入力の方式とうまく合っていないことが原因
- モジュールのバージョンをキーボードから入力できるものにユーザデータで起動時に設定する
- ユーザデータスクリプト
1.FleetManagerで文字入力ができない問題
FleetManager(Session Manager)を利用してWindowsServerに接続した場合、
PowerShellコンソール上で文字入力できないことがありました。
コピーペーストでは入力できるため、キーボード入力のみが制限されている状態でした。
この問題はPowerShellのPSReadLineモジュールが古いことによるものです。
調べてみるとPSReadLineモジュールのバージョンが 2.2.2 以降であるとこの現象が解決できるみたいでした。
2.本記事のアプローチ
本記事では、EC2 起動時のユーザーデータ(PowerShell)を利用し、
インスタンス起動と同時に該当モジュールのバージョンアップを実行します。
これにより、Fleet Managerの初回接続時から
PowerShellへの文字入力が可能な状態となります。
3.スクリプト(PowerShell)
以下は WindowsServer2022を想定したユーザーデータに設定するスクリプトの例です。
PSReadLineモジュールのバージョンが 2.2.2 より古ければ自動更新します。
必要な依存関係も含めて、起動時に自動で更新されるようにしています。
<powershell>
$RequiredVersion = [Version]"2.2.2"
$Current = Get-Module -ListAvailable PSReadLine |
Sort-Object Version -Descending |
Select-Object -First 1
if ($null -ne $Current -and $Current.Version -ge $RequiredVersion) {
exit 0
}
Install-PackageProvider `
-Name NuGet `
-MinimumVersion 2.8.5.201 `
-Force `
-Confirm:$false
Install-Module `
-Name PSReadLine `
-Repository PSGallery `
-MinimumVersion 2.2.2 `
-Force `
-AllowClobber `
-Scope AllUsers `
-Confirm:$false
</powershell>
❚ 検証
以下AMIで文字入力ができるようになることを確認できました。
AMI(ap-northeast-1)
バージョンの確認
コマンドをキーボードから入力し、PSReadlineのバージョンが 2.4.5 になっていることが確認できました。

ログの確認
ユーザデータスクリプトが実行され、正常終了していることも確認できました。

❚ おわりに
本記事では、Windowsインスタンス起動時に
PSReadLine を適切なバージョンへ更新することで、
初回接続時から PowerShellを通常どおり利用できる状態にする方法を紹介しました。
検証用途などでWindowsインスタンスを頻繁に立ち上げる場合、
毎回手動で設定を行う必要がなくなるため、
ちょっとした手間の削減につながると思います。
同様の症状に遭遇した際の一例として、参考になれば幸いです。
