AWS Systems Manager Run Command を利用した Ansibleの実行
こんにちは、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の インスタンスメタデータのタグを許可する
- EC2からAnsible Playbookを配置しているS3へのアクセス権限
- 実際の運用ではGitHubなどバージョン管理ツールのほうが好ましいですが、今回は検証のためS3からplaybookを取得します。
AWS Systems Manager Run Command で実行する
それでは、上記playbookを用いて Ansibleを各サーバー上で実行していきます。
- 任意のS3にAnsible Playbookをアップロードする
Ansibleをzipで固めてS3にアップロードします。
-
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に関するお役立ち情報を配信中!
Follow @twitter2016年入社のインフラエンジニアです。 写真が趣味。防湿庫からはレンズが生え、押入れには機材が生えます。 2D/3DCG方面に触れていた時期もありました。
Recommends
こちらもおすすめ
-
CloudFormationで認証情報を扱うベストプラクティス
2020.8.7
-
[New Relic] NRQLで文字列を整形して、ほしいデータを取得する
2024.12.24
Special Topics
注目記事はこちら
データ分析入門
これから始めるBigQuery基礎知識
2024.02.28

AWSの料金が 10 %割引になる!
『AWSの請求代行リセールサービス』
2024.07.16

