Auto Scaling環境だからMackerelのidファイルをAMI作成する前に自動削除したい(Windows)

2019.06.19

やりたいこと

MackerelのidファイルをAMI作成する前に自動削除したい

以下のような状況です。

  • WindowsでEC2のAuto Scaling Group(以下ASG)を使用している
  • ASG配下の各EC2インスタンスに mackerel-agentをインストールして監視対象にしている
  • 上記EC2起動AMIにはmackerel-agentも含まれている
  • アプリのデプロイはゴールデンイメージ(=ソースコードなど全ての環境が最新になった状態のAMI)を利用する
  • AMIにはMackerelが自動生成するidファイルを含めてはいけない(後述)
  • そのためAMI生成前にidファイルを削除する必要があるが、毎回手動削除するのは面倒なので、自動化したい

idファイルって何?

Mackerelが自動的に作成するファイルです。管理対象を識別するために作られます。ですので中身は一意な文字列になっています。
Windowsの場合はMackerelインストールフォルダ内に「id」という名前のファイルが作成されます。

なぜidファイルを削除しないといけないの?

前述の通り一意な値が入るidファイルですが、Mackerelがファイルを作成しようとした際にすでにidファイルがあると、Makerelはファイル作成を行いません。
そのため一意であるはずのidファイル内の文字列が重複してしまい、本当は別インスタンスなのにMackerel上では同一インスタンスとして扱われる、というような不都合が発生してしまいます。

実現方法方針

BeforeSysprep.cmd内にファイル削除処理を書いて、Sysprepします。

Sysprepって何?

System Preparation Utilityの略で、Windows OS において、マシン固有情報を削除するツールです。
今回のAuto Scalingの様に、特定の1台のインスタンスで設定を行い、その後イメージ(AMI)化して複数台に横展開していく場合、本来1台ずつのインスタンス毎に固有でないといけないSIDなどの情報が重複してしまう問題が発生します。それを防ぐためにSysprepを利用します。Sysprepを実行すれば、その様なインスタンスの固有情報を削除できます(一般化と言います)。そしてイメージから新インスタンスを立ち上げる際に、都度新たな固有情報が作成されることになります。

BeforeSysprep.cmd って何?

名前の通りなのですが、Sysprepを実行する直前に実行されるスクリプトです。

具体的な手順

※今回の環境のOSはWindows Server 2016です。

1.BeforeSysprep.cmd に処理を追加する

BeforeSysprep.cmdC:\ProgramData\Amazon\EC2-Windows\Launch\Sysprepディレクトリにあります。ファイルを削除する単純な処理を追記します。

del "C:\Program Files (x86)\Mackerel\mackerel-agent\id"

Mackerelのインストールフォルダが C:\Program Files (x86)\Mackerel\mackerel-agentでない場合は適宜書き換えてください。

2. EC2LaunchSettingsでShutdown with Sysprep

まずEC2LaunchSettingsを起動します。

下部のShutdown with Sysprepをクリックします。その後のウインドウもデフォルト値のまま進めて完了させます。

3. AMI作成

インスタンスが停止状態になりますので、AMIを作成しましょう。

4. ASG設定変更

上記 AMIを使う様にASGの設定を変更してください。

まとめ

Mackerelで監視するインスタンスには一意な値が書かれているidファイルが必要で、そのためAuto Scalingで使うAMIにはidファイルを含めてはいけません。Windows環境においてAMI作成前にidファイルを自動的に削除する方法をご紹介しました。

参考情報