フリートマネージャー経由でのWindowsサーバ接続時に、PowerShellのキーボード入力機能を動作させるためには

こんにちは。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を正常に機能させることができます。

本記事が皆様のお役にたてば幸いです。

ではサウナラ~🔥

著者について
ふくちーぬ(福地孝哉)

◆所属:クラウドサービス部
◆経歴:
 2022 ANGEL Dojo ANGEL賞 2位
 2023 Japan AWS All Certifications Engineers
 2024 Japan AWS All Certifications Engineers
 2024 Japan AWS Jr. Champions
◆資格:
 熱波師,サウナ・スパ健康アドバイザー,Azure,Terraform,情報処理安全確保支援士合格
◆好きなAWSサービス:Amazon EventBridge
◆好きなサウナの温度:120℃
◆好きな水風呂の温度:16.5℃

ふくちーぬ(福地孝哉)をフォローする

クラウドに強いによるエンジニアブログです。

SCSKクラウドサービス(AWS)は、企業価値の向上につながるAWS 導入を全面支援するオールインワンサービスです。AWS最上位パートナーとして、多種多様な業界のシステム構築実績を持つSCSKが、お客様のDX推進を強力にサポートします。

AWSクラウドソリューション運用・監視
シェアする
タイトルとURLをコピーしました