はじめに

はじめまして、クラウドインテグレーション事業部の竹内です。
この記事は『クラウドインテグレーション事業部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に関するネタを投稿してみました。少しでもお役に立てれば幸いです。

次回の記事は茅根さんの記事が公開される予定です!お楽しみに!