AWS CLI SSMセッションマネージャーを使ったVPC内サーバー接続設計|踏み台不要の安全なアクセス経路

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOME > Linux技術 リナックスマスター.JP(Linuxマスター.JP) > AWS(Amazon Linux) > AWS CLI SSMセッションマネージャーを使ったVPC内サーバー接続設計|踏み台不要の安全なアクセス経路
「踏み台サーバーを廃止したいが、プライベートサブネットのEC2にどうやってCLIから接続するのか」と悩んでいるエンジニアは多いはずです。

AWS Systems Manager(SSM)のセッションマネージャーを使えば、aws ssm start-session コマンド1本でVPC内のEC2インスタンスへ安全に接続できます。ポート22のインバウンド開放もSSH鍵の配布も不要です。

この記事では、基本的な接続操作から、ポートフォワーディングによるRDS・Redis接続、SSH over SSMの設定、インターネット非公開環境でのVPCエンドポイント設計まで、CLIを中心とした実践手順を解説します。

この記事のポイント

・aws ssm start-sessionコマンドで踏み台なしにプライベートEC2へ接続できる
・ポートフォワーディングでプライベートサブネット内のRDS・Redisへも到達できる
・~/.ssh/configのProxyCommand設定でSSHワークフローをそのまま流用できる
・VPCエンドポイント3本でインターネット非公開のままSSMが動作する


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

なぜ踏み台サーバーが不要になるのか:SSMの仕組みを理解する

従来の踏み台(bastion)構成は、パブリックサブネットに専用のEC2を1台立て、そこをホップしてプライベートEC2に接続する設計です。管理コスト・鍵管理・ポート開放の問題を抱えています。

SSMセッションマネージャーは、EC2インスタンス上のSSM AgentがアウトバウンドHTTPS(443番)でSSMエンドポイントと通信することで、接続チャネルを確立します。インバウンドのSSH(22番)ポートを一切開ける必要がありません。

接続の流れは次のとおりです。

・①:ローカルPCで aws ssm start-session を実行
・②:AWS CLIがSSMエンドポイントへHTTPSで接続
・③:SSMがEC2上のSSM Agentと暗号化チャネルを確立
・④:ローカルPCのターミナルがEC2のbashセッションへ接続

このアーキテクチャにより、セキュリティグループのインバウンドルールから22番ポートの許可を完全に削除できます。

前提設定:IAMロールとSSM Agentの確認

1. EC2インスタンスプロファイルにポリシーを付与する

EC2インスタンスに付与しているIAMロールに AmazonSSMManagedInstanceCore ポリシーが含まれていることを確認します。

# インスタンスに付与されているIAMロールを確認する aws ec2 describe-instances --instance-ids i-0123456789abcdef0 --query "Reservations[0].Instances[0].IamInstanceProfile.Arn" --output text arn:aws:iam::123456789012:instance-profile/ssm-managed-role # ロールに付与されているポリシーを確認する aws iam list-attached-role-policies --role-name ssm-managed-role --query "AttachedPolicies[*].PolicyName" --output table -------------------------------------------- | ListAttachedRolePolicies | +------------------------------------------+ | AmazonSSMManagedInstanceCore | +------------------------------------------+

AmazonSSMManagedInstanceCore が含まれていれば、SSMからの接続を受け付ける準備が整っています。

2. SSM管理対象インスタンスとして登録されていることを確認する

接続前に対象インスタンスがSSMで「Online」になっているか確認します。

# SSM管理対象インスタンスの状態を一覧表示する aws ssm describe-instance-information --query "InstanceInformationList[*].[InstanceId,PingStatus,PlatformName,AgentVersion]" --output table ------------------------------------------------------------------------------------- | DescribeInstanceInformation | +---------------------+---------+---------------------------+---------------------+ | i-0123456789abcdef0 | Online | Amazon Linux 2023 | 3.3.987.0 | | i-0abcdef123456789 | Online | Red Hat Enterprise Linux 9 | 3.3.987.0 | +---------------------+---------+---------------------------+---------------------+

PingStatus が Online であれば接続可能です。Offline の場合はEC2上でSSM Agentの状態を確認してください。

# EC2上でSSM Agentのステータスを確認する(コンソールアクセスが可能な場合) sudo systemctl status amazon-ssm-agent * amazon-ssm-agent.service - amazon-ssm-agent Loaded: loaded (/usr/lib/systemd/system/amazon-ssm-agent.service; enabled) Active: active (running) since Thu 2026-10-09 10:15:43 UTC; 1h 23min ago

aws ssm start-sessionでEC2へ接続する

ローカルPCにSession Manager Plugin(ターミナルとSSMのブリッジとなるバイナリ)がインストールされていれば、次のコマンドでセッションを開始できます。

# Session Manager Pluginのバージョン確認 session-manager-plugin --version 1.2.553.0 # EC2インスタンスへ接続する(インスタンスIDを指定) aws ssm start-session --target i-0123456789abcdef0

実行すると対話シェルが起動します(RHEL9 / Amazon Linux 2023 環境での実行例)。

Starting session with SessionId: tomohiro.miyazaki-0ab1c2d3e4f5a6b7c sh-5.2$ whoami ssm-user sh-5.2$ hostname ip-10-0-1-55 sh-5.2$ sudo -i [root@ip-10-0-1-55 ~]# id uid=0(root) gid=0(root) groups=0(root) [root@ip-10-0-1-55 ~]# exit sh-5.2$ exit exit Exiting session with sessionId: tomohiro.miyazaki-0ab1c2d3e4f5a6b7c.

デフォルトのログインユーザーは ssm-user です。sudo -i でrootに昇格できるので、管理操作に支障はありません。

接続先のリージョンを明示したい場合は --region オプションを使います。

# リージョンを明示して東京リージョンのインスタンスへ接続する aws ssm start-session --target i-0123456789abcdef0 --region ap-northeast-1

ポートフォワーディング:プライベートサブネット内のRDS・Redisへ接続する

SSMのポートフォワーディングを使うと、プライベートサブネット内のRDSやElastiCache(Redis)に、ローカルPCのMySQLクライアントやredis-cliから直接接続できます。

設計のポイントは「EC2をトンネルの出口として使う」ことです。EC2インスタンスから見てアクセス可能なエンドポイントであれば、SSMトンネル経由でローカルPCからも到達できます。

1. EC2を経由してRDSへポートフォワーディングする

# ローカルの13306番ポート → EC2経由でRDSの3306番ポートへ転送する aws ssm start-session --target i-0123456789abcdef0 --document-name AWS-StartPortForwardingSessionToRemoteHost --parameters '{ "host":["mydb.cluster-abcdef123456.ap-northeast-1.rds.amazonaws.com"], "portNumber":["3306"], "localPortNumber":["13306"] }'

実行後の出力例:

Starting session with SessionId: tomohiro.miyazaki-0ab1c2d3e4f5a6b7c Port 13306 opened for sessionId tomohiro.miyazaki-0ab1c2d3e4f5a6b7c. Waiting for connections... Connection accepted for session tomohiro.miyazaki-0ab1c2d3e4f5a6b7c

このコマンドを実行したまま別のターミナルを開き、ローカルの13306番へ接続します。

# 別のターミナルでMySQLクライアントから接続する mysql -h 127.0.0.1 -P 13306 -u admin -p Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 4421 Server version: 8.0.35 Source distribution

2. EC2インスタンス自身のポートへフォワーディングする

EC2上で動いているWebアプリやAPIサーバーへローカルから確認したい場合は、AWS-StartPortForwardingSession ドキュメントを使います。

# EC2の8080番ポートをローカルの18080番に転送する aws ssm start-session --target i-0123456789abcdef0 --document-name AWS-StartPortForwardingSession --parameters '{"portNumber":["8080"],"localPortNumber":["18080"]}'

SSH over SSM:~/.ssh/configの設定で既存のSSHワークフローを使う

sftpコマンドでのファイル転送や、Visual Studio CodeのRemote SSH拡張機能など、既存のSSHベースのワークフローを使いたい場面では、SSMをSSHのプロキシとして利用する設定が有効です。

1. ~/.ssh/configにProxyCommandを追加する

# ~/.ssh/config に以下を追記する Host i-* mi-* User ec2-user IdentityFile ~/.ssh/my-ec2-key.pem ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"

2. SSHコマンドで接続を確認する

設定後は、インスタンスIDをホスト名として通常のSSHコマンドで接続できます。

# インスタンスIDをホスト名に指定してSSH接続する ssh i-0123456789abcdef0 Last login: Thu Oct 9 10:30:22 2026 from 127.0.0.1 __| __|_ ) _| ( / Amazon Linux 2023 ___|\__|___| https://aws.amazon.com/linux/amazon-linux-2023 [ec2-user@ip-10-0-1-55 ~]$

注意点として、SSH over SSMでもEC2側の authorized_keys に公開鍵が登録されている必要があります。SSMはトンネルを提供しますが、SSH認証はSSHプロトコル自身が行うためです。

AWSのVPC設計とSSMを組み合わせたサーバー構築の実践については、LinuxMaster.JPのAWS・Amazon Linux実践ガイドでも体系的に解説しています。

VPCエンドポイントの設定:インターネット非公開環境での接続設計

EC2インスタンスがNATゲートウェイのないプライベートサブネットに配置されている場合、SSM Agentがパブリックエンドポイントへアウトバウンド通信できません。この場合、VPCエンドポイント(AWS PrivateLink)を3本作成します。

・com.amazonaws.ap-northeast-1.ssm:SSMサービスとの通信
・com.amazonaws.ap-northeast-1.ssmmessages:セッションチャネルの確立
・com.amazonaws.ap-northeast-1.ec2messages:Run Commandとの通信

CLIで3本を一括作成するスクリプト例:

REGION="ap-northeast-1" VPC_ID="vpc-0abc1234def56789" SUBNET_ID="subnet-0abc1234def56789" SG_ID="sg-0abc1234def56789" for SERVICE in ssm ssmmessages ec2messages; do aws ec2 create-vpc-endpoint --vpc-id --service-name com.amazonaws.. --vpc-endpoint-type Interface --subnet-ids --security-group-ids --private-dns-enabled --region echo " endpoint created" done ssm endpoint created ssmmessages endpoint created ec2messages endpoint created

エンドポイント用セキュリティグループには、プライベートサブネットのCIDR(例: 10.0.0.0/16)からTCP 443番のインバウンドを許可してください。

# エンドポイント用SGにVPC CIDRからのTCP 443番を許可する aws ec2 authorize-security-group-ingress --group-id --protocol tcp --port 443 --cidr 10.0.0.0/16

トラブルシュート:接続できない場合の確認手順

「TargetNotConnected」エラーが出た場合

# エラーメッセージの例 An error occurred (TargetNotConnected) when calling the StartSession operation: i-0123456789abcdef0 is not connected.

確認手順:

・ステップ1:aws ssm describe-instance-information でインスタンスが Online かを確認する
・ステップ2:EC2のIAMロールに AmazonSSMManagedInstanceCore が付与されているかを確認する
・ステップ3:EC2上で sudo systemctl status amazon-ssm-agent を実行してSSM Agentが起動しているかを確認する
・ステップ4:EC2のセキュリティグループでアウトバウンドTCP 443番が許可されているかを確認する(NATゲートウェイまたはVPCエンドポイントへの経路も確認)

「Session Manager plugin not found」エラーが出た場合

ローカルPCにSession Manager Pluginがインストールされていません。

# Amazon Linux 2023 / RHEL9系でのSession Manager Pluginインストール curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/linux_64bit/session-manager-plugin.rpm" -o /tmp/session-manager-plugin.rpm sudo dnf install -y /tmp/session-manager-plugin.rpm # バージョン確認 session-manager-plugin --version 1.2.553.0

ポートフォワーディングのセッションが突然切れる場合

SSMセッションのアイドルタイムアウト(デフォルト20分)が原因の場合があります。長時間のフォワーディングが必要なときは、AWSマネジメントコンソールの「Systems Manager」→「セッションマネージャー」→「設定」でアイドルセッションのタイムアウト時間を延長してください。

本記事のまとめ

やりたいこと コマンド・設定
EC2へ対話シェルで接続する aws ssm start-session --target i-xxxxxxxxx
プライベートRDS・Redisへ接続する aws ssm start-session --document-name AWS-StartPortForwardingSessionToRemoteHost --parameters '{"host":["エンドポイント"],"portNumber":["3306"],"localPortNumber":["13306"]}'
EC2自身のポートをフォワードする aws ssm start-session --document-name AWS-StartPortForwardingSession --parameters '{"portNumber":["8080"],"localPortNumber":["18080"]}'
SSHコマンドをそのまま使う ~/.ssh/config に ProxyCommand を設定し ssh i-xxxxxxxx で接続
インターネット非公開環境で使う ssm / ssmmessages / ec2messages のVPCエンドポイント(PrivateLink)を3本作成する
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、VPC設計からSSM運用まで体系的に学べるAWS・Amazon Linux実践ガイドをご活用ください。踏み台不要のセキュアな設計を、ハンズオンで習得できます。

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

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

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

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

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

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

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

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

この記事を書いた人

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

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

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