Next.jsミドルウェアにEdge Flagsを実装して位置情報ベースのコンテンツ制御を行う方法
Edge Flagsは、サーバーレスアプリケーション向けのフィーチャーフラグを簡単に管理できるツールです。Upstash Redisを基盤としており、強力な地理位置情報ルールを備えています。
この記事では、Next.jsのミドルウェアでEdge Flagsを使用し、ユーザーの位置情報に基づいてリクエストを書き換える、シンプルな実装例をご紹介します。
1. フラグを作成する
今回のサンプルアプリでは、EU圏内のユーザーにのみコンテンツを公開したいと考えます。まず、新しいRedisデータベースを作成し、edge-flagsページへ移動しましょう。そこで、作成したデータベースとproduction環境を選択します。
次に、eu-countriesという名前の新しいフラグを作成し、EU加盟国をすべて追加します。

2. セットアップとパッケージのインストール
まだNext.jsアプリをお持ちでない場合は、npx create-next-appコマンドで新規作成できます。その後、以下のコマンドで@upstash/edge-flagsと@upstash/redisパッケージをインストールしてください。
$ npm install @upstash/edge-flags @upstash/redis
続いて、プロジェクトのルートにmiddleware.tsというファイルを新規作成し、以下のコードを記述します。
/middleware.ts
import { NextRequest, NextResponse } from "next/server";
import { Client as EdgeFlags } from "@upstash/edge-flags";
import { Redis } from "@upstash/redis";
const edgeFlags = new EdgeFlags({ redis: Redis.fromEnv() });
export default async function middleware(
req: NextRequest,
): Promise<NextResponse> {
const enabled = await edgeFlags
.getFlag("eu-countries", req.geo ?? {})
.catch((err) => {
console.error(err);
return false;
});
if (!enabled) {
const url = new URL(req.url);
url.pathname = "/blocked";
return NextResponse.rewrite(url);
}
return NextResponse.next();
}
export const config = {
matcher: "/",
};
最後に、アクセス拒否時に表示するための/blockedページをシンプルに作成します。
app/blocked/page.tsx
export default function Page() {
return <div> You are not in the EU</div>;
}
あとは、プロジェクトをVercelにデプロイするだけです。
$ npx vercel
環境変数をVercelに設定する際は、Upstashコンソールから値をコピーするか、UpstashのVercel連携機能を利用すると便利です。

3. 動作確認
開発環境における地理位置情報の注意点
ローカル環境での開発中は、地理位置情報データを取得できません。実際の動作を確認するには、アプリをVercelにデプロイする必要があります。
デプロイ後は、アプリのトップページにアクセスして動作をチェックできます。EU圏内からアクセスした場合は通常どおりコンテンツが表示され、それ以外の地域からの場合はリクエストが/blockedページへリライトされます。
関連リンク
- Edge Flags(公式ドキュメント)
- サンプルコード
- サンプルアプリ
-
Redisでセットの和集合を求める方法 – SUNION・SUNIONSTOREコマンド徹底解説
このチュートリアルでは、Redisデータストアに保存された2つ以上のセット(Set)値に対して和集合演算を実行する方法を、SUNIONコマンドとSUNIONSTOREコマンドを使って解説します。 セットの和集合とは 集合論において、2つ以上の集合の和集合とは、それぞれの集合に含まれるすべての要素(重複は除く)をまとめて持つ集合のことです。具体例を見てみましょう。 A = {1, 2, 3, 4, 5} B = {4, 5, 6, 7, 8, 9} A と B の和集合: A U B = {1, 2, 3, 4, 5, 6, 7, 8, 9} SUNIONコマンドとは SUNIONコマンドは
-
賞金総額10万ドル!「Build on Redis」ハッカソンに参加すべき4つの理由と優勝をつかむ5つのコツ
Redisコミュニティは常にイノベーションを続けています。毎年開催されるハッカソンは、クリエイティブな才能を持つ人々を集め、Redisを使った新しいアイデアを形にするためのプラットフォームを開発者に提供しています。昨年は320名以上のハッカーに挑戦状を突きつけ、キャッシュ用途にとどまらないRedisアプリケーションの構築を促しました。今年はいよいよ「Build on Redis」ハッカソンが開催されます。52の賞品・賞金総額10万ドル(約1,100万円)を獲得するチャンスです!開発開始は4月15日(木)。RedisConfの5日前にスタートし、丸1ヶ月間、5月15日(土)まで続きます。Redi