Systems Manager Session Manager ハンズオン

SSH キー・踏み台サーバー・ポート開放なしで EC2 にセキュアに接続する

AWS Systems Manager Session Manager Amazon EC2 IAM マネコン操作 入門 所要時間 30〜45 分 v1.0

📋 概要

このハンズオンでは、AWS Systems Manager の Session Manager を使い、SSH キーペアや踏み台(bastion)サーバー、インバウンドポートの開放を一切せずに EC2 インスタンスへ接続します。IAM ロールと SSM エージェントだけで完結する、セキュアでモダンな接続方法を学びます。接続ログの記録やポートフォワードも体験します。

項目内容
所要時間30〜45 分
難易度入門
主要サービスSystems Manager(Session Manager)、EC2、IAM
前提リソース稼働中の EC2 インスタンス(Amazon Linux 2023 推奨)
課金目安Session Manager 自体は無料。EC2 の稼働料金のみ

従来の SSH 接続との比較

項目SSH 接続Session Manager
キーペア必要(.pem 管理)不要
インバウンドポート 22開放が必要不要(閉じたまま)
踏み台サーバープライベート接続に必要不要
接続記録別途設定が必要S3 / CloudWatch Logs に記録可能
アクセス制御SSH キー + SGIAM ポリシーで一元管理

🏗️ 構成図

👤 管理者(ブラウザ / AWS CLI)
↓ IAM 認証で接続要求
🔧 AWS Systems Manager(Session Manager)
↓ SSM エージェント経由(アウトバウンド HTTPS のみ)
🖥️ EC2 インスタンス
IAM ロール: AmazonSSMManagedInstanceCore / SSM エージェント稼働
インバウンドポート 22 は閉じたまま
ℹ️ なぜポートを開けずに接続できるのか

EC2 内の SSM エージェントが Systems Manager に対してアウトバウンドで接続を確立します。管理者はその確立済みチャネル経由でセッションを張るため、インバウンドポートを開ける必要がありません。プライベートサブネットの EC2 にも(NAT または VPC エンドポイント経由で)接続できます。

✅ 前提条件

ℹ️ SSM エージェントについて

Amazon Linux 2/2023、Ubuntu、Windows Server の AWS 公式 AMI には SSM エージェントがプリインストールされています。古い AMI やカスタム AMI では手動インストールが必要な場合があります。

🔧 ステップ 1: EC2 用 IAM ロールの作成

EC2 が Systems Manager と通信するための IAM ロールを作成します。

手順
  1. IAM コンソール → 「ロール」→「ロールを作成」
  2. 信頼されたエンティティタイプ: 「AWS のサービス」
  3. ユースケース: 「EC2」 → 「次へ」
  4. 許可ポリシーで AmazonSSMManagedInstanceCore を検索してチェック → 「次へ」
  5. ロール名: handson-ec2-ssm-role
  6. 「ロールを作成」
ℹ️ AmazonSSMManagedInstanceCore とは

AWS マネージドポリシーで、EC2 が Systems Manager に登録され Session Manager・Run Command などのコア機能を使うために必要な最小権限がまとまっています。これ 1 つで Session Manager 接続が可能になります。

🔧 ステップ 2: EC2 への IAM ロールのアタッチ

手順
  1. EC2 コンソール → インスタンス → 対象インスタンスを選択
  2. 「アクション」→「セキュリティ」→「IAM ロールを変更」
  3. IAM ロール: handson-ec2-ssm-role を選択
  4. 「IAM ロールの更新」をクリック
⚠️ 反映までの時間

IAM ロールをアタッチしてから SSM エージェントが Systems Manager に登録されるまで 数分かかります。すぐに接続できない場合は 2〜3 分待ってください。なお、ロールのアタッチでインスタンスの再起動は不要です。

登録状態の確認

手順
  1. Systems Manager コンソール → 左メニュー「フリートマネージャー」
  2. または「ノード管理」→「フリートマネージャー」
  3. 対象インスタンスが一覧に表示され、「SSM エージェントの ping ステータス」が 「オンライン」 になれば登録完了

🔧 ステップ 3: Session Manager でセッション接続

3-1. コンソールから接続

手順
  1. Systems Manager コンソール → 左メニュー「Session Manager」
  2. 「セッションを開始する」をクリック
  3. ターゲットインスタンスの一覧から対象インスタンスを選択
  4. 「セッションを開始する」をクリック
  5. ブラウザ内にターミナルが開く

3-2. 接続確認コマンド

開いたターミナルで以下を実行して接続を確認します。

whoami # → ssm-user sudo cat /etc/os-release # → OS 情報が表示される curl -s http://169.254.169.254/latest/meta-data/instance-id # → 接続中のインスタンス ID が表示される
✅ 確認

whoamissm-user と表示され、コマンドが実行できれば接続成功です。SSH キーもポート開放もなしで EC2 のシェルが使えています。

3-3. EC2 コンソールから接続する方法(別ルート)

手順
  1. EC2 コンソール → インスタンス → 対象を選択 → 「接続」
  2. 「セッションマネージャー」タブ → 「接続」
  3. 同様にブラウザターミナルが開く
ℹ️ CLI から接続する場合

ローカル PC に AWS CLI と Session Manager プラグインをインストールすれば、aws ssm start-session --target i-xxxx でターミナルから直接接続できます。

🔧 ステップ 4: セッションログの記録設定

誰がいつ何のコマンドを実行したかを記録するため、セッションログを CloudWatch Logs に出力します。監査要件で重要です。

4-1. ロググループの作成

手順
  1. CloudWatch → ロググループ → 「ロググループを作成」
  2. 名前: /handson/session-manager-logs
  3. 保持期間: 1 週間 → 「作成」

4-2. Session Manager の設定変更

手順
  1. Systems Manager → Session Manager → 「設定」タブ → 「編集」
  2. 「CloudWatch logging」を 有効化
  3. 「Stream session logs」を選択
  4. ロググループ: /handson/session-manager-logs を選択
  5. 「保存」
⚠️ IAM ロールに CloudWatch Logs 権限が必要

ログ記録を有効化すると、EC2 の IAM ロール(handson-ec2-ssm-role)に CloudWatch Logs への書き込み権限が必要です。AmazonSSMManagedInstanceCore には基本的なログ権限が含まれますが、不足する場合は CloudWatchLogsFullAccess(検証用)を追加してください。

4-3. ログの確認

手順
  1. 再度 Session Manager でセッションを開始し、いくつかコマンドを実行
  2. セッションを終了(exit または「Terminate」)
  3. CloudWatch → ロググループ → /handson/session-manager-logs を開く
  4. セッション中に実行したコマンドの記録が確認できる
✅ 確認

ログにセッション中のコマンド入力が記録されていれば、監査ログの設定完了です。本番環境では S3 への長期保管も併用すると安心です。

🔧 ステップ 5: ポートフォワード(応用)

Session Manager のポートフォワード機能を使うと、踏み台なしでローカル PC から EC2 上のサービスにアクセスできます。例として EC2 上の Web サーバー(ポート 80)をローカルの 8080 に転送します。

ℹ️ 前提:ローカル環境

この手順はローカル PC に AWS CLI + Session Manager プラグインがインストールされている必要があります。ブラウザのセッションでは実行できません。

5-1. ポートフォワードの開始

aws ssm start-session \ --target i-xxxxxxxxxxxxxxxxx \ --document-name AWS-StartPortForwardingSession \ --parameters '{"portNumber":["80"],"localPortNumber":["8080"]}'

5-2. ローカルからアクセス

別のターミナルまたはブラウザで以下にアクセスします。

curl http://localhost:8080 # → EC2 上の Web サーバーのレスポンスが返る
ℹ️ ポートフォワードの活用例
  • プライベートサブネットの RDS に AWS-StartPortForwardingSessionToRemoteHost で接続(踏み台不要の DB 接続)
  • EC2 上の管理画面(Grafana など)にローカルからアクセス
  • RDP(Windows)のポート 3389 を転送してリモートデスクトップ接続

🧹 クリーンアップ

Session Manager 自体は無料のため、必須の削除はありません。検証用に作成したリソースを片付けます。

削除手順

  1. ログ記録設定の無効化
    Systems Manager → Session Manager → 設定 → CloudWatch logging を無効化
  2. ロググループの削除
    CloudWatch → ロググループ → /handson/session-manager-logs → 削除
  3. IAM ロールのデタッチ(任意)
    運用で Session Manager を使い続ける場合はロールを残してOK。不要なら EC2 → IAM ロールを変更 → ロールを外す → handson-ec2-ssm-role を削除
ℹ️ 本番運用の推奨

Session Manager は SSH より安全なため、本番環境でも積極的に使うことが推奨されます。その場合は IAM ロールと SSM 設定を残し、SSH 用のポート 22 のインバウンドルールをセキュリティグループから削除すると、より堅牢な構成になります。