Session Manager は、EC2 に SSH の鍵もインバウンドのポート(22 番)も使わずに、シェルで入れる AWS Systems Manager の機能です。 EC2 の中の SSM Agent が、外向き(HTTPS 443)に Systems Manager へつなぎに行き、その通信路を使ってシェルを開きます。

接続に必要なものは4つです。

必要なもの どこに 内容
① IAM ロール(インスタンスプロファイル) EC2 AmazonSSMManagedInstanceCore を付ける
② SSM Agent EC2 Amazon Linux 2023・Ubuntu Server などの AMI には最初から入っている
③ 外向きの通信 VPC インターネット(NAT)か、VPC エンドポイント ssm・ssmmessages・ec2messages
④ 権限とプラグイン 接続する人 IAM の ssm:StartSession と、AWS CLI 用の Session Manager プラグイン
aws ssm start-session --target i-0123456789abcdef0

確認環境:AWS CLI 1.46.1(Linux)・OpenSSH 9.6p1。AWS には接続せず、moto 5.2.4 のサーバーモード(AWS を模したサーバー)で、IAM ロールとインスタンスプロファイルの作成、AmazonSSMManagedInstanceCore の付与、VPC エンドポイント(インターフェース型3つと S3 のゲートウェイ型)の作成、プロファイル付きの EC2 の起動を CLI で動かしました。start-session は moto が対応していないため、StartSession API と同じ形の応答を返すサーバーを手元に用意し、プラグインが無いときのエラーと、CLI からプラグインに渡される引数(ポートフォワードの指定)を確かめました。ssh config の ProxyCommand は、ssh -G と、引数を記録するだけの aws コマンドで展開のされ方を確かめています。実際の接続・ログの出力・エージェントの動きは、AWS のドキュメントに基づいて書いています(確認日 2026年10月12日)。

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「Session ManagerでEC2に接続する方法|SSH鍵なしの手順」

SSH との違い

項目 Session Manager SSH(鍵)
インバウンドの 22 番 不要 必要
SSH の鍵の管理 不要 必要
パブリック IP 不要 必要(踏み台がなければ)
誰が入れるか IAM で決める 鍵を持つ人
操作の記録 CloudTrail に開始・終了。シェルのセッションの中身を S3・CloudWatch Logs に残せる OS のログ
ファイルの転送 そのままでは不可(SSH を通すと scp が使える) scp・sftp

AWS re:Post の記事でも、Session Manager は受信ポートを開けず、SSH の鍵を管理せずに接続できる方法として紹介されています。

仕組み:EC2 から外へつなぎに行く

[自分のPC]                                          [EC2(プライベートでも可)]
 aws ssm start-session                                 SSM Agent
 + Session Manager プラグイン                              │ 外向き HTTPS 443
        │ HTTPS 443                                         ▼
        └────────► Systems Manager(ssm / ssmmessages / ec2messages)◄──┘

EC2 のセキュリティグループは、インバウンドのルールが空でも接続できます。 必要なのは、EC2 から Systems Manager の各エンドポイントへの外向き 443 だけです。

手順1:EC2 に IAM ロール(インスタンスプロファイル)を付ける

cat > ec2-trust.json <<'EOF'
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": { "Service": "ec2.amazonaws.com" },
      "Action": "sts:AssumeRole"
    }
  ]
}
EOF

aws iam create-role --role-name SSMInstanceRole \
  --assume-role-policy-document file://ec2-trust.json
aws iam attach-role-policy --role-name SSMInstanceRole \
  --policy-arn arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
aws iam create-instance-profile --instance-profile-name SSMInstanceProfile
aws iam add-role-to-instance-profile \
  --instance-profile-name SSMInstanceProfile --role-name SSMInstanceRole

# 起動済みの EC2 に付ける
aws ec2 associate-iam-instance-profile \
  --instance-id i-0123456789abcdef0 \
  --iam-instance-profile Name=SSMInstanceProfile

新しく起動するなら、run-instances に --iam-instance-profile Name=SSMInstanceProfile を付けます。moto で起動した EC2 を describe-instances で見ると、IamInstanceProfile.Arn にプロファイルが付き、パブリック IP とキーペアは無しの状態でした。

ドキュメントでは、AmazonSSMManagedInstanceCore を含むインスタンスプロファイルが付いていれば、Session Manager に必要な権限はそろっているとされています。moto に入っているこのポリシーの写しを見ると、ssm:UpdateInstanceInformation などの ssm:*、ssmmessages:CreateControlChannel・CreateDataChannel・OpenControlChannel・OpenDataChannel、ec2messages:* の操作が含まれていました。

プロファイルを後から付けたときは、SSM Agent の再起動が要ることがあります。 ドキュメントのトラブルシューティングでも、プロファイルを付ける前からエージェントが動いていた場合は再起動するよう書かれています。

アカウント全体で EC2 に権限を与える「既定のホスト管理設定(Default Host Management Configuration)」を使う方法もあり、ドキュメントでは使える場合はこちらが勧められています。インスタンスプロファイルとロールの関係は、関連記事「IAMロールとは|ユーザー・ポリシーとの違いとAssumeRole、信頼ポリシー」で扱っています。

手順2:SSM Agent を確かめる

ドキュメントで SSM Agent が最初から入っているとされる主な AMI です。

AMI エージェント
Amazon Linux 2023・Amazon Linux 2 入っている
Ubuntu Server 18.04・20.04・22.04・24.04 LTS など 入っている(Snap)
Windows Server 2016・2019・2022・2025 入っている
SUSE Linux Enterprise Server 15.3 以降・AlmaLinux 入っている
RHEL・Debian など上にないもの 自分で入れる
# Amazon Linux 2023
sudo systemctl status amazon-ssm-agent

# Ubuntu Server(Snap)
sudo systemctl status snap.amazon-ssm-agent.amazon-ssm-agent.service

EC2 がつながっているかは、手元から次で確かめます。PingStatus が Online なら、Session Manager で入れる状態です。

aws ssm describe-instance-information \
  --filters Key=InstanceIds,Values=i-0123456789abcdef0 \
  --query 'InstanceInformationList[].[InstanceId,PingStatus,AgentVersion,PlatformName]' \
  --output table

ここに出てこないなら、手順1(権限)か手順3(通信)に問題があります。

手順3:通信の道を用意する(プライベートサブネットなら VPC エンドポイント)

EC2 の置き場所 必要なもの
パブリックサブネット(パブリック IP あり) インターネットゲートウェイへの経路(そのまま)
プライベートサブネット+NAT ゲートウェイ NAT への経路(そのまま)
プライベートサブネット・外へ出られない VPC エンドポイント(インターフェース型)を3つ

ドキュメントにある、Systems Manager 用の VPC エンドポイントです。

エンドポイントのサービス名 役割(ドキュメント) 必要か
com.amazonaws.<リージョン>.ssm Systems Manager のサービス 必要
com.amazonaws.<リージョン>.ssmmessages Session Manager の通信路(データチャネル) 必要
com.amazonaws.<リージョン>.ec2messages エージェントからサービスへの呼び出し 必要(SSM Agent 3.3.40.0 以降は、使えるときは ssmmessages を使う)
com.amazonaws.<リージョン>.s3(ゲートウェイ型) エージェントの更新、S3 へのログ出力 エージェントの更新・S3 にログを出すなら
com.amazonaws.<リージョン>.logs CloudWatch Logs へのログ出力 CloudWatch Logs にログを出すなら
com.amazonaws.<リージョン>.kms KMS でセッションを暗号化 KMS を使うなら
VPC_ID=vpc-0123456789abcdef0
SUBNET_ID=subnet-0123456789abcdef0       # EC2 のいるプライベートサブネット
RT_ID=rtb-0123456789abcdef0              # そのサブネットのルートテーブル
REGION=ap-northeast-1

# エンドポイントのプライベート DNS には、VPC の DNS 解決と DNS ホスト名が要る
aws ec2 modify-vpc-attribute --vpc-id $VPC_ID --enable-dns-support
aws ec2 modify-vpc-attribute --vpc-id $VPC_ID --enable-dns-hostnames

# エンドポイント用のセキュリティグループ:EC2 のサブネットから 443 を許可
SG_EP=$(aws ec2 create-security-group --group-name ssm-endpoints \
  --description "HTTPS from private subnet" --vpc-id $VPC_ID \
  --query GroupId --output text)
aws ec2 authorize-security-group-ingress --group-id $SG_EP \
  --protocol tcp --port 443 --cidr 10.0.1.0/24

for svc in ssm ssmmessages ec2messages; do
  aws ec2 create-vpc-endpoint --vpc-id $VPC_ID \
    --vpc-endpoint-type Interface \
    --service-name com.amazonaws.$REGION.$svc \
    --subnet-ids $SUBNET_ID \
    --security-group-ids $SG_EP \
    --private-dns-enabled
done

# S3(ゲートウェイ型、料金なし)
aws ec2 create-vpc-endpoint --vpc-id $VPC_ID \
  --vpc-endpoint-type Gateway \
  --service-name com.amazonaws.$REGION.s3 \
  --route-table-ids $RT_ID

moto で作ったエンドポイントの一覧です。

com.amazonaws.ap-northeast-1.ssm    Interface   available
com.amazonaws.ap-northeast-1.ssmmessages    Interface   available
com.amazonaws.ap-northeast-1.ec2messages    Interface   available
com.amazonaws.ap-northeast-1.s3 Gateway available

ドキュメントでは、エンドポイントに付けるセキュリティグループで、EC2 のいるプライベートサブネットからの 443 を許可する必要があるとされています。 許可していないと、EC2 は Systems Manager につながりません。EC2 側のセキュリティグループで外向きの通信を絞っているなら、エンドポイントへの 443(S3 のゲートウェイ型ならプレフィックスリスト)を許可します。

インターフェース型の VPC エンドポイントは、1 つごと・AZ ごとに時間料金がかかります。VPC とサブネットの作り方は、関連記事「AWS CLIでVPCを作成する手順|サブネットからIGWまで一式」で、セキュリティグループは、関連記事「AWS CLIでセキュリティグループ設定|ルール追加・削除・確認」で扱っています。

手順4:接続する人の IAM 権限

接続する人(IAM ユーザーやロール)には、ssm:StartSession と、自分のセッションを終える権限を与えます。特定のタグが付いた EC2 にだけ入れるようにする例です。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "StartSessionOnTaggedInstances",
      "Effect": "Allow",
      "Action": "ssm:StartSession",
      "Resource": "arn:aws:ec2:ap-northeast-1:123456789012:instance/*",
      "Condition": {
        "StringEquals": { "ssm:resourceTag/Env": "dev" }
      }
    },
    {
      "Sid": "AllowSessionDocuments",
      "Effect": "Allow",
      "Action": "ssm:StartSession",
      "Resource": [
        "arn:aws:ssm:*:*:document/AWS-StartPortForwardingSessionToRemoteHost",
        "arn:aws:ssm:*:*:document/AWS-StartSSHSession"
      ]
    },
    {
      "Sid": "ManageOwnSessions",
      "Effect": "Allow",
      "Action": ["ssm:TerminateSession", "ssm:ResumeSession"],
      "Resource": "arn:aws:ssm:*:*:session/${aws:userid}-*"
    },
    {
      "Sid": "OpenOwnDataChannel",
      "Effect": "Allow",
      "Action": "ssmmessages:OpenDataChannel",
      "Resource": "arn:aws:ssm:*:*:session/${aws:userid}-*"
    },
    {
      "Sid": "ListForConsole",
      "Effect": "Allow",
      "Action": ["ssm:DescribeSessions", "ssm:GetConnectionStatus", "ssm:DescribeInstanceInformation", "ec2:DescribeInstances"],
      "Resource": "*"
    }
  ]
}
ポイント 理由
ssm:StartSession の Resource に EC2 の ARN どの EC2 に入れるかを決める
ドキュメント(AWS-StartSSHSession など)の ARN ポートフォワードや SSH を使うなら、その文書への StartSession も要る
session/${aws:userid}-* セッション ID は「利用者の ID-…」の形。自分のセッションだけを終えられる
ssmmessages:OpenDataChannel ドキュメントの SSH の例に含まれる、セッションのデータチャネルを開く権限

ドキュメントにある、SSH を許可するポリシーの例は次の形です。

{
    "Version":"2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "ssm:StartSession",
            "Resource": [
                "arn:aws:ec2:us-east-1:111122223333:instance/instance-id",
                "arn:aws:ssm:*:*:document/AWS-StartSSHSession"
            ]
        },
        {
            "Effect": "Allow",
            "Action": "ssmmessages:OpenDataChannel",
            "Resource": "arn:aws:ssm:*:*:session/${aws:userid}-*"
        }
    ]
}

条件キーの書き方は、関連記事「IAMポリシーConditionの書き方|条件演算子と条件キー一覧」で扱っています。

手順5:Session Manager プラグインを入れる

AWS CLI から接続するには、手元の PC に Session Manager プラグインが要ります。 プラグインが無いと、start-session は次のエラーで終わりました。

SessionManagerPlugin is not found. Please refer to SessionManager Documentation here: http://docs.aws.amazon.com/console/systems-manager/session-manager-plugin-not-found

手元のサーバーで記録した API の呼び出しを見ると、CLI は StartSession を呼んだあと、プラグインが無いと分かった時点で TerminateSession を呼び、開いたセッションを閉じていました。

OS インストール(ドキュメントのコマンド)
macOS(Apple シリコン) 下のコマンド
Ubuntu・Debian(x86_64) 下のコマンド
Amazon Linux・RHEL rpm パッケージ
Windows インストーラー(.exe)
# macOS(Apple シリコン。Intel は URL の mac_arm64 を mac に)
curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/mac_arm64/session-manager-plugin.pkg" -o "session-manager-plugin.pkg"
sudo installer -pkg session-manager-plugin.pkg -target /
sudo ln -s /usr/local/sessionmanagerplugin/bin/session-manager-plugin /usr/local/bin/session-manager-plugin

# Ubuntu・Debian(x86_64。ARM64 は ubuntu_arm64)
curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/ubuntu_64bit/session-manager-plugin.deb" -o "session-manager-plugin.deb"
sudo dpkg -i session-manager-plugin.deb

# 確かめる
session-manager-plugin
session-manager-plugin --version

ドキュメントでは、入っていれば The Session Manager plugin is installed successfully. Use the AWS CLI to start a session. と表示されます。また、プラグインは 1.2.764.0 以降、AWS CLI は 1.16.12 以降が必要とされています。Windows でプラグインを入れても見つからないときは、C:\Program Files\Amazon\SessionManagerPlugin\bin\ を PATH に加えます。

手順6:接続する

aws ssm start-session --target i-0123456789abcdef0

Linux の EC2 にログインするユーザーは、既定で ssm-user です。 別の OS ユーザーで入りたいときは、後述の設定(runAsEnabled・runAsDefaultUser)を使います。終えるときは exit です。ドキュメントでは、何も操作しないとセッションは既定 20 分で切れます(1〜60 分で変えられる)。

名前(Name タグ)から接続したいときは、インスタンス ID を引いてから渡します。

ID=$(aws ec2 describe-instances \
  --filters "Name=tag:Name,Values=app-server-1" "Name=instance-state-name,Values=running" \
  --query 'Reservations[0].Instances[0].InstanceId' --output text)
aws ssm start-session --target "$ID"

EC2 の検索のしかたは、関連記事「AWS CLIでEC2操作|describe-instancesと起動・停止」で扱っています。

ポートフォワード:EC2 経由で RDS につなぐ

AWS-StartPortForwardingSessionToRemoteHost を使うと、EC2 を踏み台にして、プライベートサブネットの RDS などに手元のポートからつなげます。 踏み台の EC2 にインバウンドのポートも SSH の鍵も要りません。

aws ssm start-session \
  --target i-0123456789abcdef0 \
  --document-name AWS-StartPortForwardingSessionToRemoteHost \
  --parameters '{"host":["mydb.cluster-xxxx.ap-northeast-1.rds.amazonaws.com"],"portNumber":["5432"],"localPortNumber":["15432"]}'

別のターミナルから、手元のポートにつなぎます。

psql "host=127.0.0.1 port=15432 dbname=app user=app_user sslmode=require"
# MySQL なら
mysql -h 127.0.0.1 -P 13306 -u app_user -p
パラメータ 意味
host つなぎたい先(RDS のエンドポイントなど)。EC2 から名前解決・到達できること
portNumber つなぎたい先のポート(PostgreSQL 5432、MySQL 3306)
localPortNumber 手元で開くポート。使っていない番号にする

手元でプラグインに渡される中身を確かめました。 プラグインの代わりに引数を表示するだけのスクリプトを置いて動かすと、CLI は次の6つをプラグインに渡し、StartSession の応答(セッション ID・トークン・接続先の URL)は環境変数で渡していました。

[1] AWS_SSM_START_SESSION_RESPONSE
[2] ap-northeast-1
[3] StartSession
[4] (プロファイル名。指定なしなら空)
[5] {"Target": "i-0123456789abcdef0", "DocumentName": "AWS-StartPortForwardingSessionToRemoteHost", "Parameters": {"host": ["mydb.cluster-xxxx.ap-northeast-1.rds.amazonaws.com"], "portNumber": ["5432"], "localPortNumber": ["15432"]}}
[6] (API のエンドポイント)

--parameters host=...,portNumber=5432,localPortNumber=15432 の短い書き方(ドキュメントでは Windows の例)でも、送られる Parameters は同じ JSON になりました。

前提 内容(ドキュメント)
SSM Agent の版 リモートホストへのポートフォワードは 3.1.1374.0 以降。EC2 自身へのポートフォワードは 2.3.672.0 以降
つなぎたい先 Systems Manager の管理下である必要はない
セキュリティグループ RDS 側で、踏み台の EC2 からの接続を許可する
ログ ポートフォワードのセッションは、中身が記録されない

EC2 自身のポート(例:EC2 の中の Web サーバーの 80 番)なら、AWS-StartPortForwardingSession を使います。

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

RDS の接続先の調べ方は、関連記事「AWS CLIでRDSを操作|起動・停止・スナップショット・接続先取得」で扱っています。

ssh config で ProxyCommand を使う

Session Manager の通信路の上で SSH を使うと、scp・rsync・VS Code の Remote-SSH などがそのまま使えます。この方法は SSH の鍵を使いますが、インバウンドの 22 番とパブリック IP は不要です。

ドキュメントにある ~/.ssh/config の設定です(Linux・macOS)。

# SSH over Session Manager
Host i-* mi-*
    ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"
    User ec2-user

名前で入りたいときや、プロファイル・リージョンを指定したいときは、別名を付けます。

Host app-prod
    HostName i-0123456789abcdef0
    User ec2-user
    IdentityFile ~/.ssh/my-key.pem
    ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p' --profile prod --region ap-northeast-1"

aws の代わりに、受け取った引数を記録するだけのスクリプトを置いて ssh を動かしました。%h はインスタンス ID に、%p は 22 に展開されて渡されました。

aws called: ssm start-session --target i-0123456789abcdef0 --document-name AWS-StartSSHSession --parameters portNumber=22
aws called: ssm start-session --target i-0123456789abcdef0 --document-name AWS-StartSSHSession --parameters portNumber=22 --profile prod --region ap-northeast-1
ssh i-0123456789abcdef0
ssh app-prod
scp ./app.tar.gz app-prod:/tmp/
前提 内容(ドキュメント)
EC2 側 SSH サーバーが動いていて、SSM Agent が 2.3.672.0 以降。公開鍵が EC2 に登録されている
手元 Session Manager プラグイン 1.1.23.0 以降
ユーザー 鍵にひも付くユーザー(Amazon Linux なら ec2-user)。ssm-user ではない
ログ SSH のセッションは中身が記録されない

Windows の ProxyCommand は、ドキュメントでは PowerShell を使う形です。

Host i-* mi-*
    ProxyCommand C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters portNumber=%p"

ssh config の書き方全般は、関連記事「ssh configの書き方|踏み台・ポートフォワードの用途別テンプレート」で扱っています。

つながらないときの原因表

症状・エラー 主な原因 確かめること・対処
SessionManagerPlugin is not found 手元にプラグインが無い・PATH に無い 手順5。Windows は PATH に ...\SessionManagerPlugin\bin\
TargetNotConnected ... isn't connected EC2 がつながっていない。別のアカウント・リージョンを見ている describe-instance-information に出るか。--region
describe-instance-information に出ない インスタンスプロファイルが無い・付けた後にエージェントを再起動していない 手順1。エージェントの再起動
同上(プライベートサブネット) VPC エンドポイントが無い・SG で 443 を許可していない・プライベート DNS が無効 手順3。エンドポイントの SG とサブネット
同上(NAT あり) NAT・ルートテーブルの誤り、プロキシの設定 EC2 から外への 443
SSM Agent is not online エージェントがエンドポイントに登録できない(ファイアウォール・経路) ネットワークの経路
AccessDeniedException ... ssm:StartSession 接続する人の IAM 権限が無い・タグの条件に合わない 手順4
AccessDeniedException ... ssm:TerminateSession セッションを終える権限が無い/プラグインの版が前のもの session/${aws:userid}-*、プラグインの更新
InvalidDocument ... Only type: 'Session' is supported --document-name に Command の文書を指定した Session 用の文書(AWS-StartPortForwardingSession など)を使う
接続した後、画面が真っ白 ルートボリュームが満杯でエージェントが止まった、ログの出力先(S3・CloudWatch Logs)のエンドポイントが無い ディスク、logs・s3 のエンドポイント
ポートフォワードで DB につながらない RDS の SG で EC2 からの接続を許可していない、host を EC2 から引けない RDS の SG。EC2 の中から nc -zv <host> <port>
SSH で Permission denied (publickey) 鍵が EC2 に登録されていない・ユーザー名が違う ec2-user/ubuntu など。鍵

エラーの文面とその対処は、Systems Manager のドキュメントのトラブルシューティングに基づいています。

操作ログを残す

CloudTrail:誰がいつ接続したか

StartSession・TerminateSession などの API の呼び出しは、CloudTrail に記録されます。

aws cloudtrail lookup-events --region ap-northeast-1 \
  --lookup-attributes AttributeKey=EventName,AttributeValue=StartSession \
  --output json \
| jq -r '.Events[].CloudTrailEvent | fromjson
         | [.eventTime, .userIdentity.arn, .requestParameters.target, .requestParameters.documentName // "(shell)"] | @tsv'

CloudTrail の調べ方は、関連記事「CloudTrailで誰が操作したか調べる|lookup-eventsとAthena」で扱っています。

セッションの中身:S3・CloudWatch Logs

シェルのセッションで打ったコマンドと出力は、Session Manager の設定で S3 や CloudWatch Logs に残せます。設定は、SSM-SessionManagerRunShell という文書で持ちます。ドキュメントの雛形をもとにした例です。

{
    "schemaVersion": "1.0",
    "description": "Document to hold regional settings for Session Manager",
    "sessionType": "Standard_Stream",
    "inputs": {
        "s3BucketName": "my-ssm-session-logs",
        "s3KeyPrefix": "session/",
        "s3EncryptionEnabled": true,
        "cloudWatchLogGroupName": "/ssm/session",
        "cloudWatchEncryptionEnabled": true,
        "cloudWatchStreamingEnabled": true,
        "kmsKeyId": "",
        "runAsEnabled": false,
        "runAsDefaultUser": "",
        "idleSessionTimeout": "20",
        "maxSessionDuration": "",
        "shellProfile": {
            "windows": "",
            "linux": "exec /bin/bash"
        }
    }
}
aws ssm update-document \
  --name "SSM-SessionManagerRunShell" \
  --content "file://SessionManagerRunShell.json" \
  --document-version "\$LATEST"
項目 意味
s3BucketName・s3KeyPrefix S3 にログを残す
cloudWatchLogGroupName CloudWatch Logs にログを残す
s3EncryptionEnabled・cloudWatchEncryptionEnabled 暗号化された出力先だけに書く。出力先が暗号化されていないのに true だと、セッションが始まらない(画面が真っ白)
idleSessionTimeout 何もしないときに切れるまでの分(既定 20、1〜60)
runAsEnabled・runAsDefaultUser ssm-user 以外の OS ユーザーで入る
shellProfile セッション開始時に実行するコマンド

ログの出力には、EC2 のロールに出力先(S3・CloudWatch Logs)への書き込み権限を足し、プライベートサブネットなら s3・logs のエンドポイントも用意します。ポートフォワードと SSH のセッションは、通信が暗号化されたまま通るだけなので、中身は記録されません。 中身まで残したい操作は、シェルのセッション(start-session --target だけ)で行います。

よくある質問

Q. EC2 にパブリック IP は要りますか。 A. 要りません。EC2 から Systems Manager の各エンドポイントへ外向きの 443 で届けば、プライベートサブネットでも入れます(VPC エンドポイントか NAT)。

Q. セキュリティグループのインバウンドに何を開けますか。 A. EC2 のセキュリティグループには何も要りません。VPC エンドポイントを使う場合は、エンドポイント側のセキュリティグループで、EC2 のサブネットからの 443 を許可します。

Q. ファイルを送りたいです。 A. SSH を Session Manager の上に通す設定(ProxyCommand)にすれば、scp が使えます。鍵を使いたくない場合は、S3 を経由して受け渡す方法がドキュメントで案内されています。

Q. 踏み台サーバーは要らなくなりますか。 A. EC2 へのシェルと、ポートフォワードによる RDS などへの接続は、踏み台の 22 番を開けずに行えます。ポートフォワードの中継役として、VPC 内に Session Manager でつながる EC2 が1台は必要です。

まとめ

  • Session Manager は SSH の鍵もインバウンドのポートも使わず、EC2 のエージェントが外向き 443 でつなぐ
  • EC2 に AmazonSSMManagedInstanceCore のインスタンスプロファイル、プライベートなら ssm・ssmmessages・ec2messages のエンドポイント(SG で 443)
  • 手元には Session Manager プラグイン。無いと SessionManagerPlugin is not found で終わる
  • RDS には AWS-StartPortForwardingSessionToRemoteHost(エージェント 3.1.1374.0 以降)
  • ssh config の ProxyCommand で AWS-StartSSHSession を使えば scp も使える(鍵は要る)
  • 中身のログは シェルのセッションだけ。ポートフォワード・SSH は記録されない。誰が接続したかは CloudTrail の StartSession

参考・出典

確認日はいずれも 2026年10月12日です。

  • AWS Systems Manager ユーザーガイド「Start a session」:https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-working-with-sessions-start.html
  • AWS Systems Manager ユーザーガイド「Allow and control permissions for SSH connections through Session Manager」:https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-getting-started-enable-ssh-connections.html
  • AWS Systems Manager ユーザーガイド「Verify or create an IAM instance profile with Session Manager permissions」:https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-getting-started-instance-profile.html
  • AWS Systems Manager ユーザーガイド「Improve the security of EC2 instances by using VPC endpoints for Systems Manager」:https://docs.aws.amazon.com/systems-manager/latest/userguide/setup-create-vpc.html
  • AWS Systems Manager ユーザーガイド「Find AMIs with the SSM Agent preinstalled」:https://docs.aws.amazon.com/systems-manager/latest/userguide/ami-preinstalled-agent.html
  • AWS Systems Manager ユーザーガイド「Install the Session Manager plugin for the AWS CLI」:https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html
  • AWS Systems Manager ユーザーガイド「Verify the Session Manager plugin installation」:https://docs.aws.amazon.com/systems-manager/latest/userguide/install-plugin-verify.html
  • AWS Systems Manager ユーザーガイド「Troubleshooting Session Manager」:https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-troubleshooting.html
  • AWS Systems Manager ユーザーガイド「Create a Session Manager preferences document (command line)」:https://docs.aws.amazon.com/systems-manager/latest/userguide/getting-started-configure-preferences-cli.html
  • AWS Systems Manager ユーザーガイド「Specify an idle session timeout value」:https://docs.aws.amazon.com/systems-manager/latest/userguide/session-preferences-timeout.html
  • AWS re:Post ナレッジセンター「EC2 Linux インスタンスに接続するにはどのような方法を使用できますか?」:https://repost.aws/ja/knowledge-center/ec2-linux-connection-options

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「Session ManagerでEC2に接続する方法|SSH鍵なしの手順」

株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?