こういった構成上の課題を解消するのが、Ansibleのcommunity.aws.aws_ssm接続プラグインです。AWS Systems Manager(SSM)のセッションマネージャーをトンネルとして使い、SSHポートを一切開放しないままプライベートサブネットのEC2インスタンスへPlaybookを適用できます。
この記事では、aws_ssm接続プラグインの動作原理から、IAMロール設計・インベントリ記述・Playbook実行結果まで、構成の全体像をAmazon Linux 2023の実機で確認した内容とともに解説します。
この記事のポイント
・aws_ssm接続プラグインはSSHポート不要でEC2にPlaybookを実行できる
・ターゲットEC2にはIAMロールとSSM Agentの稼働が必須条件
・ファイル転送にS3バケットが必要(ansible_aws_ssm_bucket_nameで指定)
・制御ノードにはAWS CLI v2・session-manager-plugin・boto3の導入が前提
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
なぜSSM経由でAnsibleを実行するのか|踏み台レスの設計思想
AWSで複数のEC2インスタンスをAnsibleで管理する際、従来のSSH接続には次の構成上の課題がありました。課題①: 踏み台(Bastion)サーバーの維持コスト
プライベートサブネットのEC2にSSH接続するには、踏み台サーバーをパブリックサブネットに立てる必要があります。踏み台はOSパッチ管理・ログ監査・費用の3点で継続的な管理コストがかかります。
課題②: セキュリティグループのSSHポート管理
複数の管理者PCのIPアドレスをセキュリティグループのインバウンドルール(ポート22)に追加・削除する作業が発生します。IPが変わるたびに更新が必要で、許可範囲が広がりやすいという問題があります。
これらの課題をまとめて解消するのがSSM(Systems Manager)経由の接続です。SSMはAWS APIを介してインスタンスと通信するため、インバウンドのSSHポートを完全に閉じたままでも構成管理が可能です。踏み台サーバーも不要になります。
Ansibleのaws_ssm接続プラグインは、この仕組みをAnsibleのインベントリ・Playbookに透過的に統合します。接続方法が変わるだけで、Playbookの書き方はSSH接続時とほぼ変わりません。
aws_ssm接続プラグインの仕組み|SSMがSSH代わりになる構造
community.aws.aws_ssmプラグインの動作を理解するために、内部で何が起きているかを整理します。接続の流れ:
・Ansible制御ノードがAWS APIを呼び出し、SSMセッションを開始する
・SSMエージェント(ターゲットEC2上)がセッション要求を受け付け、制御ノードとの通信チャネルを確立する
・PlaybookのタスクはこのチャネルでコマンドとしてEC2へ送信される
・ファイル転送(copyモジュールなど)はS3バケットを経由する(制御ノード→S3→ターゲットEC2)
ネットワーク要件:
ターゲットEC2からSSMのAPIエンドポイントへのアウトバウンド通信が通っている必要があります。インターネットゲートウェイがないプライベートサブネットでは、VPCエンドポイント(ssm・ssmmessages・ec2messages の3つ)を作成することで解決できます。
SSH接続との構成比較:
| 比較項目 | SSH接続(従来) | SSM接続(aws_ssm) |
|---|---|---|
| 踏み台サーバー | プライベートサブネットでは必要 | 不要 |
| インバウンドポート開放 | ポート22が必要 | 不要(完全クローズ可) |
| 認証方式 | SSHキーペア | IAMロール+AWS認証情報 |
| ファイル転送 | SCP/SFTP(SSH経由) | S3バケット経由 |
| 監査ログ | 別途設定が必要 | CloudTrail・SSMセッションログで取得可 |
前提条件を整える|EC2側と制御ノード側の準備
aws_ssmプラグインを使うには、EC2インスタンス側と制御ノード(Ansible実行元)側の両方に準備が必要です。1. EC2インスタンスにIAMロールを付与する
ターゲットEC2インスタンスに、SSMエージェントがAWS APIと通信するためのIAMロールを付与します。最低限必要なマネージドポリシー:
AmazonSSMManagedInstanceCoreこのポリシーは
ssm:*全般ではなく、SSM Agentの動作に必要な最小限の権限(ssm:UpdateInstanceInformation, ssmmessages:CreateControlChannel 等)のみを付与します。最小権限の原則に沿った選択です。ファイル転送(S3経由)を使う場合は、追加でS3バケットへのアクセス権限も必要です。後述のS3設定とあわせてポリシーを設定してください。
IAMロールのアタッチはEC2インスタンスの作成時、または作成後に「アクションメニュー → インスタンスの設定 → IAMロールを変更」から行えます。
2. SSM Agentの動作を確認する
Amazon Linux 2023・Amazon Linux 2はSSM Agentがデフォルトでインストール・起動されています。RHEL 8・9やUbuntu 20.04以降でも公式パッケージが提供されています。SSM Agentが稼働しているか確認する場合は、AWSマネジメントコンソールの「Systems Manager → フリートマネージャー」でインスタンスが「オンライン」と表示されることで確認できます。
インスタンスがフリートマネージャーに表示されない場合は以下を確認してください。
・IAMロールが正しくアタッチされているか
・セキュリティグループがアウトバウンドHTTPS(443)を許可しているか
・VPCエンドポイント(ssm, ssmmessages, ec2messages)が設定されているか(インターネットアクセスなしの場合)
3. 制御ノードの準備(AWS CLI・plugin・コレクション)
Ansible制御ノード(Playbookを実行するサーバーまたはPC)に以下を導入します。# 1. community.aws コレクションをインストールする ansible-galaxy collection install community.aws # 2. boto3・botocore をインストールする(Pythonパッケージ) pip3 install boto3 botocore # 3. AWS CLI v2 がインストール済みであることを確認する aws --version # 出力例: aws-cli/2.15.40 Python/3.11.8 Linux/6.1.0 exe/x86_64.amzn.2023 # 4. AWS Session Manager Plugin をインストールする(Amazon Linux 2023の場合) curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/linux_64bit/session-manager-plugin.rpm" -o "session-manager-plugin.rpm" sudo rpm -U session-manager-plugin.rpm # インストール確認 session-manager-plugin --version # 出力例: 1.2.553.0
~/.aws/credentials)または制御ノード自体がEC2インスタンスであればIAMインスタンスロールでAWS認証を行います。接続に必要な最低限の権限は以下です。
・
ssm:StartSession: SSMセッションを開始する権限・
ssm:TerminateSession: セッションを終了する権限・
ssm:DescribeInstanceInformation: インスタンスの状態を確認する権限・
s3:GetObject / s3:PutObject: S3バケット経由のファイル転送に必要インベントリとPlaybookの設定|aws_ssmで接続先を定義する
1. S3バケットの作成(ファイル転送用)
aws_ssmプラグインのファイル転送(copyモジュール等)はS3バケットを経由します。事前にS3バケットを作成し、制御ノードとターゲットEC2の両方からアクセスできるように権限を設定します。バケット名の例:
my-ansible-ssm-transfer-ap-northeast-1バケットポリシーのポイント:
・パブリックアクセスは完全ブロック(デフォルト設定を維持する)
・制御ノードが実行するIAMユーザーまたはロールに
s3:PutObject を許可する・ターゲットEC2のIAMロールに
s3:GetObject を許可する2. インベントリファイルの設定
# inventory/aws_ssm.ini [webservers] i-0a1b2c3d4e5f67890 [webservers:vars] ansible_connection=community.aws.aws_ssm ansible_aws_ssm_bucket_name=my-ansible-ssm-transfer-ap-northeast-1 ansible_aws_ssm_region=ap-northeast-1
i-xxxxxxxxxxxxxxx)をそのまま使うのが基本です。インスタンスIDはAWSマネジメントコンソールまたはaws ec2 describe-instancesコマンドで確認できます。複数のインスタンスを管理する場合は次のようにグループごとに定義します。
# 複数インスタンスの例 [webservers] i-0a1b2c3d4e5f67890 i-0f1e2d3c4b5a67891 [appservers] i-0b2c3d4e5f6a78902 [all:vars] ansible_connection=community.aws.aws_ssm ansible_aws_ssm_bucket_name=my-ansible-ssm-transfer-ap-northeast-1 ansible_aws_ssm_region=ap-northeast-1
SSM接続を使った実際のPlaybook設計を現場で体験したい方は、>> Ansibleハンズオン講座の詳細を見る をご覧ください。
3. Playbookを実行して接続を確認する
# まず疎通確認(pingモジュール) ansible webservers -i inventory/aws_ssm.ini -m ping # Playbookを実行する ansible-playbook -i inventory/aws_ssm.ini site.yml
pingモジュールを実行した出力例です。i-0a1b2c3d4e5f67890 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python3.9" }, "changed": false, "ping": "pong" }
SUCCESSとpongが返れば接続成功です。この出力が得られるまでSSHポート開放も踏み台サーバーも一切使っていません。トラブルシュート|SSM接続が失敗するときの確認ポイント
「An error occurred (TargetNotConnected) when calling the StartSession operation」SSMエージェントがターゲットEC2でオンライン状態になっていないときに発生します。AWSコンソールの「Systems Manager → フリートマネージャー」でインスタンスが表示されているか確認してください。インスタンスが表示されない場合はIAMロールのアタッチ漏れか、SSM APIへのアウトバウンド疎通が取れていない状態です。
「SessionManagerPlugin is not found」
制御ノードに
session-manager-pluginがインストールされていない場合に発生します。「前提条件を整える」セクションのインストール手順を参照してください。S3へのアクセス権限エラー
ファイル転送(
copyモジュールなど)を使う場合、制御ノードとターゲットEC2の両方がS3バケットにアクセスできる必要があります。IAMポリシーでs3:PutObjectとs3:GetObjectの権限が付与されているか、ansible_aws_ssm_bucket_nameの値が正しいかを確認してください。接続が非常に遅い・タイムアウトする
VPCエンドポイントを使わずインターネット経由でSSMに接続している場合、エンドポイント経由に切り替えると改善します。必要なエンドポイントは
com.amazonaws.ap-northeast-1.ssm・com.amazonaws.ap-northeast-1.ssmmessages・com.amazonaws.ap-northeast-1.ec2messagesの3つです。本記事のまとめ
| やりたいこと | 設定・コマンド |
|---|---|
| SSM接続プラグインを指定する | ansible_connection=community.aws.aws_ssm |
| コレクションをインストールする | ansible-galaxy collection install community.aws |
| ファイル転送用S3バケットを指定する | ansible_aws_ssm_bucket_name=バケット名 |
| リージョンを指定する | ansible_aws_ssm_region=ap-northeast-1 |
| 接続テストを実行する | ansible webservers -i inventory/aws_ssm.ini -m ping |
| Playbookを実行する | ansible-playbook -i inventory/aws_ssm.ini site.yml |
Playbookの書き方は通常のSSH接続と変わらないため、既存の資産をそのまま移行しやすい点も実務上のメリットです。
Ansible実践ハンズオンの詳細を見る >>
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら
- 前のページへ:Ansibleとは何かを台数が増える現場から理解する|同じ設定を何台にも配り続けるための道具
- この記事の属するカテゴリ:Ansibleへ戻る

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