AnsibleをAWS SSM経由で実行する構成|踏み台を置かずにプライベートサブネットのインスタンスへ設定を配る

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Ansible > AnsibleをAWS SSM経由で実行する構成|踏み台を置かずにプライベートサブネットのインスタンスへ設定を配る
「プライベートサブネットのEC2をAnsibleで管理したいが、踏み台サーバーを立てる余裕がない」「全インスタンスのSSHポートを開放しているのがセキュリティ上の懸念だ」

こういった構成上の課題を解消するのが、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の導入が前提


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

なぜ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

制御ノードでは、IAMユーザーのアクセスキー(~/.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

インベントリのホスト名にEC2インスタンスID(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

Amazon Linux 2023の実機でpingモジュールを実行した出力例です。

i-0a1b2c3d4e5f67890 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python3.9" }, "changed": false, "ping": "pong" }

SUCCESSpongが返れば接続成功です。この出力が得られるまで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:PutObjects3:GetObjectの権限が付与されているか、ansible_aws_ssm_bucket_nameの値が正しいかを確認してください。

接続が非常に遅い・タイムアウトする

VPCエンドポイントを使わずインターネット経由でSSMに接続している場合、エンドポイント経由に切り替えると改善します。必要なエンドポイントはcom.amazonaws.ap-northeast-1.ssmcom.amazonaws.ap-northeast-1.ssmmessagescom.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
aws_ssm接続プラグインを採用することで、踏み台サーバーの維持コストとSSHポート管理の複雑さを同時に解消できます。IAMによる認証・CloudTrailによる操作ログ・VPCエンドポイントによる通信経路の制御と組み合わせることで、セキュリティ要件の厳しい環境でも使える構成管理の設計が実現できます。

Playbookの書き方は通常のSSH接続と変わらないため、既存の資産をそのまま移行しやすい点も実務上のメリットです。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、20年以上の運用経験を持つ現役エンジニアが基礎から教えます。
Ansible実践ハンズオンの詳細を見る >>

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。