こんにちは。SCSKのふくちーぬです。
AWS Systems Managerのフリートマネージャーを利用して、Windowsサーバにブラウザベースでのリモート接続している方多いかと思います。その際に、PowerShellでキーボード入力が機能しなかった事象が発生しましたので対処策をお話します。
アーキテクチャー
- Systems Managerの管理下にするために、EC2はマネージドインスタンスとする。また、OSはWindows Server 2022を利用します。
- 運用者は、フリートマネージャーを利用してEC2に接続します。
完成したCloudFormationテンプレート
以下のテンプレートをデプロイしてください。
AWSTemplateFormatVersion: 2010-09-09
Description: CFN template EC2
Parameters:
ResourceName:
Type: String
AMIId:
Type: String
Resources:
# ------------------------------------------------------------#
# VPC
# ------------------------------------------------------------#
VPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock: 10.0.0.0/16
EnableDnsSupport: true
EnableDnsHostnames: true
Tags:
- Key: Name
Value: !Sub ${ResourceName}-VPC
# ------------------------------------------------------------#
# Internet Gateway
# ------------------------------------------------------------#
InternetGateway:
Type: AWS::EC2::InternetGateway
AttachGateway:
Type: AWS::EC2::VPCGatewayAttachment
Properties:
VpcId: !Ref VPC
InternetGatewayId: !Ref InternetGateway
# ------------------------------------------------------------#
# Public Subnet
# ------------------------------------------------------------#
PublicSubnet1a:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref VPC
CidrBlock: 10.0.1.0/24
AvailabilityZone: ap-northeast-1a
MapPublicIpOnLaunch: true
Tags:
- Key: Name
Value: !Sub ${ResourceName}-subnet-1a
# ------------------------------------------------------------#
# Route Table and Routes
# ------------------------------------------------------------#
PublicRouteTable:
Type: AWS::EC2::RouteTable
Properties:
VpcId: !Ref VPC
Tags:
- Key: Name
Value: PublicRouteTable
PublicRoute:
Type: AWS::EC2::Route
Properties:
RouteTableId: !Ref PublicRouteTable
DestinationCidrBlock: 0.0.0.0/0
GatewayId: !Ref InternetGateway
PublicSubnet1aAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref PublicSubnet1a
RouteTableId: !Ref PublicRouteTable
# ------------------------------------------------------------#
# Security Group
# ------------------------------------------------------------#
SecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: For EC2
VpcId: !Ref VPC
# ------------------------------------------------------------#
# IAM Role and Instance Profile
# ------------------------------------------------------------#
SSMRole:
Type: AWS::IAM::Role
Properties:
RoleName: !Sub ${ResourceName}-ec2-role
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Principal:
Service: ec2.amazonaws.com
Action: sts:AssumeRole
Path: /
ManagedPolicyArns:
- arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
InstanceProfile:
Type: AWS::IAM::InstanceProfile
Properties:
Roles:
- !Ref SSMRole
# ------------------------------------------------------------#
# EC2 Key Pair
# ------------------------------------------------------------#
KeyPair:
Type: AWS::EC2::KeyPair
Properties:
KeyName: !Sub ${ResourceName}-key
# ------------------------------------------------------------#
# EC2 Instance
# ------------------------------------------------------------#
EC2Instance:
Type: AWS::EC2::Instance
Properties:
InstanceType: t2.micro
ImageId: !Ref AMIId
SubnetId: !Ref PublicSubnet1a
IamInstanceProfile: !Ref InstanceProfile
SecurityGroupIds:
- !Ref SecurityGroup
KeyName: !Ref KeyPair
Tags:
- Key: Name
Value: !Sub ${ResourceName}-ec2
本事象の確認
キーペアの値を確認し、EC2に接続
Systems Manager パラメータストアにアクセスし、キーペアの値をメモしておく。
上記の値を利用して管理者パスワードを復号します。
フリートマネージャーを利用し管理者パスワードを入力し、EC2に接続します。
PowerShellでキーボード入力が機能しないことを確認
PowerShellを開き、キーボードで文字の入力を試みますが動作しません。
※メモ帳内の文字をコピー&ペーストで、PowerShellに貼り付けることはできます。
解決策
PowerShellにて、PSReadlineモジュールをインストールすることで解決できます。
モジュールのインストール
PSReadLineモジュールは、コマンド ラインを編集させるためのモジュールとなります。このモジュールのおかげで、コマンド履歴を追ったりすることができます。
PSReadLineのバージョン2.2.2以上をインストールします。
キーボード入力機能は利用できないため、コピー&ペーストを使って下記コマンドを実行します。
Install-Module -Name PSReadLine -Repository PSGallery -MinimumVersion 2.2.2 -Force
Yes/Noの確認プロンプトが表示されたら、”Y”を入力します。この際も、コピー&ペーストを使って入力することに注意してください。
PowerShellでキーボード入力が機能することを確認
再度、PowerShellを開きます。キーボードから任意の文字を入力してみます。
無事にキーボード入力が機能しましたね。
まとめ
Windows Server 2022では、PowerShell でキーボードが正常に機能するためにはPSReadLine のバージョン 2.2.2 以上が必要です。
本制約は、フリートマネージャー利用時特有のものとなります。
キーボード機能用 PSReadLine モジュールバージョン
PowerShell でキーボードが正しく機能することを確認するには、Windows Server 2022 を実行しているノードに PSReadLine モジュールバージョン 2.2.2 以降がインストールされていることを確認してください。古いバージョンを使用している場合は、以下のコマンドを使用して、必要なバージョンをインストールできます。
Install-Module -Name PSReadLine -Repository PSGallery -MinimumVersion 2.2.2 -Force
代替策として、以下の方法もございますので併せてご検討いただければと思います。
- プライベートなRDP接続
- EC2 Instance Connect Endpoint経由でのRDP接続
最後に
いかがだったでしょうか。
フリートマネージャー利用時には、WindowsサーバのモジュールをアップデートすることでPowerShellを正常に機能させることができます。
本記事が皆様のお役にたてば幸いです。
ではサウナラ~🔥