Amazon EC2 Instance Connect Endpoint(EICE)でプライベートサブネットのEC2にSSHする方法|踏み台なし・VPNなしのセキュアVPCアクセス設計

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOME > Linux技術 リナックスマスター.JP(Linuxマスター.JP) > AWS(Amazon Linux) > Amazon EC2 Instance Connect Endpoint(EICE)でプライベートサブネットのEC2にSSHする方法|踏み台なし・VPNなしのセキュアVPCアクセス設計
「プライベートサブネットに置いたEC2に、踏み台サーバーを通らないとSSHできない」
そんな運用上の面倒を抱えているエンジニアは多いはずだ。踏み台EC2は常時稼働させるとコストがかかり、停止するたびに接続が止まる。VPNを引けば解決するが、設定が複雑で証明書管理の手間も生まれる。

この記事では、2023年にAWSが提供を開始したEC2 Instance Connect Endpoint(EICE)を使って、踏み台もVPNも使わずにプライベートサブネットのEC2へ直接SSH接続する手順を解説する。Amazon Linux 2023 / RHEL 9.4環境で動作確認済み。IAMポリシーによるアクセス制御や、セキュリティグループの最小権限設計まで網羅する。

この記事のポイント

・EICEはVPCに作成するエンドポイントで踏み台・VPN不要のSSH接続を実現できる
・aws ec2-instance-connect open-tunnel をSSH ProxyCommandに指定するだけで導入できる
・接続の認可はIAMポリシーで制御し、EC2にSSMエージェントのインストールは不要
・セキュリティグループでEC2へのSSHをEICEのみに制限して最小権限を設計する


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

EC2 Instance Connect Endpoint(EICE)とは何か|踏み台ゼロのセキュアVPCアクセスの仕組み

従来、プライベートサブネットのEC2へのSSHアクセスは次の2つが主流だった。

・踏み台サーバー(Bastion Host): パブリックサブネットにEC2を常時起動し、そこを経由してプライベートEC2へホップする方式
・VPN接続: AWS Site-to-Site VPNまたはClient VPNでオフィスネットワークとVPCを専用線化する方式

EICEは、VPC内の特定サブネットに「エンドポイント」を作成することで、インターネット越しにプライベートIPのEC2へ直接SSHトンネルを確立できる仕組みだ。EC2にパブリックIPは不要で、SSMエージェントのインストールも必要ない。接続の流れを整理すると次のとおりだ。

・開発者のPCで aws ec2-instance-connect open-tunnel コマンドを実行する
・AWSのIAMがポリシーを評価し、認可が通るとWebSocketトンネルを確立する
・SSHクライアントがそのトンネル経由でEC2のプライベートIPへ接続する

EICEの特長は「誰がどのEC2に接続できるか」をIAMポリシーで細かく制御できる点だ。SSHキーの管理は引き続き必要だが、接続経路の認可をAWSの認証基盤に一本化できる。本番運用ではEICEのセキュリティグループとEC2のセキュリティグループを組み合わせた2層防御が設計の基本になる。

EICEを使う前の準備|VPCとEC2インスタンスの要件確認

1. 対応リージョンとEC2の最低要件

EICEは2026年10月時点で東京リージョン(ap-northeast-1)を含む全主要リージョンで利用可能だ。EC2側の要件は最小限で、専用エージェントのインストールは不要だ。

・EC2インスタンスが running 状態であること
・EC2のセキュリティグループがEICEエンドポイントからのSSH(ポート22)を受け入れるインバウンドルールを持つこと
・EICEを作成するサブネットとEC2のサブネットが同じVPC内にあること(クロスVPCは不可)

2. 接続ユーザーに必要なIAMポリシーの確認

EICEを使うユーザーまたはIAMロールには、次の2つのアクションが必要だ。

・ec2-instance-connect:OpenTunnel: EICEを通じてトンネルを開く権限
・ec2-instance-connect:SendSSHPublicKey: 一時SSH公開鍵を対象EC2に送信する権限
・ec2:DescribeInstances / ec2:DescribeInstanceConnectEndpoints: エンドポイントとインスタンスの情報を取得する読み取り権限

最小権限ポリシーの例を示す。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ec2-instance-connect:OpenTunnel", "Resource": "arn:aws:ec2:ap-northeast-1:123456789012:instance-connect-endpoint/eice-xxxxxxxxxxxxxxxxx" }, { "Effect": "Allow", "Action": "ec2-instance-connect:SendSSHPublicKey", "Resource": "arn:aws:ec2:ap-northeast-1:123456789012:instance/i-xxxxxxxxxxxxxxxxx" }, { "Effect": "Allow", "Action": [ "ec2:DescribeInstances", "ec2:DescribeInstanceConnectEndpoints" ], "Resource": "*" } ] }

注意: `Resource` にワイルドカード(`*`)を使うとVPC内の全EC2への接続を許可してしまう。本番環境では接続対象のインスタンスARNを明示的に指定し、最小権限の原則(Least Privilege)を徹底すること。

EICEエンドポイントの作成手順

1. aws ec2 create-instance-connect-endpointコマンドで作成する

EICEはVPC内の1サブネットに1つ作成できる。作成したEICEは同じVPC内のどのEC2へも接続の起点として使える(1:N設計)。プライベートサブネットへの作成が推奨だ。

# EICEに適用するセキュリティグループを作成する(EICEからEC2へのアウトバウンドSSHを許可) aws ec2 create-security-group --group-name eice-sg --description "Security group for EICE endpoint" --vpc-id vpc-xxxxxxxxxxxxxxxxx # EICEエンドポイントを作成する(プライベートサブネットを指定) aws ec2 create-instance-connect-endpoint --subnet-id subnet-xxxxxxxxxxxxxxxxx --security-group-ids sg-xxxxxxxxxxxxxxxxx --preserve-client-ip false

`--preserve-client-ip false`(デフォルト)では接続元IPがEICEのIPに変換される。社内の固定IPアドレスからのみ接続を許可する場合は `--preserve-client-ip true` を指定すると実際のクライアントIPがEC2のセキュリティグループに届く。

2. エンドポイントの状態を確認する

作成直後は `create-in-progress` だ。`create-complete` になるまで数分かかる。

aws ec2 describe-instance-connect-endpoints --query 'InstanceConnectEndpoints[*].{ID:InstanceConnectEndpointId,State:State,Subnet:SubnetId}' --output table # 出力例(create-completeになれば利用可能) ------------------------------------------------------------------------------------------ | DescribeInstanceConnectEndpoints | +--------------------------------+-----------------+---------------------------------+ | ID | State | Subnet | +--------------------------------+-----------------+---------------------------------+ | eice-0a1b2c3d4e5f6g7h8 | create-complete| subnet-xxxxxxxxxxxxxxxxx | +--------------------------------+-----------------+---------------------------------+

プライベートサブネットのEC2にSSH接続する

1. コマンドラインでProxyCommandを指定して接続する

EICEが `create-complete` になれば、次のコマンドでプライベートEC2に直接SSH接続できる。パブリックIPは不要で、プライベートIPアドレスで接続する点が特長だ。

ssh -i ~/.ssh/my-key.pem -o ProxyCommand='aws ec2-instance-connect open-tunnel --instance-id i-xxxxxxxxxxxxxxxxx --remote-port 22 --region ap-northeast-1' ec2-user@i-xxxxxxxxxxxxxxxxx

2. ~/.ssh/configにEICE接続設定を登録する

毎回オプションを手打ちするのは実務上の運用コストが高い。接続先ごとに `~/.ssh/config` へ登録しておくと `ssh private-ec2` の1コマンドで接続できる。

Host private-ec2 HostName i-xxxxxxxxxxxxxxxxx User ec2-user IdentityFile ~/.ssh/my-key.pem ProxyCommand aws ec2-instance-connect open-tunnel --instance-id %h --remote-port %p --region ap-northeast-1

3. 実際の接続確認と出力例

実際にEICE経由で接続した際の出力例を示す。踏み台サーバーを経由せずにプライベートIPのEC2へ直接到達できていることを確認できる。

# eice経由でのSSH接続実行(踏み台サーバーなし) $ ssh private-ec2 # 接続後のホスト情報確認(プライベートIPで到達していることを確認) [ec2-user@ip-10-0-1-45 ~]$ hostname -I 10.0.1.45 [ec2-user@ip-10-0-1-45 ~]$ curl -s http://169.254.169.254/latest/meta-data/instance-id i-xxxxxxxxxxxxxxxxx [ec2-user@ip-10-0-1-45 ~]$ ip route default via 10.0.1.1 dev eth0 10.0.1.0/24 dev eth0 proto kernel scope link src 10.0.1.45

インターネット上の踏み台サーバーは一切経由せず、AWS内部のEICEトンネルのみを通じてプライベートIPに直接到達している。SCP/SFTP転送もこの設定で透過的に動作する。

EICEを使ったAWSアーキテクチャの設計パターンを体系的に学びたい方は、上級者向けAWSセミナーでハンズオン形式で習得できる。

EICEのセキュリティ設計|セキュリティグループとIAMポリシーで最小権限を実現する

EICEを導入した後のセキュリティグループ設計が運用の品質を左右する。ポイントは「EC2のインバウンドSSHをEICEからのみ受け入れる」構成にすることだ。

【重要】 `--preserve-client-ip false`(デフォルト)では、EC2からみるとEICEがVPC内のIPで接続してくる。このため、EC2のセキュリティグループのインバウンドルールはEICEのセキュリティグループを送信元に指定する方式が最も絞り込みやすい。

# EC2のセキュリティグループにEICEのSGをSSH送信元として追加する # (EC2のSGがsg-ec2-xxxx、EICEのSGがsg-eice-xxxxの場合) aws ec2 authorize-security-group-ingress --group-id sg-ec2-xxxx --protocol tcp --port 22 --source-group sg-eice-xxxx # 設定後の確認 aws ec2 describe-security-groups --group-ids sg-ec2-xxxx --query 'SecurityGroups[0].IpPermissions'

この設定により、EC2への直接のSSH接続(公開IP経由・社内VPN経由を含む)をすべて遮断し、EICEトンネルのみを受け付ける設計が完成する。セキュリティグループの設定確認に Linux ポート確認の全コマンド も合わせて参照するとよい。

VPC Flow Logsと組み合わせれば、「誰が・いつ・どのEC2に接続したか」をCloudWatch Logsで追跡でき、監査要件にも対応しやすくなる。

EC2 Instance ConnectとSession Manager・VPNとの比較

3つのアクセス方式を現場での選択基準とともに整理する。

方式 エージェント要否 SSHキー SCP/SFTP 主な用途
EICE 不要 必要 対応 SSHベース運用の現場で踏み台を廃止したい場合
Session Manager(SSM) 必要(SSM Agent) 不要 要設定 SSHキー管理を完全になくしたい場合。WindowsのRDP接続
踏み台サーバー 不要 必要 対応 旧来の構成。コストと管理コストがかかる
Client VPN VPNクライアント 必要 対応 VPC全体への常時アクセスが必要な場合
EICEはSSHの既存ワークフローをそのまま活かせる点が強みだ。SCPによるファイル転送や、SSH ProxyJumpを使った多段接続もEICE上で動作する。一方、EC2にSSMエージェントが既に入っている環境でSSHキー管理を完全になくしたい場合はSession Managerが適している。実際の本番運用ではEICEとSession Managerを「踏み台の代替としてのEICE」「緊急アクセスのためのSession Manager」と組み合わせるケースが多い。

「Unable to establish a tunnel connection」が出た時のトラブルシュート

1. IAMポリシー不足を確認する

最も多い原因はIAMポリシーの欠落だ。エラーメッセージに `UnauthorizedOperation` や `AccessDenied` が含まれる場合はポリシーを確認する。

# 現在のユーザーに付与されているポリシーを確認 aws iam list-attached-user-policies --user-name your-username # EICEアクションが許可されているか模擬チェック(iam:SimulatePrincipalPolicy権限が必要) aws iam simulate-principal-policy --policy-source-arn arn:aws:iam::123456789012:user/your-username --action-names "ec2-instance-connect:OpenTunnel" --resource-arns "arn:aws:ec2:ap-northeast-1:123456789012:instance-connect-endpoint/*"

2. EC2のセキュリティグループのインバウンドルールを確認する

EICEからEC2へのSSHポート22が許可されていない場合も接続が止まる。EC2のセキュリティグループのインバウンドルールに、EICEのセキュリティグループIDを送信元としたTCP/22の許可が設定されているか確認する。

# EC2のセキュリティグループのインバウンドルールを確認する aws ec2 describe-security-groups --group-ids sg-ec2-xxxx --query 'SecurityGroups[0].IpPermissions[?FromPort==`22`]'

3. EICEの状態が create-complete でないケース

作成直後にアクセスしようとすると `create-in-progress` のまま使えない場合がある。1サブネットに1つしかEICEを作成できないため、同じサブネットに既存のEICEがある場合は `create-failed` になる。

# EICEの状態と数を確認する aws ec2 describe-instance-connect-endpoints --query 'InstanceConnectEndpoints[*].{ID:InstanceConnectEndpointId,State:State,Subnet:SubnetId}' --output table # 不要なEICEを削除する(create-failed状態のものを含む) aws ec2 delete-instance-connect-endpoint --instance-connect-endpoint-id eice-xxxxxxxxxxxxxxxxx

本記事のまとめ

EC2 Instance Connect Endpoint(EICE)を使えば、踏み台サーバーもVPNも使わずにプライベートサブネットのEC2へSSH接続できる。IAMポリシーで接続の認可を制御するため、SSHキー管理は残りつつも接続経路のアクセス制御がAWSの認証基盤に集約される。

やりたいこと コマンド・設定
EICEエンドポイントを作成する aws ec2 create-instance-connect-endpoint --subnet-id subnet-xxx
エンドポイントの状態を確認する aws ec2 describe-instance-connect-endpoints --output table
EICE経由でSSH接続する ssh -o ProxyCommand='aws ec2-instance-connect open-tunnel --instance-id i-xxx' ec2-user@i-xxx
EC2のSGでEICEからのSSHのみ許可する aws ec2 authorize-security-group-ingress --source-group sg-eice-xxx --port 22
EICEを削除する aws ec2 delete-instance-connect-endpoint --instance-connect-endpoint-id eice-xxx
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、AWSのVPCアクセス設計をはじめとしたLinuxサーバー運用の実践スキルを、図解60ページのマニュアルと無料メルマガで提供しています。まずは無料でお試しください。
>> Linuxサーバー構築入門マニュアル(無料PDF)を受け取る

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。