セキュリティ要件でEC2にパブリックIPを付けられない構成や、インターネットゲートウェイを持たないVPC設計では、aws ssm agentがパブリックのAWSエンドポイントに到達できずOfflineになります。NATゲートウェイで解決できますが、転送データ量に比例するコストと、NAT経由の全トラフィック許可がセキュリティ上受け入れられないケースは現場でよく見かけます。
この記事では、インターネット非公開のVPC環境でaws ssm agentをVPCエンドポイント(Interface型)経由で動作させるための設計・実装手順を解説します。
VPCエンドポイントの種類と作成手順、IAMインスタンスプロファイルの設定、SSM Agentのインストール・起動確認、Session Managerでの接続テストまで、Amazon Linux 2 / Amazon Linux 2023の実機手順を元に紹介します。
この記事のポイント
・aws ssm agentにはssm・ssmmessages・ec2messagesの3エンドポイントが必要
・エンドポイント作成時は「プライベートDNS名を有効化」が必須設定
・IAMインスタンスプロファイルにAmazonSSMManagedInstanceCoreポリシーを付ける
・DNS解決がプライベートIPになっているかがOffline原因の切り分け起点
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
なぜVPCエンドポイントが必要なのか?
aws ssm agentは、EC2インスタンス上で常駐するデーモンです。起動時からSSMサービスのパブリックエンドポイントにHTTPS(ポート443)で接続してポーリングし、Run CommandやSession Managerのリクエストを受け取る仕組みになっています。インターネットゲートウェイやNATゲートウェイが存在しないVPCでは、このHTTPS通信がルーティング不能になり、System Managerのコンソールに「Offline」と表示されたまま変わらなくなります。「EC2は起動している、SSM AgentもRunning状態なのに接続できない」という状況のほとんどは、このネットワーク経路の欠如が原因です。
VPCエンドポイント(Interface型)を使うと、AWSのプライベートネットワーク内に仮想的なエンドポイントが作られ、EC2インスタンスはインターネットを一切経由せずにSSMサービスと通信できるようになります。この仕組みをAWS PrivateLinkと呼びます。
必要なVPCエンドポイント3つを把握する
aws ssm agentが正常に動作するには、以下の3つのInterface型VPCエンドポイントが必要です。・com.amazonaws.ap-northeast-1.ssm:Systems Manager本体のAPI(インスタンス登録・ステータス報告)
・com.amazonaws.ap-northeast-1.ssmmessages:Session Manager・Run Commandのメッセージングチャネル
・com.amazonaws.ap-northeast-1.ec2messages:Run Command・SSMエージェントのメッセージ配信
3つのうちどれか1つでも欠けると、aws ssm agentのOnline登録が完了しません。実装現場での経験から言うと、「ssm」だけ作ってssmmessagesを作り忘れるケースが最も多いです。S3へのアクセスが必要な場合(パッチ適用のパッケージ取得等)は、Gateway型のS3エンドポイントも追加します。
VPCエンドポイントの作成手順
1. セキュリティグループを準備する
VPCエンドポイントには専用のセキュリティグループを適用します。プライベートサブネットのEC2インスタンスからHTTPS(443番ポート)を受け付けるインバウンドルールが最小要件です。・インバウンド:ポート443、ソースにEC2のセキュリティグループIDを指定
・アウトバウンド:デフォルト(全許可のまま)
EC2のセキュリティグループIDを直接ソースに指定することで、同じVPC内の他リソースからの不要なアクセスを遮断できます。CIDRブロックで指定する場合はEC2が存在するサブネットのCIDRを使います。
2. Interface型エンドポイントを3つ作成する
AWSマネジメントコンソールの場合:VPC → エンドポイント → エンドポイントを作成 から進みます。AWS CLIで一括作成する場合は以下の手順です。VPC ID・サブネットID・セキュリティグループIDは環境に合わせて変更してください。
# 変数を設定する(環境に合わせて変更する) VPC_ID=vpc-0a1b2c3d4e5f67890 SUBNET_ID=subnet-0a1b2c3d4e5f67890 SG_ID=sg-0a1b2c3d4e5f67890 REGION=ap-northeast-1 # ssmエンドポイントを作成する aws ec2 create-vpc-endpoint \ --vpc-id $VPC_ID \ --vpc-endpoint-type Interface \ --service-name com.amazonaws.${REGION}.ssm \ --subnet-ids $SUBNET_ID \ --security-group-ids $SG_ID \ --private-dns-enabled # ssmmessagesエンドポイントを作成する aws ec2 create-vpc-endpoint \ --vpc-id $VPC_ID \ --vpc-endpoint-type Interface \ --service-name com.amazonaws.${REGION}.ssmmessages \ --subnet-ids $SUBNET_ID \ --security-group-ids $SG_ID \ --private-dns-enabled # ec2messagesエンドポイントを作成する aws ec2 create-vpc-endpoint \ --vpc-id $VPC_ID \ --vpc-endpoint-type Interface \ --service-name com.amazonaws.${REGION}.ec2messages \ --subnet-ids $SUBNET_ID \ --security-group-ids $SG_ID \ --private-dns-enabled
3. プライベートDNS名の有効化を確認する
`--private-dns-enabled` オプション(コンソールでは「このエンドポイントのプライベートDNS名を有効化する」チェックボックス)が無効のままだと、VPC内のEC2から `ssm.ap-northeast-1.amazonaws.com` を解決したときにパブリックIPが返ってしまいます。このオプションは必ず有効にしてください。また、VPC設定として「DNS解決を有効化」と「DNSホスト名を有効化」の両方がオンになっている必要があります。デフォルトVPCでは両方オンですが、カスタムVPCで明示的にオフにしているケースがあります。VPCの「設定の編集」からDNS項目を確認してください。
SSM Agentのインストールと起動設定
AWSが提供するAmazon Linux 2またはAmazon Linux 2023の公式AMIには、aws ssm agentがプリインストールされています。新規起動のインスタンスならインストール手順は不要なことが多いですが、カスタムAMIや古いAMIを使っている場合はインストールから実施します。Amazon Linux環境でのAWSサーバー構築の基礎から体系的に学びたい場合は、Amazon LinuxによるAWSサーバー構築入門も参考にしてください。
1. amazon-ssm-agentをyumでインストールする
# Amazon Linux 2 の場合 sudo yum install -y amazon-ssm-agent # 実行例(プライベートサブネット・VPCエンドポイント経由でパッケージ取得) # Loaded plugins: extras_suggestions, langpacks, priorities, update-motd # amzn2-core | 3.7 kB 00:00:00 # Resolving Dependencies # --> Running transaction check # ---> Package amazon-ssm-agent.x86_64 0:3.3.131.0-1.amzn2 will be updated # ---> Package amazon-ssm-agent.x86_64 0:3.3.582.0-1.amzn2 will be an update # Transaction Summary # Upgrade 1 Package # Complete!
# Amazon Linux 2023 の場合 sudo dnf install -y amazon-ssm-agent
2. SSM Agentを起動・自動起動を設定する
# SSM Agentを起動する sudo systemctl start amazon-ssm-agent # 自動起動を設定する sudo systemctl enable amazon-ssm-agent # 起動状態を確認する sudo systemctl status amazon-ssm-agent
* amazon-ssm-agent.service - amazon-ssm-agent Loaded: loaded (/usr/lib/systemd/amazon-ssm-agent.service; enabled; vendor preset: enabled) Active: active (running) since Tue 2026-10-06 09:12:45 UTC; 1min 33s ago Main PID: 3142 (amazon-ssm-agen) Tasks: 11 (limit: 4915) Memory: 52.4M CPU: 1.451s CGroup: /system.slice/amazon-ssm-agent.service └─3142 /usr/bin/amazon-ssm-agent
3. IAMインスタンスプロファイルを確認する
aws ssm agentがSSMサービスと通信するには、EC2インスタンスにIAMロールが必要です。マネージドポリシー `AmazonSSMManagedInstanceCore` が付与されたロールをインスタンスプロファイルとしてEC2にアタッチしてください。EC2コンソール → インスタンスの選択 → 「セキュリティ」タブ → 「IAMロール」でアタッチ済みのロールとポリシーを確認します。既存のEC2に後付けする場合はCLIでアタッチできます。
# 既存EC2インスタンスにインスタンスプロファイルをアタッチする aws ec2 associate-iam-instance-profile \ --instance-id i-0a1b2c3d4e5f67890 \ --iam-instance-profile Name=SSMInstanceProfile
Session Managerで接続を確認する
VPCエンドポイント・IAMロール・SSM Agentの3つが揃った後、System Managerコンソールで「フリートマネージャー」を開き、対象インスタンスの状態が「Online」に変わることを確認します。Onlineになるまで1~3分かかることがあります。OnlineになったらSession Managerで接続テストをします。コンソールから「セッションマネージャー」→「セッションの開始」を選んでインスタンスを選択し、「セッションを開始する」を押します。ブラウザ上でシェルが起動すれば接続成功です。
AWS CLIからも接続できます。Session Manager Pluginが必要なので、未インストールのPCは事前にインストールしておきます。
# Session PluginをインストールしたPCから接続する aws ssm start-session --target i-0a1b2c3d4e5f67890 # 接続後のシェル(プライベートサブネット上のEC2に入れることを確認する) sh-4.2$ whoami ssm-user sh-4.2$ hostname ip-10-0-12-45.ap-northeast-1.compute.internal sh-4.2$ curl -s http://169.254.169.254/latest/meta-data/instance-id i-0a1b2c3d4e5f67890
トラブルシュート
「Offline」のままになる場合の確認手順
3点を順番に確認してください。・1. VPCエンドポイントの状態が「available」か:コンソールのエンドポイント一覧で3つとも「available」を確認する。「pending」や「failed」の場合はSGのインバウンドルールを見直す
・2. IAMロールがアタッチされているか:フリートマネージャーのインスタンス詳細「IAMロール」列が空になっていないか確認する
・3. SSM Agentログにエラーがないか:ログファイルで接続エラーを確認する
# SSM Agentのログを確認する sudo tail -50 /var/log/amazon/ssm/amazon-ssm-agent.log # 接続成功時のログ例 # 2026-10-06 09:14:21 INFO [HealthCheck] EC2 instance is registered with SSM # 2026-10-06 09:14:21 INFO Successfully connected to endpoint: ssmmessages.ap-northeast-1.amazonaws.com # 接続失敗時(VPCエンドポイントが未設定)のログ例 # 2026-10-06 09:14:21 ERROR [CredentialRefresher] No EC2 instance role found # 2026-10-06 09:14:21 ERROR HealthCheck: Unable to connect, i/o timeout
VPCエンドポイントのDNS解決を確認する
プライベートDNSが正しく機能しているかを確認するには、nslookupでエンドポイントのFQDNをVPC内のDNSサーバーで解決し、プライベートIPアドレス(10.x.x.x等)が返るかを確認します。Linux DNS 設定の基本も参考になります。# EC2インスタンス上でnslookupを実行する nslookup ssm.ap-northeast-1.amazonaws.com # VPCエンドポイントが正常な場合(プライベートIPが返る) # Server: 10.0.0.2 # Address: 10.0.0.2#53 # # Non-authoritative answer: # Name: ssm.ap-northeast-1.amazonaws.com # Address: 10.0.10.213 # VPCエンドポイントが未設定の場合(パブリックIPが返る) # Server: 10.0.0.2 # Address: 10.0.0.2#53 # # Non-authoritative answer: # Name: ssm.ap-northeast-1.amazonaws.com # Address: 52.119.224.28
aws ssm agentが接続するすべてのエンドポイント(ssm・ssmmessages・ec2messages)で同じ確認を行ってください。Linux ポート確認の全コマンドを使って対象ホストへのポート443到達性をncやssコマンドで確認する方法を組み合わせると、経路の切り分けがより精度高くできます。
本記事のまとめ
インターネット非公開のVPC環境でaws ssm agentを動作させるために必要な設定をまとめます。| 設定項目 | 内容・注意点 |
|---|---|
| VPCエンドポイント(ssm) | Interface型。プライベートDNS有効化必須 |
| VPCエンドポイント(ssmmessages) | Interface型。Session Manager・Run Commandに必須 |
| VPCエンドポイント(ec2messages) | Interface型。Run Commandに必須 |
| IAMインスタンスプロファイル | AmazonSSMManagedInstanceCoreポリシーを付与 |
| VPC DNS設定 | 「DNS解決」「DNSホスト名」両方を有効化 |
| SSM Agent起動 | systemctl enable amazon-ssm-agentで自動起動設定 |
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら
- 前のページへ:マルチAZ冗長設計にAWS SSM Start Sessionを組み込むIAM設計|クロスアカウント権限設計
- この記事の属するカテゴリ:AWS(Amazon Linux)へ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。
登録無料・いつでも解除できます