Minecraftサーバへのユーザ参加をSlackに通知する with Fluentd and CDK
2022/03/19 追記
この程度のことにKinesis Data Streamを使うと料金が高かったので,SQSを使う方法に変更しました. 最新のソースはmainブランチを見てください.
知り合いと遊ぶためにMinecraftサーバを立ててみました. 他のユーザがサーバに参加したときに通知がほしいなと思ったのですが,公式でそういった機能は無いようだったので,AWSの勉強がてら仕組みを作ってみました.
ちなみにMinecraftサーバは,よく事例を見かけていたConoHaのVPSに立てました.
cf. Minecraft(マインクラフト)|VPSならConoHa
環境
- Minecraftサーバ
- on ConohaVPS
- Ubuntu 20.04
- Java版 1.81.1
- td-agent: 4.3.0 (fluentd 1.14.3)
- AWS CDK (Cloud Development Kit): 2.15.0
- AWSリージョン: ap-northeast-1
構成
仕組み
- Minecraftのログ(
/opt/minecraft_server/logs/latest.log
)をFluentdでKinesis Data Streamsのログ用ストリームに送る - ストリームをイベントソースとするLambdaファンクションでログを解析し,ユーザ参加のログを発見したらSlackに通知する
AWSのリソース作成に使ったツール
AWS CDK (Cloud Development Kit) を使いました. CDKはCloudFormationで作るようなAWSリソーススタックを,より簡単に(高いレベルの観点で)作成できるものです.
cf. AWS クラウド開発キット – アマゾン ウェブ サービス
作ったものはこちらに置いてあります.
環境の作り方
SlackのWebhook URL発行
SlackのIncoming Webhookを作成してください.
cf. Slack での Incoming Webhook の利用 | Slack
CDKでAWSのリソース作成
$ cdk deploy -c slackWebhookUrl=<SLACKのWebhook URL>
IAMにMinecraftManStack-MinecraftServer
で始まるユーザができるので,アクセスキーを発行してください.
Minecraftサーバでやること
まず,Fluentdをインストールしてください.
つぎに,Fluent plugin for Amazon Kinesisをインストールしてください.
cf. awslabs/aws-fluent-plugin-kinesis: Fluent Plugin for Amazon Kinesis
インストールが終わったら,/etc/td-agent/td-agent.conf
を次のように編集します.
<source>
type tail
format none
path /opt/minecraft_server/logs/latest.log
pos_file /opt/minecraft_server/logs/latest.log.pos
tag log.minecraft
</source>
<match log.minecraft>
@type kinesis_streams
region ap-northeast-1
stream_name minecraft-log
aws_key_id <IAMで発行したアクセスキーID>
aws_sec_key <IAMで発行したシークレットアクセスキー>
</match>
td-agentが記録するポジションファイルは手動で作っておきます(自動作成はパーミションエラーになったため).
# touch /opt/minecraft_server/logs/latest.log.pos
# chown td-agent:td-agent /opt/minecraft_server/logs/latest.log.pos
さいごに,tg-agentサービスを再起動します.
# systemctl restart td-agent
動作確認
これで,Minecraftサーバに誰かがログインすると,Slackに通知が来るようになります.
課題
たぶんKinesis Data StreamsからLambdaの間だと思うのですが,即時でデータが渡らず,MinecraftサーバへのログインからSlack通知まで2-3分かかります. Kinesis Data Streamsの構成の問題だと思うので,後日改善したいです.