はじめに
AWSのインフラ設計において、プライベートサブネット内にあるEC2インスタンスへのセキュアなアクセス経路の確保は、常に重要な課題です。従来は「踏み台サーバー(Bastion Host)」をパブリックサブネットに構築してSSH接続する手法が一般的でした。しかし、踏み台サーバーは運用コストがかかるだけでなく、セキュリティホールになるリスクも抱えています。
本記事では、踏み台サーバーを完全に不要にし、IAMによるアクセス制御と操作ログの取得を可能にする「AWS Systems Manager(SSM)セッションマネージャー」の導入手順を、初心者から中級者向けにステップバイステップで解説します。
前提知識/必要な理由
踏み台サーバーを廃止すべき理由
- 管理コストの削減: 踏み台サーバー自体のOSアップデートやパッチ適用、鍵管理が不要になります。
- セキュリティの向上: インバウンド(外からの受信)ポートとしてSSH(22番)を開放する必要がなくなります。また、IAMポリシーを用いて「誰が」「どのインスタンスに」接続できるかを厳密に制御できます。
- 監査ログの自動取得: セッションマネージャーを経由した操作ログは、Amazon CloudWatch LogsやS3バケットに自動的に保存・管理できます。
接続の仕組み
セッションマネージャーは、EC2インスタンス内で動作する「SSM Agent」が、AWSのSSMエンドポイントに対してアウトバウンド(外向き)のHTTPS(443番)通信を行うことで双方向接続を確立します。したがって、対象のEC2インスタンスがインターネット(またはVPCエンドポイント経由でSSM)にアウトバウンド通信できる環境が必要です。
具体的な設定手順・設計方法
今回は、プライベートサブネットに配置されたAmazon Linux 2023のEC2インスタンスに、ローカルPCのAWS CLIからセッションマネージャーで接続するための設定手順を解説します。
ステップ1:EC2用IAMロールの作成とアタッチ
EC2インスタンスがSSMサービスと通信できるように、適切なIAMロールを付与します。
- IAMコンソールを開き、[ロールの作成] を選択します。
- 信頼されたエンティティタイプで [AWSのサービス]、ユースケースで [EC2] を選択します。
- 許可ポリシーの検索窓に
AmazonSSMManagedInstanceCoreと入力し、チェックを入れて選択します。 - ロール名(例:
EC2-SSM-Access-Role)を入力し、ロールを作成します。 - EC2コンソールに移動し、対象のインスタンスを選択して、[アクション] -> [セキュリティ] -> [IAMロールを変更] から作成したロールをアタッチします。
ステップ2:VPCエンドポイントの設定(プライベートサブネットの場合)
対象のEC2がインターネットへのルートを持たない完全なプライベートサブネットにある場合、VPC内からSSMへアクセスするためのVPCエンドポイント(インターフェイス型)を作成する必要があります。※NATゲートウェイ経由でインターネットに抜けられる場合は本手順は不要です。
以下の3つのエンドポイントを、EC2が所属するVPCとサブネットに対して作成します。セキュリティグループのインバウンドルールでは、EC2からのHTTPS(443番)通信を許可してください。
com.amazonaws.[リージョン名].ssmcom.amazonaws.[リージョン名].ssmmessagescom.amazonaws.[リージョン名].ec2messages
ステップ3:ローカルPCへのSession Managerプラグインの導入
ローカルPCのAWS CLIからセッションマネージャーを使用するには、拡張用の「Session Managerプラグイン」をインストールする必要があります。
macOSでのインストール手順
# プラグインのダウンロードとインストール
curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/mac/session-manager-plugin.pkg" -o "session-manager-plugin.pkg"
sudo installer -pkg session-manager-plugin.pkg -target /
# インストールの確認
session-manager-plugin --version
Windows (PowerShell) でのインストール手順
# インストーラーのダウンロードと実行
Invoke-WebRequest "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/windows/SessionManagerPluginSetup.exe" -OutFile "SessionManagerPluginSetup.exe"
Start-Process -FilePath ".\SessionManagerPluginSetup.exe" -ArgumentList "/S" -Wait
# インストールの確認
session-manager-plugin --version
ステップ4:接続の検証
ローカルPCのターミナルまたはコマンドプロンプトから、以下のAWS CLIコマンドを実行してEC2に接続します。
# [Instance-ID]の部分を接続対象のEC2インスタンスID(例: i-0123456789abcdef0)に置き換えてください
aws ssm start-session --target [Instance-ID]
接続に成功すると、EC2のシェル(ssm-user)が起動し、コマンド操作が可能になります。セッションを終了するには exit コマンドを実行します。
実務での注意点
1. SSM Agentの起動ステータス確認
Amazon Linux 2やAmazon Linux 2023、Ubuntu 18.04 LTS以降などの主要なAMIにはSSM Agentがプリインストールされています。しかし、独自のカスタムAMIを使用している場合や何らかの理由でエージェントが停止している場合は接続できません。接続できない場合は、以下のコマンドで起動ステータスを確認してください。
sudo systemctl status amazon-ssm-agent
2. ログ保存先(S3/CloudWatch)の設定
実務では、運用の透明性とセキュリティ監査のため、操作ログの出力を必須とすることが推奨されます。AWS Systems Managerのコンソールにある「セッションマネージャー」の「設定」タブから、ログの送信先(Amazon S3バケットまたはCloudWatch Logs)を設定できます。この際、EC2のIAMロールにS3への書き込み権限(s3:PutObject)やCloudWatchへのログ送信権限を事前に追加しておく必要があります。
3. プライベートDNSの有効化
ステップ2でVPCエンドポイントを作成する際、VPC設定の「DNS解決」および「DNSホスト名」を有効にし、エンドポイントの作成時に「プライベートDNS名を有効にする」のチェックがオンになっていることを確認してください。これが無効になっていると、EC2インスタンスがSSMのパブリックIPを解決しようとして接続エラーになります。
まとめ
SSMセッションマネージャーを導入することで、踏み台サーバーの維持管理コストやセキュリティリスクを大幅に削減できます。インフラエンジニアとしては、単に接続環境を作るだけでなく、CloudWatch Logsとの連携による「オペレーションの可視化」まで設計・提案できるようになることで、実務での信頼性がより一層高まります。ぜひ本手順を参考に、セキュアなAWS運用の第一歩を踏み出してください。