ottijp blog

Minecraftサーバへのユーザ参加をSlackに通知する with Fluentd and CDK

2022-03-08AWSCDKMinecraftFluentd


2022/03/19 追記

この程度のことにKinesis Data Streamを使うと料金が高かったので,SQSを使う方法に変更しました. 最新のソースはmainブランチを見てください.

cf. ottijp/minecraft-man


知り合いと遊ぶために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

構成

structure

仕組み

  • Minecraftのログ(/opt/minecraft_server/logs/latest.log)をFluentdでKinesis Data Streamsのログ用ストリームに送る
  • ストリームをイベントソースとするLambdaファンクションでログを解析し,ユーザ参加のログを発見したらSlackに通知する

AWSのリソース作成に使ったツール

AWS CDK (Cloud Development Kit) を使いました. CDKはCloudFormationで作るようなAWSリソーススタックを,より簡単に(高いレベルの観点で)作成できるものです.

cf. AWS クラウド開発キット – アマゾン ウェブ サービス

作ったものはこちらに置いてあります.

ottijp/minecraft-man at v1

環境の作り方

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をインストールしてください.

cf. Installation - Fluentd

つぎに,Fluent plugin for Amazon Kinesisをインストールしてください.

cf. awslabs/aws-fluent-plugin-kinesis: Fluent Plugin for Amazon Kinesis

インストールが終わったら,/etc/td-agent/td-agent.confを次のように編集します.

/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に通知が来るようになります.

slack message

課題

たぶんKinesis Data StreamsからLambdaの間だと思うのですが,即時でデータが渡らず,MinecraftサーバへのログインからSlack通知まで2-3分かかります. Kinesis Data Streamsの構成の問題だと思うので,後日改善したいです.

refs


Satoshi SAKAO (@ottijp)

都内でアプリケーションエンジニアをしています

...
© 2022, ottijp