AWS Fargate上でMackerelのプラグインを実行 & 監視する

特定のホストの紐付かないメトリックを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を使った方法を試してもらえるといいかもしれません。