目次
はじめに
こんにちは、クラウド事業部の菅です。
みなさんはどのような方法で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 の以下どちらかの値
|
テンプレートには含めていませんが、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のご支援をしております。
また、一緒に働いていただける仲間も募集中です!
今年もまだまだ組織規模拡大中なので、ご興味持っていただけましたらぜひお声がけください。