AWS Systems Manager Run Command を利用した Ansibleの実行

AWS

2024.2.27

Topics

こんにちは、tkgです。

AWS環境で多数のEC2インスタンスにミドルウェアをインストールする時、オートスケーリング環境であれば最初に手法として上げられるのはゴールデンイメージの更新になるかと思います。
しかし、あまり効果的に利用できない場合や、オートスケーリングできない環境もあるかと思いますので、その時に利用できそうなAWS Systems Manager Run CommandでのAnsibleの実行の手法を試してみました。

今回利用するAnsibleのコード

今回は New Relic のAgentをインストール、Configの書き換えを行うものとしました。
※ New Relic公式では ansible-galaxyを使った手法が提供されています。
様々な環境に利用するケースで利用が難しいと判断したため、CLIインストールの手順をなぞった形のAnsible Playbookを作成しました。

- hosts: localhost
  become: yes
  environment:
    NEW_RELIC_ACCOUNT_ID: "{{ account_id }}"
    NEW_RELIC_API_KEY: "{{ license_key }}"
  vars:
    instance_name: "{{ lookup('url', 'http://169.254.169.254/latest/meta-data/tags/instance/Name') }}"
  tasks:
  - name: Check New Relic agent
    ansible.builtin.stat:
      path: /usr/local/bin/newrelic
    register: nr_installed

  - name: Get install script 
    ansible.builtin.uri:
      url: https://download.newrelic.com/install/newrelic-cli/scripts/install.sh
      return_content: yes
    register: nrinstall
    when: not nr_installed.stat.exists

  - name: Run install script 
    ansible.builtin.shell:
      cmd: "{{ nrinstall.content }}"
    when: 
      - not nr_installed.stat.exists

  - name: Install New Relic
    ansible.builtin.shell:
      cmd: /usr/local/bin/newrelic install -y
    when: not nr_installed.stat.exists

  - name: Configuration update 
    ansible.builtin.blockinfile:
      path: /etc/newrelic-infra.yml
      block: |
        metrics_system_sample_rate: 180
        metrics_process_sample_rate: 180
        metrics_storage_sample_rate: 180
        metrics_network_sample_rate: 180
        display_name: {{ instance_name }}

  - name: Restart New Relic agent
    ansible.builtin.service:
      name: newrelic-infra
      state: restarted

こちらのplaybookは、New Relic Agentがインストールされていなかったらインストールを実施、その後Configの修正を行う というものとしています。

前提となる設定

  • AWS EC2の インスタンスメタデータのタグを許可する
    • 今回はわかりやすいようにNew Relic側の表示名をhostnameではなくtags:Nameを付与する形としました
  • EC2からAnsible Playbookを配置しているS3へのアクセス権限
    • 実際の運用ではGitHubなどバージョン管理ツールのほうが好ましいですが、今回は検証のためS3からplaybookを取得します。

AWS Systems Manager Run Command で実行する

それでは、上記playbookを用いて Ansibleを各サーバー上で実行していきます。

  1. 任意のS3にAnsible Playbookをアップロードする
    Ansibleをzipで固めてS3にアップロードします。

  2. Run Commandを実行する
    それでは実際に Run Commandを実行します。
    2-1. コマンド実行画面に移動し、 AWS-ApplyAnsiblePlaybooksを選択します。

    2-2. コマンドパラメータは下記の通りとします。
    Source Type: S3
    Source Info: { “Path”: “https://[S3の名前].s3.ap-northeast-1.amazonaws.com/[ファイル配置先]” }
    Install Dependencies: True
    Playbook File: playbook.yml (zipで固めた中のymlの名前)
    Extra Variables: SSM=Ture account_id=[New RelicのアカウントID] license_key=[NRAKから始まるapi-key]
    それ以降: 初期値

    2-3. ターゲットの設定は任意で設定します。
    今回はインストール対象サーバーに Environment:devのタグを付与していたのでそちらを指定します。
    Addボタンを押し忘れないようにしましょう。

    その他、設定は任意で設定します。

2-4. コマンドを実行する
設定が完了したら右下の実行ボタンで実行します。すると処理が開始されます。
更新ボタンにて、適宜ステータスが更新可能です。

少しするとステータスが成功になりました。

インスタンスIDをクリックすると、各種出力内容が表示可能でした。
これらを利用してデバッグなども可能そうです。

おわりに

今回は起動したばかりのサーバーでAnsibleがインストールされていませんでしたので、
Install Dependencies オプションで Trueにした通り、 Ansibleのインストールが実行されます。
そのため少し時間がかかりましたが、Ansibleの実行環境ごと作成されるので、既存環境へのデプロイとしては素早い実行が可能でした。
また、Ansibleでべき等性を考慮したコードにすることで、すべての環境で同じ状態とできることもメリットかなと感じます。
IaCをうまく利用して、運用効率を上げていきたいですね。

テックブログ新着情報のほか、AWSやGoogle Cloudに関するお役立ち情報を配信中!

tkg

2016年入社のインフラエンジニアです。 写真が趣味。防湿庫からはレンズが生え、押入れには機材が生えます。 2D/3DCG方面に触れていた時期もありました。

Recommends

こちらもおすすめ

Special Topics

注目記事はこちら