はじめに
はじめまして、クラウドインテグレーション事業部の竹内です。
この記事は『クラウドインテグレーション事業部SRE第三セクションブログリレー企画』の4回目(全6回)の記事になります!
本記事はSession Managerを使用してAnsible実行する方法の解説を行いながら遭遇したトラブルやメリデメについてまとめた記事になります。
前提
コントロールノードはMac端末、ターゲットノードはLinuxサーバー、Windowsサーバーを想定しています。
事前準備
自端末に下記の環境をセットアップをします。
Session Managerプラグイン
AWS CLIでSession Managerを使用してEC2に接続するといった操作を行う際に必要になるAWS CLIのプラグインです。今回はAnsibleから接続しますが、事前にセットアップが必要になります。
Ansible本体
Homebrew、Pyenv+Venv等により導入します。バージョンはansible-core2.17以降が推奨。2.17以降はターゲットノード側(※Linuxサーバー)にPython3.12以降が必要となる為、注意が必要です。ターゲットノード側のPythonバージョンが低い場合は2.16を使用しましょう。

Ansibleコレクション
amazon.aws
インスタンスタイプやリソースタグ等の情報をダイナミックインベントリとして使用したり、AWS CLIに対応したモジュールがプリセットされています。
community.aws
Session Managerによる接続プラグインが提供されています。また、amazon.awsを補完するモジュールも提供されています。
その他
Windowsサーバー向けのモジュールについて名前だけ記載しておきます。
ansible.windows、ansible.utils
Pythonライブラリ
AWS SDK
名前だけ記載しておきます。
boto3、botocore
AWS環境
詳細は割愛しますが、ターゲットノードであるはLinuxサーバー、WindowsサーバーのEC2をそれぞれ作成します。また、冒頭のイメージ図に記載している中継地点のS3バケットが必要になりますので忘れずに作成しておきましょう。
実際にやってみた
Windows向けIISの構築
- インベントリファイル(※Windows、Linux共通)
plugin: aws_ec2
use_extra_vars: yes
regions:
- ap-northeast-1
filters:
instance-state-name: running
tag:Project:
- ssm-test
keyed_groups:
- key: tags['Role']
separator: ''
- key: platform_details
separator: ''
hostnames:
- tag:Name
compose:
ansible_host: instance_id
- プレイブック
- hosts: Windows
become: no
gather_facts: yes
vars:
ansible_connection: aws_ssm
ansible_aws_ssm_bucket_name: session-manager-bucket
ansible_shell_type: powershell
tasks:
- name: Install IIS
win_fuature:
name: Web-Server
state: present
include_sub_features: no
include_management_tools: yes
- 実行結果
$ ansible-playbook -i inventories/aws_ec2.yml -v --diff iis.yml
PLAY [Windows] **********************************************************************************************************************
TASK [Gathering Facts] **************************************************************************************************************
水曜日 06 11月 2024 17:17:54 +0900 (0:00:00.010) 0:00:00.010 ***************
ok: [win2022-test]
TASK [Install IIS] ******************************************************************************************************************
水曜日 06 11月 2024 17:18:10 +0900 (0:00:16.324) 0:00:16.334 ***************
ok: [win2022-test] => {
"changed": false,
"exitcode": "NoChangeNeeded",
"feature_result": [],
"reboot_required": false,
"success": true
}
PLAY RECAP **************************************************************************************************************************
win2022-test : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Playbook run took 0 days, 0 hours, 1 minutes, 46 seconds
水曜日 06 11月 2024 17:19:41 +0900 (0:01:30.328) 0:01:46.662 ***************
===============================================================================
Install IIS ----------------------------------------------------------------------------------------------------------------- 90.33s
Gathering Facts ------------------------------------------------------------------------------------------------------------- 16.32s

Linux向けhttpdの構築
- プレイブック
- hosts: Linux_UNIX
become: yes
gather_facts: yes
vars:
ansible_connection: aws_ssm
ansible_aws_ssm_bucket_name: session-manager-bucket
tasks:
- name: install package
dnf:
name: httpd
state: present
releasever: 2023.6.20241010
- name: ensure always running
systemd:
name: httpd.service
enabled: yes
state: started
no_log: yes
- 実行結果
$ ansible-playbook -i inventories/aws_ec2.yml -v --diff httpd.yml
PLAY [Linux_UNIX] *******************************************************************************************************************
TASK [Gathering Facts] **************************************************************************************************************
水曜日 06 11月 2024 17:51:06 +0900 (0:00:00.009) 0:00:00.009 ***************
ok: [amzn2023-test]
TASK [install package] **************************************************************************************************************
水曜日 06 11月 2024 17:51:10 +0900 (0:00:04.134) 0:00:04.143 ***************
changed: [amzn2023-test] => {
"changed": true,
"rc": 0,
"results": [
"Installed: apr-1.7.2-2.amzn2023.0.2.aarch64",
"Installed: httpd-filesystem-2.4.62-1.amzn2023.noarch",
"Installed: mod_lua-2.4.62-1.amzn2023.aarch64",
"Installed: apr-util-1.6.3-1.amzn2023.0.1.aarch64",
"Installed: httpd-2.4.62-1.amzn2023.aarch64",
"Installed: libbrotli-1.0.9-4.amzn2023.0.2.aarch64",
"Installed: mailcap-2.1.49-3.amzn2023.0.3.noarch",
"Installed: apr-util-openssl-1.6.3-1.amzn2023.0.1.aarch64",
"Installed: httpd-tools-2.4.62-1.amzn2023.aarch64",
"Installed: httpd-core-2.4.62-1.amzn2023.aarch64",
"Installed: mod_http2-2.0.27-1.amzn2023.0.3.aarch64",
"Installed: generic-logos-httpd-18.0.0-12.amzn2023.0.3.noarch"
]
}
TASK [ensure always running] ********************************************************************************************************
水曜日 06 11月 2024 17:51:16 +0900 (0:00:05.967) 0:00:10.110 ***************
changed: [amzn2023-test] => {
"censored": "the output has been hidden due to the fact that 'no_log: true' was specified for this result",
"changed": true
}
PLAY RECAP **************************************************************************************************************************
amzn2023-test : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Playbook run took 0 days, 0 hours, 0 minutes, 14 seconds
水曜日 06 11月 2024 17:51:21 +0900 (0:00:04.491) 0:00:14.602 ***************
===============================================================================
install package -------------------------------------------------------------------------------------------------------------- 5.97s
ensure always running -------------------------------------------------------------------------------------------------------- 4.49s
Gathering Facts -------------------------------------------------------------------------------------------------------------- 4.13s

遭遇したトラブル
WindowsでRunAsが使用できない
RunAsを使用しようするとエラー落ちします。ターゲットノードの接続にSession Managerを使用せずにWinRMを使用する、または、RunASを使用しないで操作したいユーザー(※例えばAdministrator)で接続する等によりエラーを回避できます。この件はGitHubに issue にもあがっているようなので、いつか解消されると思われます。
Session Managerを使用するメリット
ターゲットノード側のセットアップが不要
Session Managerを使用しない場合はWinRMで接続できるようにする必要があり、下記のページにあるようなセットアップの為にターゲットノードの台数に比例した作業時間の確保が必要になります。こういった工程を省ける点はメリットと感じます。
Session Managerを使用する場合であっても、ターゲットノードにSSM Agentの導入及びAmazonSSMManagedInstanceCoreの付与が必要になります。
インベントリファイルのセットアップが不要
Session Managerを使用する場合はインスタンスタイプやリソースタグ等の情報が参照可能な為、インベントリファイルを用意しなくてもグルーピングが行えます。今回は実践していませんが、プレイブックでこれらの情報を変数として埋め込むことも可能です。
Session Managerを使用しない場合は下記のページにある構文に沿ったファイル作成が必要になります。具体的な記述内容は割愛しますが、最低限、グルーピング情報の定義が必要です。
Session Managerを使用するデメリット
実行時間が長い
Session Manager越しの操作はLinuxに対するSSH、Windowsに対するWinRMと比較して著しく実行時間が増えました。ただ、回線状況に影響されると考えられる為、気にならない方もいらっしゃると思います。(おま環
まとめ
個人的にWindowsサーバーに触る機会が増えてきた為、Windowsサーバーを少ない工数で構築する、手軽に検証する方法にフォーカスして、Over SSMに関するネタを投稿してみました。少しでもお役に立てれば幸いです。
次回の記事は茅根さんの記事が公開される予定です!お楽しみに!
