EC2への接続方法は四種類
今回はプライベートサブネット上に構築したAmazonLinuxのEC2の接続方法について、設定方法を確認していこうと思います。
コンソール上から確認できるLinuxEC2への接続方法は下記四つです。
・EC2InstanceConnect
・セッションマネージャー
・SSHクライアント
・EC2シリアルコンソール
四種類の接続方法の違いについて
特にEC2InstanceConnectとセッションマネージャーの使い分けに迷ったので、それぞれの接続方法の特徴を自分なりにまとめてみました。
EC2InstanceConnectの特徴
- 有効期間の短い公開鍵を使ってインスタンスにSSH接続。SSHキーを自分で管理する必要はない。
- インスタンスにEC2InstanceConnectのインストールが必要。
※Amazon Linux 2、MacOS、Ubuntuの場合、新しいバージョンのAMIを使用すればEC2InstanceConnectはプリインストールされているようです。 - エンドポイントなしでのEC2InstanceConnectはLinux系(AmazonLinux2、CentOS、macOS、RHEL、Ubuntu)でのみ使用可能。
※エンドポイントを使えばWindowsにも接続可能のようです - SGにてAWSのIPプレフィックスリストからSSH(22番)のインバウンド接続許可が必要。
- VPCエンドポイントにてプライベートIPでの接続が可能。
- エンドポイントの使用に追加コストはかからない。しかし、EC2InstanceConnectエンドポイントはマルチAZに対応していない。
- 接続中に実行したコマンドは記録されない。
※エンドポイント経由の接続リクエストは記録されます - EC2へのIAMロールのアタッチは不要。
※InstanceConnectを利用するユーザー側にはIAMの権限設定が必要です
SessionManagerの特徴
- プロキシ接続経由でトンネリングされたSSH接続を行う。SSHキーを自分で管理する必要はない。
- インスタンスにSSMAgentのインストールが必要。
※多数のAMIにSSMAgentがプリインストール済です - macOS以外の多くのOSにて利用可能。
- SGでSSH(22番)のインバウンド接続を許可する必要はない。ただし、SSMAgentからSSMAPIへ名前解決が行えて、接続が行える必要がある。
- Interface型のVPCエンドポイントをマルチAZで使用可能。
※SSMのVPCエンドポイントは有料です - 接続中に実行したコマンドはCloudTrailに記録される
- EC2へIAMロールの権限設定が必要
EC2シリアルコンソールの特徴
- EC2の仮想シリアルポートに接続する。
- EC2のネットワーク接続性が失われても利用可能。インスタンスの再起動中・停止中にもセッションが持続。
- SGの許可設定は不要。VPCエンドポイントやパブリックIPも不要。
- Linuxの場合は、事前にシリアルコンソール接続用のユーザーを作成し、パスワードを設定しておく必要がある。パスワードの管理が必要。
- LinuxはNitro世代と一部を除くベアメタルインスタンス、WindowsはNitro世代インスタンスのみ使用可能。
SSHやRDPでの接続の特徴
- Linuxの場合はTeratermなどのクライアントソフトを使用し、EC2作成時に指定したキーペアを使用して接続。
- Windowsの場合はRDPで接続。PWはEC2作成後にコンソール上に表示されるAdministratorのパスワード。
- 秘密鍵やパスワードの管理は必要。
- ローカルPCから接続するため、ローカルからEC2に対して直接ファイル転送が行える。
- EC2のSGにて、接続元IPからのSSH/RDPのインバウンド接続許可設定が必要。
- プライベートサブネット上のEC2の場合は、踏み台サーバーの構築・設定が必要。
それぞれの接続方法の使い分けについて
それぞれの使用方法について、下記のような使い分けになるかと思います。
- 構築中は踏み台サーバーなどを利用し、SSHやRDPでEC2に直接接続
- 構築完了後は、EC2InstanceConnectかSSMを利用
→コストを重視したい場合はEC2InstanceConnect、安定的に利用したいのであればSSMという住み分けになりそうです。 - EC2InstanceConnect/SSMでの接続が行えなくなった場合に備え、EC2シリアルコンソールを設定
→構築完了後、運用フェーズに入っても、「NWの設定変更を失敗しSSMでの接続が行えなくなってしまった」「OSのルーティング設定を変更したら通信が遮断された」といったトラブルが考えられます。そうした場合に備え、EC2シリアルコンソールは設定しておくことをお勧めします。
参考URL
■AWS Re:post
- What is the difference between EC2 Instance Connect and Session Manager SSH connections?
https://repost.aws/questions/QUnV4R9EoeSdW0GT3cKBUR7w/what-is-the-difference-between-ec2-instance-connect-and-session-manager-ssh-connections - What methods can I use to connect to my EC2 Linux instance?
https://repost.aws/knowledge-center/ec2-linux-connection-options
■個人の方ブログ
- Amazon EC2への接続方法を整理する
https://zenn.dev/fy0323/articles/7692ce242d22f6 - EC2 Instance Connect とAWS Systems Manager Session Manager の比較
※弊社メンバーの執筆したQiitaとなります。こちらもぜひご参照ください。
https://qiita.com/curlneko/items/67545292d8cc075c6480
それぞれの設定方法について
今回はEC2InstanceConnectとEC2シリアルコンソールの設定方法について、構築しながら確認していきます。
※セッションマネージャーとSSH接続については過去記事で設定方法をご紹介したため、こちらのページでは過去記事のリンクを掲載します。
EC2Instance Connect
構成の確認
現在、環境には10.0.0.0/21のVPCを立て、パブリックサブネット(10.0.0.0/24)とプライベートサブネット(10.0.2.0/24)上にそれぞれEC2を配置しています。
パブリックサブネット上のインスタンス・プライベートサブネット上のインスタンスについて、InstanceConnectでの接続方法を確認していきます。
パブリックサブネット上のインスタンスへのEC2InstanceConnect設定
事前準備(SGへのインバウンド接続設定の追加)
パブリックサブネット上のEC2に対してInstanceConnectを行う場合は、EC2のSGやNACLに対してEC2InstanceConnectのプレフィックスリストのインバウンド接続設定を追加しておく必要があります。
AWSコンソールにログインし、EC2の一覧を表示します。
対象のインスタンスのチェックボックスにチェックをいれ、詳細画面の「セキュリティ」タブに移動し、「セキュリティグループ」のリンクを押下します。
セキュリティグループの詳細画面が表示されます。
「インバウンドルール」のタブを表示し、「インバウンドのルールを編集」を押下します。
インバウンドルールの編集画面が表示されます。
「ルールを追加」を押下し、追加された枠に下記の情報を入力します。
| 項目 | 設定値 |
|---|---|
| タイプ | SSH |
| ソース | カスタム |
| ソースIP | 入力ボックスにcom.amazonaws.<リージョン名>.ec2-instance-connectを入力し、ヒットしたプレフィックスリストを選択 |
※東京リージョンの場合はソースIPは「com.amazonaws.ap-northeast-1.ec2-instance-connect」と入力するとプレフィックスリストが表示されます。
情報を入力したら、「ルールを保存」を押下します。
EC2InstanceConnectのインストール
AmazonLinux2023の場合は、InstanceConnectがプリインストールされています。
インスタンスにInstanceConnectがインストールされているかどうかを確認するには、下記コマンドを実行してみてください。
rpm -qa | grep ec2-instance-connect
下記のような形で返り値が表示されれば、既にEC2InstanceConnectはインストール済の状態です。
[ec2-user@ip-10-0-0-169 ~]$ rpm -qa | grep ec2-instance-connect
ec2-instance-connect-1.1-19.amzn2023.noarch
ec2-instance-connect-selinux-1.1-19.amzn2023.noarch
下記のバージョンよりも新しいLinux系AMIを使用している場合は、EC2InstanceConnectはプリインストール済の状態となっているようです。
- バージョン 2.0.20190618 より前の Amazon Linux 2 *
- AL2023 最小 AMI または Amazon ECS 最適化 AMI
- CentOS Stream 8 および 9
- 14.2.1 より前の MacOS Sonoma、13.6.3 より前の Ventura、12.7.2 より前の Monterey *
- Red Hat Enterprise Linux (RHEL) 8 および 9
- Ubuntu 16.04 および 18.04
参考:EC2InstanceConnectのインストール条件
EC2InstanceConnectが存在しない場合は、ユーザーガイドに従ってインストールを行ってください。
接続確認
SGへの設定・EC2InstanceConnectのインストール確認が完了したら、AWSコンソールからInstanceConnectにてEC2に接続してみます。
EC2の一覧から接続対象のインスタンスにチェックを入れ、「接続」を押下します。
接続画面が表示されます。
「パブリックIPを使用して接続」にチェックをいれ、ユーザー名を入力し、「接続」を押下します。
※Linux系の場合は、デフォルトだと「ec2-user」を利用します。
接続できることを確認します。
プライベートサブネット上のインスタンスへのEC2InstanceConnect設定
エンドポイント用のセキュリティグループ作成
プライベートサブネット上のEC2に対してInstanceConnectを行う場合は、EC2InstanceConnectのエンドポイントを作成する必要があります。
エンドポイントを作成する前に、エンドポイント用のセキュリティグループの作成から行います。
EC2のサービス画面から「セキュリティグループ」を選択し、「セキュリティグループの作成」を押下します。
セキュリティグループの作成画面が表示されます。
セキュリティグループ名・セキュリティグループの説明を入力します。
VPCは、接続先EC2が存在するVPCを指定します。
ユーザーガイドの下記記載の記載によると、InstanceConnectのエンドポイントへのトラフィックはSGのインバウンドルールに関係なく許可されるようです。そのため、インバウンドルールは何も設定しなくて大丈夫です。
エンドポイントへのトラフィックは EC2 Instance Connect エンドポイントサービスから送信され、エンドポイントセキュリティグループのインバウンドルールに関係なく許可されます。
アウトバウンドルールはデフォルトの状態(0.0.0.0で許可)のままとします。
制限をかける場合は、下記のような形で設定しましょう。
- 接続したいインスタンスのセキュリティグループのIDに対して、22番ポートを許可
- 接続したいインスタンスがあるVPCのCIDRに対して、22番ポートを許可
アウトバウンドルールを設定し、Nameタグの設定を行ったら、「セキュリティグループを作成」を押下します。
セキュリティグループが作成できたことを確認します。
これで、セキュリティグループの作成が完了しました。
EC2InstanceConnectエンドポイントの作成
EC2InstanceConnectのエンドポイントを作成します。
VPCのサービス画面から、「エンドポイント」を選択し、「エンドポイントを作成」を押下します。
エンドポイントの作成画面が表示されます。
名前タグを入力しまう。「タイプ」は「EC2インスタンス接続エンドポイント」を指定します。
ネットワーク設定を行います。
VPCは、接続対象のEC2があるVPCを選択します。
「クライアントIPの保持」について、チェックを入れると、EC2InstanceConnectを使用して接続する際の接続元IPが、接続元となるクライアントPCのIPアドレスとなるようです。
今回はクライアントIPの保持のチェックを入れます。不要な場合はオフにしてください。
セキュリティグループには、先ほど作成したセキュリティグループを指定します。
サブネットは、エンドポイントを配置したいプライベートサブネットを指定します。
Nameタグの設定を入力し、「エンドポイントの作成」を押下します。
これで、エンドポイントの作成が完了します。
EC2側のセキュリティグループ変更
EC2InstanceConnectで接続が行えるよう、EC2側のセキュリティグループを変更します。
接続対象のEC2のセキュリティグループを表示し、「インバウンドルールの編集」を押下します。
インバウンドルールの編集画面が表示されます。
「ルールを追加」を押下し、追加された枠に下記の情報を入力します。
| 項目 | 設定値 |
|---|---|
| タイプ | SSH |
| ソース | カスタム |
| ソースIP | EC2InstanceConnectエンドポイントのSGを指定 |
EC2側のインバウンドルールについては、下記いずれかの方針で設定してください。
- InstanceConnectエンドポイントのセキュリティグループIDを指定
→クライアントIPの保持設定にかかわらず対応可能。 - InstanceConnectエンドポイントを配置しているVPCのCIDR/サブネットのCIDRを指定
→InstanceConnectエンドポイントのIPは指定したサブネットのCIDRから割り振られるため、クライアントIPの保持設定を有効化していない場合はこれでも大丈夫です。 - InstanceConnectで接続予定のクライアントIPアドレスを許可
→クライアントIPの保持設定を有効化している場合は、接続元PCのパブリックIPなどを許可する形でも大丈夫です。
ルールが設定出来たら、「ルールを保存」を押下します。
EC2InstanceConnectのインストール
AmazonLinux2023の場合は、InstanceConnectがプリインストールされています。
インスタンスにInstanceConnectがインストールされているかどうかを確認するには、下記コマンドを実行してみてください。
rpm -qa | grep ec2-instance-connect
下記のような形で返り値が表示されれば、既にEC2InstanceConnectはインストール済の状態です。
[ec2-user@ip-10-0-0-169 ~]$ rpm -qa | grep ec2-instance-connect
ec2-instance-connect-1.1-19.amzn2023.noarch
ec2-instance-connect-selinux-1.1-19.amzn2023.noarch
※詳細は前項をご確認ください。
接続確認
SGへの設定・EC2InstanceConnectエンドポイントの作成・EC2InstanceConnectのインストール確認が完了したら、AWSコンソールからInstanceConnectにてEC2に接続してみます。
EC2の一覧から接続対象のインスタンスにチェックを入れ、「接続」を押下します。
接続画面が表示されます。
「プライベートIPを使用して接続」を選択します。
先程作成したEC2InstanceConnectエンドポイントを指定し、「接続」を押下します。
接続が行えることを確認します。
セッションマネージャー
セッションマネージャーでの設定方法はすでに過去記事でご紹介しているため、今回は概要を記載します。
下記のような設定を行うことで、SSM接続が可能となります。
- (EC2がプライベートサブネット上にある場合)VPCエンドポイントの作成
下記エンドポイントを作成
・ssm.region.amazonaws.com
・ssmmessages.region.amazonaws.com - EC2が存在するVPCでのDNSホスト名・DNS名前解決有効化
- EC2からSSMエンドポイントへの名前解決が行える状態にしておく
→DHCPオプションセットのネームサーバーをAmazonProvidedDNSやVPCPrivateHostedZoneのVPCエンドポイントIPにするか、VPC上からインターネットへの名前解決を行えるようにしておく。 - EC2に対するIAMロール設定を行う
→「AmazonSSMManagedInstanceCore」権限の付与
詳細は下記記事をご参照ください。
・CloudWatchAgentをインストールしてサーバーの監視を行う①(VPCエンドポイント作成)
・CloudWatchAgentをインストールしてサーバーの監視を行う②(EC2への権限追加・SSMによるEC2への接続)
SSHクライアント
SSHクライアントでの接続についても過去記事でご紹介しているため、今回は概要を記載します。
下記のような設定を行うことで、SSHクライアントでの接続が可能となります。
- EC2のSGへのインバウンド接続許可設定
→接続元のパブリックIPや踏み台サーバーからのSSH接続を許可 - (EC2がプライベートサブネット上にある場合)踏み台サーバーの作成
- 接続にはEC2作成時に指定したキーペアを使用
詳細は下記記事をご参照ください。
・AWSのパブリックサブネットに踏み台サーバーを構築し、プライベートサブネットのサーバーへSSHする②(踏み台Linuxサーバー構築)
・AWSのパブリックサブネットに踏み台サーバーを構築し、プライベートサブネットのサーバーへSSHする③(踏み台経由のSSH接続)
EC2シリアルコンソール
EC2シリアルコンソールは、利用できないインスタンスタイプがある(Nitro世代インスタンスと一部のベアメタルインスタンスでのみ使用可能)点にご注意ください。
EC2シリアルコンソールは、SGの許可設定やEC2に対するIAMロール設定を行わなくても使用可能です。
パブリックサブネット・プライベートサブネットどちらのEC2からも利用することが可能です。
ただし、事前に下記設定が必要となります。
- EC2管理画面からのシリアルコンソール接続有効化
- シリアルコンソール接続用のOSユーザーの作成
事前準備:EC2シリアルコンソール有効化
EC2シリアルコンソールの有効化設定を行います。
EC2のサービス画面から「管理」を選択します。
管理画面が表示されたら、「EC2シリアルコンソール」タブを表示し、「管理」を押下します。
管理画面が表示されます。
「許可」のチェックボックスにチェックをいれ、「更新」を押下します。
シリアルコンソール接続の許可設定が有効化されたことを確認します。
事前準備:接続用のユーザーを作成する
EC2シリアルコンソールを利用する場合は、OS側にシリアルコンソール用のユーザーを作成しておく必要があります。
SSmやInstanceConnect・クライアントからのSSH接続が行えない緊急時に使用することを考慮し、root権限のあるユーザーを作成しておきます。
EC2にログイン後、下記コマンドを実行していきます。
ユーザー追加
今回は「serial-user」というユーザーを作成しています。
sudo adduser serial-user
ユーザーが追加されたことを確認します。
sudo cat /etc/passwd
下記のような形でユーザー名が表示されたら作成成功です。
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/usr/sbin/nologin
systemd-oom:x:999:999:systemd Userspace OOM Killer:/:/usr/sbin/nologin
systemd-resolve:x:193:193:systemd Resolver:/:/usr/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/usr/share/empty.sshd:/sbin/nologin
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
libstoragemgmt:x:997:997:daemon account for libstoragemgmt:/:/usr/sbin/nologin
systemd-coredump:x:996:996:systemd Core Dumper:/:/usr/sbin/nologin
systemd-timesync:x:995:995:systemd Time Synchronization:/:/usr/sbin/nologin
chrony:x:994:994:chrony system user:/var/lib/chrony:/sbin/nologin
ec2-instance-connect:x:993:993::/home/ec2-instance-connect:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
ec2-user:x:1000:1000:EC2 Default User:/home/ec2-user:/bin/bash
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
ssm-user:x:1001:1001::/home/ssm-user:/bin/bash
serial-user:x:1002:1002::/home/serial-user:/bin/bash
パスワード変更
「serial-user」のパスワードを変更しておきます。
sudo passwd serial-user
パスワード入力を求められるので、パスワードを入力します。
Changing password for user serial-user.
New password:
BAD PASSWORD: The password fails the dictionary check - it does not contain enough DIFFERENT characters
Retype new password:
passwd: all authentication tokens updated successfully.
ユーザーをwheelグループへ追加
sudoコマンドが実行できるよう、serial-userをwheelグループへ追加しておきます。
sudo usermod -aG wheel serial-user
下記コマンドを実行し、ユーザーが追加されたことを確認します。
sudo getent group wheel
下記のような形で表示されたらOKです。
wheel:x:10:ec2-user,serial-user
sudoコマンドをパスワード入力無しで使えるようにユーザーを設定する
serial-userがsudoコマンド実行時に、都度パスワード入力を求められないようにしておきます。
sudoers.dにserial-userの設定ファイルを作成します。
sudo touch /etc/sudoers.d/serial-user
設定ファイルが作成されたことを確認します。
sudo ls -la /etc/sudoers.d/
下記のように表示されたらOKです。
total 28
drwxr-x---. 2 root root 75 Dec 18 04:05 .
drwxr-xr-x. 77 root root 16384 Dec 18 03:56 ..
-r--r-----. 1 root root 128 Dec 10 2024 90-cloud-init-users
-rw-r--r--. 1 root root 35 Dec 18 04:05 serial-user
-r--r-----. 1 root root 58 Jul 22 02:22 ssm-agent-users
設定ファイルを編集します。
sudo vi /etc/sudoers.d/serial-user
下記のように追記します。
serial-user ALL=(ALL) NOPASSWD:ALL
ユーザーの動作確認
ユーザーを切り替え、sudoコマンドが実行できることを確認します。
su serial-user
PWなしで実行できることを確認します。
sudo ls -la /etc/sudoers.d/
これで、OSユーザーの作成が完了しました。
シリアルコンソールでの接続確認
シリアルコンソールの有効化・OSユーザーの作成が完了したら、シリアルコンソールでの接続が行えるようになります。
EC2の一覧から接続対象のインスタンスにチェックを入れ、「接続」を押下します。
「EC2シリアルコンソール」のタブを表示し、「接続」を押下します。
最初は真っ黒な画面が表示されます。エンターキーを押下すると、パスワード入力を求められます。
正しいパスを入力しログインが完了すると、コマンドが実行できるようになります。
これで、今回ご紹介する手順は以上となります。ここまでお読みいただきありがとうございました。


























