Synology NAS上のDockerコンテナをAzure Monitor Log Analyticsで監視する

はじめに

家庭内ではSynology NAS DS220+ を愛用しています。CPUは貧弱だけどDockerコンテナも動かせるため、自前Minecraftサーバの運用にぴったりです。

Azure Monitorの一機能である、Log Analyticsに、Synology NASのDockerコンテナログを収集する設定を行ったので備忘録としてエントリします。

構成

Synology NAS上に新たにOMS agentのコンテナを特権モードで起動させ、他のコンテナの情報含めてAzure上のLog Analyticsに転送します。

収集できる項目

Docker上で動作しているコンテナの各種ステータス(起動状態、使用CPU/メモリ状態など)の他に、個々のコンテナが出力したSTDOUT, STDERRの情報を収集できます。

細かい収集可能な情報は本家ドキュメントを参考にしてください。

Azure Monitor のコンテナー監視ソリューション

後述しますが、Synology NAS上のDockerデーモンはlog-driverの設定が独自のものになっているため、STDOUT, STDERRの情報をLog Analyticsに送りたい場合には少し細工が必要でした。

構築・設定手順

Log Analyticsワークスペースの作成

Azureポータルからさくっと作成します。ログイン後、左上の「+」にて新規リソースの作成を選び、検索項目に「oms」とか打ち込むとプルダウンメニューの候補に「Log Analytics Workspace」が出るのでそちらをクリックします。

「ログ分析(OMS)」となっているリソースがLog Analytics Workspaceです。わかり辛いですよね。こちらを「作成」します。

リソースグループ、名前は適当に。地域は私は関東在住なので東日本を選択しました。特に価格レベルはデフォルトのままで良いでしょう。データ保存に関しては30日間は無料です(データインジェスト(登録)、ログ検索にかかる課金は別途かかりますが)

無事作成完了です。

メニューの「エージェント管理」を開き、「ワークスペースID」と「主キー」の内容をメモ帳などにコピペして控えておきます。

OMS agentのコンテナ起動

こちらですが、冒頭で紹介したMSドキュメントに書かれているDocker Hub上のOMS agentは現在公開されていないため(2021/9/20時点)、以下のドキュメントを参考に設定します。

Microsoft/OMS-docker

通常のUbuntuとかFlatcar上で動作しているDockerサーバであれば、「To use OMS for all containers on a container host」に書かれているコンテナ起動手順の通りで問題ないのですが、Synology NAS上のDockerでは少し修正が必要でした。

【ドキュメント上の起動手順】

sudo docker run --privileged -d \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v /var/log:/var/log \
  -v /var/lib/docker/containers:/var/lib/docker/containers \
  -e WSID="your workspace id" \
  -e KEY="your key" \
  -p 127.0.0.1:25225:25225 -p 127.0.0.1:25224:25224/udp \
  --name="omsagent" -h=`hostname` --restart=always \
  mcr.microsoft.com/azuremonitor/containerinsights/ciprod:microsoft-oms-latest

【Synology NASで実行する場合の修正点(太字部分)】

sudo docker run --privileged -d \

  --log-driver="json-file" \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v /var/log:/var/log \
  -v /var/packages/Docker/var/docker/containers:/var/lib/docker/containers \
  -e WSID="your workspace id" \
  -e KEY="your key" \
  -p 127.0.0.1:25225:25225 -p 127.0.0.1:25224:25224/udp \
  --name="omsagent" -h=`hostname` --restart=always \
  mcr.microsoft.com/azuremonitor/containerinsights/ciprod:microsoft-oms-latest

Synology NAS上のDockerサーバはlog driverに独自のものを使っており、この状態ではSTDOUT, STDERRの内容をOMS agentが取得してLog Analyticsに送れないので、ログを送りたいコンテナに対しては個別に「–log-driver="json-file"」を上書き設定するようにしました。

また、コンテナ情報が保存されているディレクトリが標準と異なるので、こちらも変更しています。

DMS上のDockerのUIでは、細かいパラメータの設定が行えないため、sshでSynology NASにログインしての操作となります。

DSMの画面からも起動状態が確認できました。

折角なのでMinecraftサーバコンテナのログもLog Analyticsに転送

上記までの設定だと、OMS agentのログしかLog Analyticsに転送されなくてつまらないので、すでに動作しているMinecraftサーバのコンテナも一度停止させて、別名で–log-driver="json-file" に変更したコンテナを起動させておきます。

docker run -d -it --name MinecraftBedrockServerOMS \
	--log-driver="json-file" \
	-e "VERSION=LATEST" \
	-e "SERVER_PORT=19132" \
	-e "EULA=TRUE" \
	-e "CORRECT_PLAYER_MOVEMENT=" \
(中略)
	-e "SERVER_NAME=NAS Bedrock Server" \
	-p 19132:19132/udp \
	-v /volume1/docker/minecraft/data:/data \
	itzg/minecraft-bedrock-server

DSMのコンテナ一覧の画面です。他にzabbix関連のコンテナも動作させていますが、log-driverの設定を変更したのはomsagentとMinecraftBedrockServerOMSのふたつだけです。

コンテナ管理ソリューションのインストール

必須ではありませんが、Log Analyticsに「コンテナ管理ソリューション」を入れると、ちょっとだけログの確認が楽?になります。

Azureポータルの左上の「+」選択後、検索欄に「コンテナー監視」と入力して検索します。一覧にある「コンテナー監視ソリューション」をクリックします。

「作成」をクリックします。

リソースグループ、Azure Log Analyticsワークスペースには先に作成したLog Analyticsを指定します。

出来上がったら、Log Analyticsのメニューから「ソリューション」を選択すると、「Containers(…)」が追加されているので、そちらをクリックします。

概要欄にすでにコンテナの実行状態の円グラフが出ていますね。こちらをクリックすると詳しい情報が見られるようになります。

CONTAINER LOGSの一覧を見るとわかりますが、RUNNING状態のコンテナは5つ(OMS Agent, Minecraft, Zabbix×3)なのに対して、ログが記録されているコンピュータはMinecraftとOMS agentだけということが確認できますね。

ログの活用

例えばMinecraftサーバのログ情報が取れるようになったので、適当なクエリを書いて仲間がログインしてきたら、Log Analyticsdのログアラート機能を使って自分に通知を飛ばすなどが出来そうですね。

おわりに

なんだか色々合わせ技過ぎて、誰得な情報になってしまった感はありますが

  • コンテナ用のOMS agentは別にオンプレでも簡単に利用可能
  • 情報の参照先はGithub上の方がより正確
  • Synology NASのDockerもコマンドラインを使えば、まあ普通に使える

といったところでしょうか。