特定のホストの紐付かないメトリックをMackerelのプラグイン経由で監視する場合、AWSであればEC2上に監視専用のホスト(いわゆるmonitoringホスト)を立てることが多いです。これは便利な一方で、以下のような問題点があります。
- EC2ホストの面倒を見ないといけない
- 趣味で使う用途だとEC2のホスト台を毎月あまり払わずに済むとうれしい
特に一番最初の面倒を見るコストが一番大きいわけですが、サーバーレス/コンテナ時代なので、いいソリューションがあればそれに乗りたいわけです。先行研究がすでに存在していて、AWS Lambdaで試されている方がおられます。
自分でも似たようなことをAWS Fargate上でやっているのですが、せっかくなのでどんな感じでやっているか簡単に書いておきます。
mkrおよびプラグインが入ったdockerイメージを作る
mkrやMackerelプラグインを入れるDockerfileを書きます。
FROM centos:centos7 RUN yum install -y curl sudo RUN curl -fsSL https://mackerel.io/file/script/setup-yum-v2.sh | sh RUN yum install -y mackerel-agent mackerel-agent-plugins mackerel-check-plugins mkr RUN mackerel-agent init -apikey='XXXXXXXXXXXXXXXX' # install plugin RUN mkr plugin install tjinjin/mackerel-plugin-aws-billing RUN mkr plugin install mackerelio/mackerel-plugin-aws-batch RUN mkr plugin install mackerelio/mackerel-plugin-aws-step-functions WORKDIR /app ADD monitor /app/monitor CMD /app/monitor
Fargate上で実行するshellスクリプトを用意
プラグインを実行して、その出力をmkrを使ってMackerelにメトリックとして投稿します。サービスメトリックとして投稿しても、ホストメトリックとして投稿してもよいと思います。
#!/bin/bash ACCESS_KEY_ID="XXXXXXXX" SECRET_ACCESS_KEY="YYYYYYYYYY" MACKEREL_HOST_ID="ZZZZZZZZZ" /opt/mackerel-agent/plugins/bin/mackerel-plugin-aws-billing -access-key-id=${ACCESS_KEY_ID} -secret-access-key=${SECRET_ACCESS_KEY} | mkr throw --host ${MACKEREL_HOST_ID} /opt/mackerel-agent/plugins/bin/mackerel-plugin-aws-batch -access-key-id=${ACCESS_KEY_ID} -secret-access-key=${SECRET_ACCESS_KEY} -job-queue=go-active-learning -region=us-east-1 | mkr throw --host ${MACKEREL_HOST_ID}
まだ存在しないmonitoringホストを指定したい場合、API経由で新規ホストとして登録するとよいでしょう。
以上をbuildして、ECRにイメージを登録します。
タスクを定期的に実行する
先ほど書いたshellスクリプトを対象にしたタスクを定期的に走らせます。私の場合はCloudwatchイベントで定期的に走らせています(趣味のものなので、例えば1時間に1回とかの頻度で特に困らない。どうせすぐには対応できないことも多いので...)。
そもそも論として
Mackerel公式のAWS/Azureインテグレーションが充実すれば、ユーザーがこういったmonitoringホストを立てる工夫をする必要がなくなるという話があって、それはその通りだと思います(著者はMackerelの開発者の一人です)。インテグレーションも最近どんどん増やしていっていますが、インテグレーションで対応しきれないすごくニッチなメトリックを取りたいというケースは今後もmonitoringホスト相当のものが必要なケースはあると思います。そういったときはAWS Lambdaや今回紹介したようなFargateを使った方法を試してもらえるといいかもしれません。