CloudflareのNotificationsはUIから1個ずつ設定するのがとにかくだるい。 種別も多いし、手動でDiscord Webhookを登録していくのは非現実的。
Cloudflare APIとWorkersを組み合わせて全通知を一括登録する。
構成
Cloudflare Notifications
↓
Cloudflare Worker (受け口)
↓
Discord Webhook
Cloudflare NotificationsはWebhook送信に対応しているので、Workerを受け口にしてDiscordに転送する。
1. Discord Webhookを作成
通知を飛ばしたいDiscordチャンネルの設定から作成する。
チャンネル設定 → Integrations → Webhooks → New Webhook → Copy Webhook URL
2. Cloudflare Workerを作成
Cloudflareダッシュボードから Workers & Pages → Create → Hello World で作成する。
名前は cf-notify-discord など適当につけてDeploy。
エディタ画面で以下のコードに置き換える。
export default {
async fetch(request, env) {
if (request.method !== "POST") {
return new Response("ok");
}
let body;
try {
body = await request.json();
} catch {
return new Response("invalid json", { status: 400 });
}
const message = {
username: "Cloudflare",
embeds: [{
title: body.text?.title || "Cloudflare Notification",
description: body.text?.description || JSON.stringify(body, null, 2),
color: 0xF6821F,
timestamp: new Date().toISOString()
}]
};
await fetch(env.DISCORD_WEBHOOK, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(message)
});
return new Response("ok");
}
}
Discord WebhookのURLはWorkerのSettings → Variables and Secretsでシークレットとして登録する。
- 変数名:
DISCORD_WEBHOOK - 値: DiscordのWebhook URL
3. API Tokenを作成
My Profile → API Tokens → Create Token → Create Custom Token
必要な権限は以下のみ。
| スコープ | リソース | 権限 |
|---|---|---|
| Account | Notifications | Edit |
4. 全通知種別を一括登録するスクリプト
#!/bin/bash
ACCOUNT_ID="${1}"
API_TOKEN="${2}"
WEBHOOK_URL="${3}" # WorkerのURL
if [ -z "$ACCOUNT_ID" ] || [ -z "$API_TOKEN" ] || [ -z "$WEBHOOK_URL" ]; then
echo "Usage: $0 <account_id> <api_token> <worker_url>"
exit 1
fi
BASE_URL="https://api.cloudflare.com/client/v4/accounts/${ACCOUNT_ID}/alerting/v3"
AUTH_HEADER="Authorization: Bearer ${API_TOKEN}"
echo "=== 利用可能なアラート種別を取得 ==="
ALERTS=$(curl -s -X GET "${BASE_URL}/available_alerts" \
-H "${AUTH_HEADER}" \
-H "Content-Type: application/json")
ALERT_TYPES=$(echo "$ALERTS" | jq -r '.result | to_entries[].value[].type')
echo "=== Webhook登録 ==="
WEBHOOK_RESP=$(curl -s -X POST "${BASE_URL}/destinations/webhooks" \
-H "${AUTH_HEADER}" \
-H "Content-Type: application/json" \
--data "{
\"name\": \"Discord Worker\",
\"url\": \"${WEBHOOK_URL}\"
}")
WEBHOOK_ID=$(echo "$WEBHOOK_RESP" | jq -r '.result.id')
echo "Webhook ID: ${WEBHOOK_ID}"
if [ -z "$WEBHOOK_ID" ] || [ "$WEBHOOK_ID" = "null" ]; then
echo "Webhook登録失敗"
echo "$WEBHOOK_RESP"
exit 1
fi
echo "=== 全アラート種別にNotification登録 ==="
for ALERT_TYPE in $ALERT_TYPES; do
echo -n "登録中: ${ALERT_TYPE} ... "
RESP=$(curl -s -X POST "${BASE_URL}/policies" \
-H "${AUTH_HEADER}" \
-H "Content-Type: application/json" \
--data "{
\"name\": \"${ALERT_TYPE}\",
\"enabled\": true,
\"alert_type\": \"${ALERT_TYPE}\",
\"mechanisms\": {
\"webhooks\": [{\"id\": \"${WEBHOOK_ID}\"}]
}
}")
SUCCESS=$(echo "$RESP" | jq -r '.success')
if [ "$SUCCESS" = "true" ]; then
echo "OK"
else
ERROR_CODE=$(echo "$RESP" | jq -r '.errors[0].code')
if [ "$ERROR_CODE" = "17103" ]; then
echo "SKIP (フィルター必須)"
else
echo "FAIL"
echo "$RESP" | jq '.errors'
fi
fi
done
echo "=== 完了 ==="
実行方法。
chmod +x setup_cf_notifications.sh
./setup_cf_notifications.sh <account_id> <api_token> <worker_url>
jq が必要なので未インストールの場合は入れておく。
# Arch Linux
sudo pacman -S jq
# Ubuntu/Debian
sudo apt install jq
Account IDの確認
Cloudflareダッシュボードのトップページ右サイドバーに表示されている32文字の英数字。
cfut_から始まる文字列はAPI Tokenなので間違えないこと。
5. 動作確認
WorkerのURLに直接POSTしてDiscordに通知が飛ぶか確認する。
curl -X POST "https://cf-notify-discord.{サブドメイン}.workers.dev" \
-H "Content-Type: application/json" \
--data '{
"text": {
"title": "テスト通知",
"description": "Cloudflare通知のテストです"
}
}'
Discordに飛んでくれば完了。
注意点
- エラーコード
17103が出る種別はフィルターの指定が必須なためSKIPされる。これらは手動で個別設定が必要 - API Tokenは作業後に削除しておく
- Cloudflare Workers無料枠は1日10万リクエストなので通知の受け口程度であれば実質無料で運用できる