strt's blog

🗒🔨🙍

ゲーム用サーバに監視を仕込んだ(Cloudflare Email Workers)

2025/01/24

友達とValheimで遊ぶために、カゴヤでVPSを借りて専用サーバを運用しているのですが、先日「瞬断した」という報告があったので、最低限の死活監視をすることにしたので備忘録です。

前提条件

  • カゴヤのVPSの基本機能である「Ping監視」を利用
  • 上記機能は、Pingが通らなくなったらメールを送付してくれる、という機能

要件

  • メールを受け取り、それを元にLINEに通知する
  • 追加で費用はかけない想定

構成検討

Gmail + Apps Script

真っ先に浮かんだ構成の一つでしたが、Apps Scriptの管理が面倒なのと、これのためにGmailを新たに取得する or 既存のものを使う、ということをしたくなかったのでやめました。

Amazon SES + Lambda

こちらもすぐ浮かんだ構成の一つでした。SESで送信元ドメインに応じたフィルタがかけられないことで、Lambdaがガンガン回る可能性が少しありそうでやめときました。

Cloudflare Email Workers(採用)

これは調べたら出てきたのですが、Cloudflare Email Routingで登録したメールに対し、Email Workersを設定すると、届いたメールをWorkerに送ってそこから処理ができるサービスでした。Cloudflare Tunnel用にドメイン取っていたのと、Workerがフリープランで行けるので、採用にしました。

作業の流れ

LINE公式アカウント作成・チャネルの作成

現状、LINE Messaging APIを使うためには、公式アカウントを発行したうえでチャネルの作成をする必要があるので、このドキュメント などを参照しながら作成しました。

必要なトークン、ID等の入手

今回は、メールをトリガーに、特定のLINEグループにプッシュメッセージを送付したかったため、以下の情報が必要でした。

  • チャネルアクセストークン
  • グループID

チャネルアクセストークンはこのドキュメントに取り方が書いてあるので取得すればよかったのですが、結構曲者だったのがグループIDです。

LINEの画面上などからグループIDは確認できないようで、これのためだけにWebhookを準備する必要があります。

Webhookでやることとしては、「LINEのトークルーム内でメッセージを手動で送った際、Webhookに送られた情報をパースしてグループIDを取り出し、リプライで返す」という内容です。

GASでWebアプリとしてデプロイして、一時的にWebhookとして指定すればOKです。 なお、GASでやる場合、デプロイ時にアクセス制限をかけると失敗します(一敗)。

Cloudflare Email Routingの設定

このドキュメントのとおりですが、最初の画面でルーティングをクイックに設定するためのフォームが出てくるので、一旦キャンセルしてMXレコード追加、くらいで一旦OKです。

Cloudflare Email Workersの設定

このドキュメントのとおりです。 立ち上げている最中にテンプレートでSlack通知のテンプレートがあるので、それをいじってLINEに飛ばせるようにすればOKです。

また、Email Workersでも環境変数は使用可能です。

スクリプトは大体こんな感じです。が、カゴヤがどんなメール送ってくるかわからないんですよね。ドメインは多分これだろをチョイスしています・・・。

export default {
	async email(message, env, ctx) {
		if (message.from.endsWith("許可ドメイン") || message.from.endsWith("許可ドメイン2") || message.from == "検証用のメールアドレス" ) {
			await fetch("https://api.line.me/v2/bot/message/push", {
				method: "POST",
				headers: {
					"Content-Type": "application/json",
					"Authorization": `Bearer ${env.LINE_CHANNEL_ACCESS_TOKEN}`,
					},
				body: JSON.stringify({
					"to": env.LINE_GROUP_ID,
					"messages": [{
						"type": "text",
						"text": "すみません、Pingがとおりませんでした。"
						}]
					}),
				});
		} else {
			message.setReject("Unknown address");
		}
	}
}

所感

構成決まってからテスト完了まで大体2時間くらいでした。結構LINE Messaging APIに時間取られちゃったりしてましたが、Cloudflare側は本当にスムーズに設定ができました。

とりあえず無料、安心できる環境で運用できそうでよかったという感じです。