APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

【AWS】様々な方法でマネジメントコンソールからEC2インスタンスへ接続する


目次


はじめに

こんにちは、クラウド事業部の菅です。

みなさんはどのような方法でEC2インスタンスへ接続していますか?
AWSでは、EC2インスタンスへ接続するために様々な方法が用意されています。

なかでもマネジメントコンソールからEC2インスタンスへ接続する方法では、パブリックネットワークを作成することなく接続できます。
そこで、今回はいくつかの方法でマネジメントコンソールからEC2インスタンスへ接続してみたいと思います。

接続方法

マネジメントコンソールからEC2インスタンスへ接続する方法は複数ありますが、今回は以下の方法で接続します。
また、パブリックIPアドレスを使用しない方法のみを対象とします。

EC2 Instance Connect

EC2 Instance Connectによる接続を行います。

EC2 Instance Connectによる接続方法は、以下の2通りあります。

  • EC2 Instance Connectを使用する
  • EC2 Instance Connect エンドポイントを使用して接続する

画像の通り「EC2 Instance Connectを使用する」ではパブリックIPアドレスが必要となります。
今回はパブリックIPアドレスを必要としない「EC2 Instance Connect エンドポイントを使用して接続する」で接続します。

また、コンソールを使用した接続はLinuxのみ対応しているため、Linuxインスタンスに対してのみ接続を行います。

準備

「EC2 Instance Connect エンドポイントを使用して接続する」とあるように、接続には Instance Connect エンドポイントが必要です。
また、EC2インスタンスのセキュリティグループで Instance Connect エンドポイントからのSSH接続を許可する必要があります。
一方、EC2インスタンスには、権限や接続ユーザの作成は必要ありません。

必要なリソースをCloudFormationで作成します。

AWSTemplateFormatVersion: 2010-09-09

Parameters:
  VpcId:
    Type: AWS::EC2::VPC::Id
  SubnetId:
    Type: AWS::EC2::Subnet::Id
  AllowCidr:
    Type: String
    AllowedPattern: ^((2(5[0-5]|[0-4][0-9])|1?[1-9]?[0-9])\.){3}(2(5[0-5]|[0-4][0-9])|1?[1-9]?[0-9])/(3[0-2]|[1-2]?[0-9])$
  LatestAmiIdLin:
    Type: AWS::SSM::Parameter::Value
    Default: /aws/service/ami-amazon-linux-latest/al2023-ami-kernel-default-x86_64

Resources:
  SecurityGroupEC2Lin:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupName: security-group-ec2-lin
      GroupDescription: SecurityGroup EC2 (Linux)
      VpcId:
        Ref: VpcId
      Tags:
        - Key: Name
          Value: sg-ec2-lin
  SecurityGroupIngressEC2Lin:
    Type: AWS::EC2::SecurityGroupIngress
    Properties:
      GroupId:
        Ref: SecurityGroupEC2Lin
      IpProtocol: TCP
      FromPort: 22
      ToPort: 22
      CidrIp:
        Ref: AllowCidr
  SecurityGroupVpce:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupName: security-group-vpce
      GroupDescription: VPC Endpoint
      VpcId:
        Ref: VpcId
      Tags:
        - Key: Name
          Value: sg-vpce
  InstanceConnectEndpoint:
    Type: AWS::EC2::InstanceConnectEndpoint
    Properties:
      PreserveClientIp: False
      SecurityGroupIds:
        - Ref: SecurityGroupEC2Lin
      SubnetId:
        Ref: SubnetId
      Tags:
        - Key: Name
          Value: instance-connect
  EC2Lin:
    Type: AWS::EC2::Instance
    Properties:
      ImageId:
        Ref: LatestAmiIdLin
      InstanceType: t3.micro
      BlockDeviceMappings:
        - DeviceName: /dev/xvda
          Ebs:
            VolumeType: gp3
            VolumeSize: 10
      NetworkInterfaces:
        - DeviceIndex: '0'
          GroupSet:
            - Ref: SecurityGroupEC2Lin
          SubnetId:
            Ref: SubnetId
      Tags:
        - Key: Name
          Value: ec2-lin

AWS::EC2::InstanceConnectEndpoint の PreserveClientIp は、接続元IPアドレスの保持に関する設定です。
PreserveClientIp の設定により、EC2インスタンスのセキュリティグループで許可する値が異なります。

PreserveClientIp 説明 セキュリティグループルールで許可する値
true 接続元のIPアドレスが保持される 接続元のIPアドレス
false 接続元のIPアドレスが保持されない InstanceConnectEndpoint の以下どちらかの値
  • プライベートIPアドレス
  • セキュリティグループID
  • テンプレートには含めていませんが、EC2 Instance Connectで接続するためには操作を行うユーザに権限を付与する必要があります。
    付与する権限については、以下をご参照ください。

    接続

    実際に接続してみます。

    接続は対象のEC2インスタンス選択後、 接続 > EC2 Instance Connect から行います。

    接続 を押下

    EC2インスタンスに接続できました!

    Last Loginに表示されている通り、Instance Connect エンドポイントのプライベートIPアドレスが接続元IPアドレスとなっています。
    PreserveClientIp に true を設定した場合は、Instance Connect エンドポイントではなく接続元のIPアドレスが表示されます。

    ※別環境ですが、PreserveClientIp が true ⇒ false の順で接続した際のログは以下のようになりました。

    EC2インスタンスへの接続は、CloudTrailにOpenTunnelイベントとして記録されます。

    PreserveClientIp に true を設定して接続できない場合、セキュリティグループに問題があるかもしれません。
    セキュリティグループの設定に問題がある状態で接続したところ、CloudTrail に DialFailure エラーの OpenTunnel イベントが記録されました。
    このときはイベントに記録されている発信元IPアドレスをセキュリティグループで許可することで、接続することができました。

    Session Manager

    セッションマネージャーによる接続を行います。

    セッションマネージャーによる接続は、LinuxとWindowsの両方が対応していますので、今回は両方のインスタンスに接続します。

    準備

    セッションマネージャーで接続するためには、セッションマネージャーの設定を行う必要があります。

    セッションマネージャーのを使用するためには、以下のVPCエンドポイントが必要となります。

    • ssm
    • ssmmessages
    • ec2messages

    また、EC2インスタンスに AmazonSSMManagedInstanceCore などの権限やSSMエージェントのインストールが必要となります。
    ※今回は、SSMエージェントがインストール済みのイメージを使用してインスタンスを作成しています。

    以下テンプレートファイルを使用して、必要なリソースをCloudFormationで作成します。

    AWSTemplateFormatVersion: 2010-09-09
    
    Parameters:
      VpcId:
        Type: AWS::EC2::VPC::Id
      SubnetId:
        Type: AWS::EC2::Subnet::Id
      LatestAmiIdLin:
        Type: AWS::SSM::Parameter::Value
        Default: /aws/service/ami-amazon-linux-latest/al2023-ami-kernel-default-x86_64
      LatestAmiIdWin:
        Type: AWS::SSM::Parameter::Value
        Default: /aws/service/ami-windows-latest/Windows_Server-2022-Japanese-Full-Base
    
    Resources:
      Role:
        Type: AWS::IAM::Role
        Properties:
          RoleName: ec2-role
          AssumeRolePolicyDocument:
            Version: 2012-10-17
            Statement:
              - Effect: Allow
                Principal:
                  Service:
                    - ec2.amazonaws.com
                Action:
                  - sts:AssumeRole
          ManagedPolicyArns:
            - arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
      InstanceProfile:
        Type: AWS::IAM::InstanceProfile
        Properties:
          InstanceProfileName: ec2-role-instance-profile
          Roles:
            - Ref: Role
      SecurityGroupEC2Lin:
        Type: AWS::EC2::SecurityGroup
        Properties:
          GroupName: security-group-ec2-lin
          GroupDescription: SecurityGroup EC2 (Linux)
          VpcId:
            Ref: VpcId
          Tags:
            - Key: Name
              Value: sg-ec2-lin
      SecurityGroupEC2Win:
        Type: AWS::EC2::SecurityGroup
        Properties:
          GroupName: security-group-ec2-win
          GroupDescription: SecurityGroup EC2 (Windows)
          VpcId:
            Ref: VpcId
          Tags:
            - Key: Name
              Value: sg-ec2-win
      SecurityGroupVpce:
        Type: AWS::EC2::SecurityGroup
        Properties:
          GroupName: security-group-vpce
          GroupDescription: VPC Endpoint
          VpcId:
            Ref: VpcId
          Tags:
            - Key: Name
              Value: sg-vpce
      SecurityGroupIngressVpceFromEC2Lin:
        Type: AWS::EC2::SecurityGroupIngress
        Properties:
          GroupId:
            Ref: SecurityGroupVpce
          IpProtocol: TCP
          FromPort: 443
          ToPort: 443
          SourceSecurityGroupId:
            Ref: SecurityGroupEC2Lin
      SecurityGroupIngressVpceFromEC2Win:
        Type: AWS::EC2::SecurityGroupIngress
        Properties:
          GroupId:
            Ref: SecurityGroupVpce
          IpProtocol: TCP
          FromPort: 443
          ToPort: 443
          SourceSecurityGroupId:
            Ref: SecurityGroupEC2Win
      VPCEndpointSSM:
        Type: AWS::EC2::VPCEndpoint
        Properties:
          VpcEndpointType: Interface
          ServiceName:
            Fn::Sub: com.amazonaws.${AWS::Region}.ssm
          VpcId:
            Ref: VpcId
          PrivateDnsEnabled: true
          SubnetIds:
            - Ref: SubnetId
          SecurityGroupIds:
            - Ref: SecurityGroupVpce
          Tags:
            - Key: Name
              Value: vpce-ssm
      VPCEndpointSSMMessages:
        Type: AWS::EC2::VPCEndpoint
        Properties:
          VpcEndpointType: Interface
          ServiceName:
            Fn::Sub: com.amazonaws.${AWS::Region}.ssmmessages
          VpcId:
            Ref: VpcId
          PrivateDnsEnabled: true
          SubnetIds:
            - Ref: SubnetId
          SecurityGroupIds:
            - Ref: SecurityGroupVpce
          Tags:
            - Key: Name
              Value: vpce-ssmmessages
      VPCEndpointEC2Messages:
        Type: AWS::EC2::VPCEndpoint
        Properties:
          VpcEndpointType: Interface
          ServiceName:
            Fn::Sub: com.amazonaws.${AWS::Region}.ec2messages
          VpcId:
            Ref: VpcId
          PrivateDnsEnabled: true
          SubnetIds:
            - Ref: SubnetId
          SecurityGroupIds:
            - Ref: SecurityGroupVpce
          Tags:
            - Key: Name
              Value: vpce-ec2messages
      EC2Lin:
        Type: AWS::EC2::Instance
        Properties:
          ImageId:
            Ref: LatestAmiIdLin
          InstanceType: t3.micro
          IamInstanceProfile:
            Ref: InstanceProfile
          BlockDeviceMappings:
            - DeviceName: /dev/xvda
              Ebs:
                VolumeType: gp3
                VolumeSize: 10
          NetworkInterfaces:
            - DeviceIndex: '0'
              GroupSet:
                - Ref: SecurityGroupEC2Lin
              SubnetId:
                Ref: SubnetId
          Tags:
            - Key: Name
              Value: ec2-lin
      EC2Win:
        Type: AWS::EC2::Instance
        Properties:
          ImageId:
            Ref: LatestAmiIdWin
          InstanceType: t3.micro
          BlockDeviceMappings:
            - DeviceName: /dev/sda1
              Ebs:
                VolumeType: gp3
                VolumeSize: 50
          IamInstanceProfile:
            Ref: InstanceProfile
          NetworkInterfaces:
            - DeviceIndex: '0'
              GroupSet:
                - Ref: SecurityGroupEC2Win
              SubnetId:
                Ref: SubnetId
          Tags:
            - Key: Name
              Value: ec2-win

    接続

    実際に接続してみます。

    接続は対象のEC2インスタンス選択後に 接続 > セッションマネージャー から行います。

    Linux

    接続 を押下

    Windows

    接続 を押下

    Linux・Windowsともに、EC2インスタンスに接続することができました!

    どちらのOSも、ssm-user というユーザで接続されます。
    ※このユーザは自動で作成されるユーザです。

    接続は、StartSession イベントとしてCloudTrailに記録されます。

    ※画像はLinuxインスタンス接続時
     Windowsインスタンス接続時も同様のため省略

    Fleet Manager

    Fleet Managerによる接続を行います。

    Fleet Managerによる接続はWindowsのみ対応しているため、Windowsインスタンスの接続のみ実施します。

    準備

    Fleet Managerでもセッションマネージャーの設定が必要となります。
    また、Fleet Managerでは接続ユーザを予め作成する必要があります。

    以下テンプレートファイルを使用して、必要なリソースをCloudFormationで作成します。

    AWSTemplateFormatVersion: 2010-09-09
    
    Parameters:
      VpcId:
        Type: AWS::EC2::VPC::Id
      SubnetId:
        Type: AWS::EC2::Subnet::Id
      LatestAmiIdWin:
        Type: AWS::SSM::Parameter::Value
        Default: /aws/service/ami-windows-latest/Windows_Server-2022-Japanese-Full-Base
    
    Resources:
      Role:
        Type: AWS::IAM::Role
        Properties:
          RoleName: ec2-role
          AssumeRolePolicyDocument:
            Version: 2012-10-17
            Statement:
              - Effect: Allow
                Principal:
                  Service:
                    - ec2.amazonaws.com
                Action:
                  - sts:AssumeRole
          ManagedPolicyArns:
            - arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
      InstanceProfile:
        Type: AWS::IAM::InstanceProfile
        Properties:
          InstanceProfileName: ec2-role-instance-profile
          Roles:
            - Ref: Role
      SecurityGroupEC2Win:
        Type: AWS::EC2::SecurityGroup
        Properties:
          GroupName: security-group-ec2-win
          GroupDescription: SecurityGroup EC2 (Windows)
          VpcId:
            Ref: VpcId
          Tags:
            - Key: Name
              Value: sg-ec2-win
      SecurityGroupVpce:
        Type: AWS::EC2::SecurityGroup
        Properties:
          GroupName: security-group-vpce
          GroupDescription: VPC Endpoint
          VpcId:
            Ref: VpcId
          Tags:
            - Key: Name
              Value: sg-vpce
      SecurityGroupIngressVpceFromEC2Win:
        Type: AWS::EC2::SecurityGroupIngress
        Properties:
          GroupId:
            Ref: SecurityGroupVpce
          IpProtocol: TCP
          FromPort: 443
          ToPort: 443
          SourceSecurityGroupId:
            Ref: SecurityGroupEC2Win
      VPCEndpointSSM:
        Type: AWS::EC2::VPCEndpoint
        Properties:
          VpcEndpointType: Interface
          ServiceName:
            Fn::Sub: com.amazonaws.${AWS::Region}.ssm
          VpcId:
            Ref: VpcId
          PrivateDnsEnabled: true
          SubnetIds:
            - Ref: SubnetId
          SecurityGroupIds:
            - Ref: SecurityGroupVpce
          Tags:
            - Key: Name
              Value: vpce-ssm
      VPCEndpointSSMMessages:
        Type: AWS::EC2::VPCEndpoint
        Properties:
          VpcEndpointType: Interface
          ServiceName:
            Fn::Sub: com.amazonaws.${AWS::Region}.ssmmessages
          VpcId:
            Ref: VpcId
          PrivateDnsEnabled: true
          SubnetIds:
            - Ref: SubnetId
          SecurityGroupIds:
            - Ref: SecurityGroupVpce
          Tags:
            - Key: Name
              Value: vpce-ssmmessages
      VPCEndpointEC2Messages:
        Type: AWS::EC2::VPCEndpoint
        Properties:
          VpcEndpointType: Interface
          ServiceName:
            Fn::Sub: com.amazonaws.${AWS::Region}.ec2messages
          VpcId:
            Ref: VpcId
          PrivateDnsEnabled: true
          SubnetIds:
            - Ref: SubnetId
          SecurityGroupIds:
            - Ref: SecurityGroupVpce
          Tags:
            - Key: Name
              Value: vpce-ec2messages
      EC2Win:
        Type: AWS::EC2::Instance
        Properties:
          ImageId:
            Ref: LatestAmiIdWin
          InstanceType: t3.micro
          BlockDeviceMappings:
            - DeviceName: /dev/sda1
              Ebs:
                VolumeType: gp3
                VolumeSize: 50
          IamInstanceProfile:
            Ref: InstanceProfile
          NetworkInterfaces:
            - DeviceIndex: '0'
              GroupSet:
                - Ref: SecurityGroupEC2Win
              SubnetId:
                Ref: SubnetId
          Tags:
            - Key: Name
              Value: ec2-win
          UserData:
            Fn::Base64:
              Fn::Sub : |
                <powershell>
                $user = New-LocalUser -AccountNeverExpires:$true -Password ( ConvertTo-SecureString -AsPlainText -Force 'ExampleP@ssword!') -Name "RDPUser" -FullName "Local RDPUser" -Description "Local Administrator"
                Add-LocalGroupMember -Group "Administrators" -Member $user
                Add-LocalGroupMember -Group "Remote Desktop Users" -Member $user
                </powershell>

    ※接続用ユーザは以下を参考に作成しています。

    接続

    実際に接続してみます。

    接続は、AWS Systems Manager の フリートマネージャー から行います。

    ※対象のインスタンスを選択して ノードアクション > 接続 > リモートデスクトップで接続 を選択

    ※認証情報を入力して 接続 を選択

    EC2インスタンスに接続できました!

    Fleet Manager による接続は、Session Manager同様、StartSession イベントがCloudTrailに記録されます。

    まとめ

    今回は、様々な方法でマネジメントコンソールからEC2インスタンスに接続しました。

    どの方法もコンソールのユーザの権限を使用して接続されるため、EC2インスタンスを操作することなく接続ユーザを管理することができます。
    また、接続時にCloudTrailに記録されるため、EC2インスタンスの状態に関係なくログを記録することができます。
    ※CloudWatchエージェントでアクセスログを収集する場合、エージェントの停止やログの収集遅延などの影響があります。

    一方、接続時の操作性はTeraTermやリモートデスクトップ接続 (mstsc) による接続よりも劣ります。
    例えば、ファイル転送はコンソールから直接行うことはできず、S3バケットなどを経由する必要があります。
    また、Winキーなどの一部キーはコンソールを通じて入力することができず、操作端末 (ブラウザを開いている端末) に対して入力されます。
    全画面表示で操作していた場合、EC2インスタンスを操作しているつもりで操作端末を操作していたなど、誤操作の可能性があります。

    マネジメントコンソールからの接続はメリット・デメリットはありますが、接続方法を考えるうえで十分選択肢に入ると思います。

    この記事が誰かのお役に立てば幸いです。

    お知らせ

    APCはAWS Advanced Tier Services (アドバンストティアサービスパートナー) 認定を受けております。

    その中で私達クラウド事業部はAWSなどのクラウド技術を活用したSI/SESのご支援をしております。

    また、一緒に働いていただける仲間も募集中です!
    今年もまだまだ組織規模拡大中なので、ご興味持っていただけましたらぜひお声がけください。