フリートマネージャー経由でのプライベートサブネット内のWindowsサーバ接続時に、PowerShellのキーボード入力機能を動作させるためには【閉域網版】

こんにちは。SCSKのふくちーぬです。

前回、フリートマネージャー経由でのWindowsサーバ接続時にPowerShellのキーボード入力機能を動作させるための方法をご紹介しました。こちらの記事を読んでいない方は、是非ご一読ください。

今回は、閉域網環境内で実現させるための方法をご紹介します。

アーキテクチャー

  • インターネットゲートウェイ、NATゲートウェイが存在しない閉域網ネットワーク(プライベート環境)とする。
  • Systems Managerの管理下にするために、EC2はマネージドインスタンスとする。また、OSはWindows Server 2022を利用します。
  • 運用者は、フリートマネージャーを利用してEC2に接続します。
  • 運用者は、マネジメントコンソールやAPIを利用してS3にアクセスしファイルのやり取りをします。
  • プライベートサブネット内のEC2は、VPCエンドポイント経由でS3にアクセスしファイルのやり取りをします。

完成したCloudFormationテンプレート

以下のテンプレートをデプロイしてください。

AWSTemplateFormatVersion: 2010-09-09
Description: CFN template EC2
Parameters:
  ResourceName:
    Type: String
  AMIId:
    Type: String    
Resources:
  # ------------------------------------------------------------#
  # S3
  # ------------------------------------------------------------#
  S3BucketFor: 
    Type: AWS::S3::Bucket
    DeletionPolicy: Delete
    Properties: 
      BucketName: !Sub ${ResourceName}-s3-bucket
      AccessControl: Private
      PublicAccessBlockConfiguration: 
        BlockPublicAcls: true
        BlockPublicPolicy: true
        IgnorePublicAcls: true
        RestrictPublicBuckets: true
  # ------------------------------------------------------------#
  # VPC
  # ------------------------------------------------------------#
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
      EnableDnsSupport: true
      EnableDnsHostnames: true
      Tags:
        - Key: Name
          Value:  !Sub ${ResourceName}-VPC

  # ------------------------------------------------------------#
  # Private Subnet
  # ------------------------------------------------------------#
  PrivateSubnet1a:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      CidrBlock: 10.0.1.0/24
      AvailabilityZone: ap-northeast-1a
      MapPublicIpOnLaunch: false
      Tags:
        - Key: Name
          Value: !Sub ${ResourceName}-subnet-Private-1a

  PrivateSubnet1c:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      CidrBlock: 10.0.11.0/24
      AvailabilityZone: ap-northeast-1c
      MapPublicIpOnLaunch: false
      Tags:
        - Key: Name
          Value: !Sub ${ResourceName}-subnet-Private-1c

  # ------------------------------------------------------------#
  # Route Table and Routes
  # ------------------------------------------------------------#
  PrivateRouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VPC
      Tags:
        - Key: Name
          Value: PrivateRouteTable

  PrivateSubnet1aAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref PrivateSubnet1a
      RouteTableId: !Ref PrivateRouteTable

  PrivateSubnet1cAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref PrivateSubnet1c
      RouteTableId: !Ref PrivateRouteTable 

  # ------------------------------------------------------------#
  # VPC Endpoint
  # ------------------------------------------------------------#
  ssmEndpoint:
    Type: AWS::EC2::VPCEndpoint
    Properties:
      ServiceName: !Join
        - ''
        - - com.amazonaws.
          - !Ref 'AWS::Region'
          - .ssm
      SubnetIds:
        - !Ref PrivateSubnet1a
        - !Ref PrivateSubnet1c
      VpcId: !Ref VPC
      VpcEndpointType: Interface
      SecurityGroupIds:
        - !Ref VPCeSecurityGroup
      PrivateDnsEnabled: true

  ec2messagesEndpoint:
    Type: AWS::EC2::VPCEndpoint
    Properties:
      ServiceName: !Join
        - ''
        - - com.amazonaws.
          - !Ref 'AWS::Region'
          - .ec2messages
      SubnetIds:
        - !Ref PrivateSubnet1a
        - !Ref PrivateSubnet1c
      VpcId: !Ref VPC
      VpcEndpointType: Interface
      SecurityGroupIds:
        - !Ref VPCeSecurityGroup
      PrivateDnsEnabled: true

  ssmmessagesEndpoint:
    Type: AWS::EC2::VPCEndpoint
    Properties:
      ServiceName: !Join
        - ''
        - - com.amazonaws.
          - !Ref 'AWS::Region'
          - .ssmmessages
      SubnetIds:
        - !Ref PrivateSubnet1a
        - !Ref PrivateSubnet1c
      VpcId: !Ref VPC
      VpcEndpointType: Interface
      SecurityGroupIds:
        - !Ref VPCeSecurityGroup
      PrivateDnsEnabled: true

  S3VpcEndpoint:
    Type: AWS::EC2::VPCEndpoint
    Properties:
      ServiceName: !Join
        - ''
        - - com.amazonaws.
          - !Ref 'AWS::Region'
          - .s3
      VpcId: !Ref VPC          
      VpcEndpointType: Gateway      
      RouteTableIds:
        - !Ref PrivateRouteTable

  # ------------------------------------------------------------#
  # Security Group
  # ------------------------------------------------------------#
  SecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: For EC2
      VpcId: !Ref VPC

  VPCeSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      VpcId: !Ref VPC
      GroupDescription: For VPCEndpoint
      SecurityGroupIngress:
        - SourceSecurityGroupId: !Ref SecurityGroup
          IpProtocol: tcp
          FromPort: 443
          ToPort: 443  

  # ------------------------------------------------------------#
  # 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
        - arn:aws:iam::aws:policy/AmazonS3FullAccess

  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 PrivateSubnet1a
      IamInstanceProfile: !Ref InstanceProfile
      SecurityGroupIds:
        - !Ref SecurityGroup
      KeyName: !Ref KeyPair        
      Tags:
        - Key: Name
          Value: !Sub ${ResourceName}-ec2 

解決策

PSReadlineモジュールをローカルでインストールします。その後サーバに移送し、モジュールを読み込ませることで対応できます。

PSReadlineの手動インストール

下記サイトにて、PowerShellモジュールをインストールすることができます。今回は、最新バージョンの2.3.5を選定しました。

“Manual Download”を押下します。

“Download the raw nupkg file”を押下して、バイナリファイルをダウンロードします。

ファイルの拡張子をzipに変更します。

S3へのアップロード

S3に”psreadline.2.3.5.zip”ファイルをアップロードします。

キーペアの値を確認し、EC2に接続

下記記事を参考に、同様の手順でEC2にフリートマネージャー経由で接続します。

Read-S3Objectコマンドの実行

下記記事を参考に、同様の手順でPowerShellで下記コマンドをコピー&ペーストで実行します。

 

Read-S3Object -BucketName <Bucket Name> -Key <Object Key> -File <Local File Path>

例として、以下のコマンドになります。

Read-S3Object -BucketName fukuchi-s3-bucket -Key psreadline.2.3.5.zip -File C:\Users\Administrator\Downloads\psreadline.2.3.5.zip  

サーバ上にダウンロードできれば下記画面が表示されます。

モジュールの入れ替え

ダウンロードしたzipファイルを解凍しておきます。

 

以下のディレクトリ配下の”PSReadline”フォルダを削除します。

└C:\Program Files\WindowsPowerShell\Modules

その後、”psreadline.2.3.5″フォルダをコピーします。

再度PowerShellを起動し、キーボードから任意の文字を入力してみます。

無事にキーボード入力が機能しましたね。

 

最後に

いかがだったでしょうか。

フリートマネージャー経由で閉域網の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をコピーしました