Auto Scaling環境だからMackerelのidファイルをAMI作成する前に自動削除したい(Windows)
やりたいこと
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.cmd
は C:\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ファイルを自動的に削除する方法をご紹介しました。