【Notion × Astro】Makeを使ってCloudflare Pagesへのデプロイを完全自動化する(無料枠対応)

はじめに

NotionをCMSとして利用するテックブログ(AstroやNext.jsなど)を構築しました。しかし、記事を書くたびに手動でCloudflareのデプロイボタンを押したり、PCでビルドコマンドを叩くのはナンセンスです。

そこで、iPaaSツールの Make(旧Integromat) を導入し、「Notionで記事ステータスを『Published』にするだけで、勝手にビルドが走る」仕組みを構築しました。

今回は、Makeの無料枠(月間1000オペレーション)を使い切らないための設定や、意外とハマりやすいフィルター設定のコツを含めて、具体的な手順を解説します。

全体の流れ

構築するフローは以下の通りです。Makeという連携ツールを使い、Notionの更新を監視し、条件に合致した場合のみCloudflareに通知を送ります。

  1. Notion: 記事の更新を検知(Updated time)
  2. Filter: ステータスが Published の記事だけを通す
  3. HTTP Request: CloudflareのDeploy Hookを叩く

手順1:CloudflareでDeploy Hookを発行する

まず、Cloudflare Pages側で「外部からビルドを開始するためのURL」を取得します。

  1. Cloudflare Pagesのダッシュボードへ移動
  2. Settings > Build & deployments > Deploy hooks
  3. Add Deploy Hook をクリック
  4. 適当な名前(例: Make-Auto-Deploy)をつけて保存
  5. 発行された Hook URL をコピーしておく

📚 参考: Cloudflare Pages Deploy Hooks公式ガイド


手順2:Makeでシナリオを作成(Notion側)

Makeで Create a new scenario を選択し、最初のモジュール(トリガー)に Notion を追加します。

  • Module: Watch Data Source Items
  • Connection: 自分のNotionアカウントを連携し、許可を与えます。
  • Trigger By: Updated time (※ここが重要)
⚠️ 注意: デフォルトの Created time にしてしまうと、記事を修正(リライト)した時に反応しません。「更新」を検知するために必ず Updated time を選びます。
  • Database ID: 自分のブログ記事を管理しているデータベースを選択します。
💡 Database IDの確認方法 Notionをブラウザで開き、対象データベースのURLを確認してください。 https://www.notion.so/myworkspace/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx?v=... この ?v= の前にある32桁の英数字部分がDatabase IDです。
  • Limit: 一度に取得するデータ数です。通常はデフォルト(例: 2)のままで問題ありません。

手順3:フィルターを設定する(※一番のハマりポイント)

Notionモジュールと、次に繋ぐHTTPモジュールの間の「点線」をクリックしてフィルターを設定します。 ここで 「Statusプロパティの選び方」 を間違えると、公開ステータスになってもデプロイが走りません。

正しい設定

Condition(条件設定):

  1. Notionモジュールから取得したデータ項目の中から、ステータス管理に使っているプロパティを探します(例: Status)。
  2. そのプロパティを展開し、中身のテキストデータである Name を選択します。
  • : Properties Value > Status > Name (具体的なテキストの値を選ぶ!)
  • : Status (オブジェクトそのものを選んではダメ)

Text operators(比較演算子):

  • Equal to(完全一致)を選択します。

Value(比較する値):

  • Published (Notion側で設定している「公開」ステータスの名前と一字一句間違わずに入力します)
💡 ポイント: Status という項目の「箱」ではなく、その中にある具体的な「値(Name)」を指定しないと、いつまで経ってもフィルターの条件を満たしません。

よくある間違いと症状

もし誤って Status オブジェクトそのものや Status.id などを選択した場合、Makeの実行ログを確認すると、フィルター部分で処理が止まっていることがわかります。 ログにはエラーは出ませんが、フィルターの判定が常に false となり、後続のHTTPリクエストが送信されません。


手順4:Cloudflareへ通知(HTTP側)

次に、フィルターを通過した場合のアクションとして HTTP モジュール(Make a request) を接続します。

  • URL: 手順1で発行したCloudflareのHook URLを貼り付け
  • Method: POST
  • Authentication type: No authentication
Hook URLの中に既に認証情報(トークン)が含まれているため、ここでは「認証なし」を選びます。

手順5:無料枠を生き抜くスケジューリング設定

Makeの無料プラン(Free)には 「月間1,000オペレーション」 という制限があります。デフォルトの「15分間隔」で動かすと、すぐに制限を超えてしまいます。

実行間隔1日の実行回数月間オペレーション数(概算)無料枠(1000回)で収まるか
15分96回2,880回以上❌ 超過
60分24回720回以上✅ 問題なし

※オペレーション数は、Notionの更新チェック(1回)+フィルター通過時のHTTP通知(1回)で消費されます。更新がない場合は1回消費です。

左下の時計マークをクリックし、Run scenarioEvery 1 hour(60分) に設定します。これで、記事を公開してから最大1時間のタイムラグはありますが、無料で完全自動化が運用できます。最後にシナリオを「ON」にするのを忘れずに。


よくあるトラブルと解決策

設定したのに動かない場合のチェックポイントです。

1. Notionステータスを変えてもMakeが反応しない

  • 原因: 手順3のフィルター設定が間違っている可能性が高いです。
  • 対策: Makeの「History」タブから実行ログを確認してください。Notionモジュールまでは動いているが、フィルターで止まっている(Bundleが空になっている)場合、Conditionで選んでいるプロパティが Status > Name になっているか再確認してください。

2. Makeは動いているがCloudflareでビルドが始まらない

  • 原因: CloudflareのDeploy Hook URLが間違っているか、HTTPメソッドがPOSTになっていない可能性があります。
  • 対策: 手順1で取得したURLが正しいか、手順4のHTTPモジュールの設定が POST になっているか確認してください。

3. Cloudflareでビルドは走るが失敗する

  • 原因: Notion側のデータ構造と、ブログのビルドプログラム(AstroやNext.js)側で期待するデータ構造に不整合が起きている可能性があります(例:必須プロパティが空など)。
  • 対策: Cloudflare Pagesのダッシュボードでビルドログを確認し、エラーメッセージを特定してください。

まとめ

これで、「Notionで記事を書いてステータスを変えるだけ」で、勝手にブログが更新されるようになりました。

GEO(AI検索)対策としても、SEO対策としても、コンテンツの鮮度は重要です。更新のハードルを極限まで下げるこの自動化は、テックブログ運営において非常に効果的だと感じました。ぜひお試しください。