Redis
 Computer >> コンピューター >  >> プログラミング >> Redis

Cloudflare WorkersとUpstash Redisを使ってエッジでIP許可/拒否リストを実装する方法

Webサイトへのアクセスを特定のIPアドレスのみに制限したいというニーズはよくあります。この記事では、エッジコンピューティングを活用してIP許可/拒否リストを実装する方法を解説します。まずはCloudflare Workersについて簡単に紹介しましょう。

Cloudflare Workersとは

Cloudflare Workersは、近年非常に注目されているテクノロジーです。2017年に一般公開され、Cloudflare KVストレージも2019年に利用可能になりました。

ここでは細部には立ち入らず、両者を簡単に説明します。Cloudflare Workersを使うと、HTTPリクエストをエッジレベルで傍受し、独自のコードスニペットを実行してリクエスト/レスポンスを操作できます。また、KVストレージを使用すれば、Cloudflare Workers内でネイティブに利用できる辞書型データに対してput/get操作が可能です。プレイグラウンド環境も用意されており、ワンクリックで簡単に試せる点も魅力です。

しかし、Cloudflare KVストレージ以外にも、開発者にとってより高度なデータ構造が必要になる場面があります。さらに、バックエンドやAPI、SDKクライアントなど、外部からKVストレージへアクセスしたいケースもあるでしょう。そこで最近、UpstashのREST APIが利用可能になりました。

これにより、Upstash Redisデータベースに以下の方法でアクセスできるようになります。

  • Cloudflare Workers内からUpstash REST API経由でアクセス
  • コマンドラインターミナルからredis-cliでアクセス
  • 各プログラミング言語向けのRedisクライアントからアクセス

サンプルのコードスニペットやコマンドについては、データベース詳細ページにある「connect」ボタンをクリックして確認してください。

それでは、Cloudflare Workersを使った小さなアプリケーションを作成しながら、Upstash Redis REST APIを一緒に見ていきましょう。

アプリケーション概要

Redisを信頼できる情報源(Source of Truth)として、Cloudflare Worker上でIP許可/拒否を実装します。

前提条件

  • サーバーレスRedisデータベース(Upstashコンソールから作成できます)
  • Cloudflareアカウント、またはCF Playgroundの利用
  • JavaScriptの基礎知識
  • Cloudflare Workersの基礎知識

:::note
Upstashデータベースを作成する際は、Global Databaseを選択してください。グローバルデータベースは複数リージョンにデータをレプリケートするため、エッジ関数からのレイテンシを低減できます。
:::

それでは、Cloudflare Workerを作成してリクエストを傍受してみましょう。Workerを作成すると、サンプルコードが自動的に生成されます。

実装

まず、訪問者のIPアドレスを取得します。

async function handleRequest(request) {
  const ip = request.headers.get("cf-connecting-ip");
  return new Response(ip);
}

ヘッダーから訪問者のIPアドレスを取得できました。次に、このIPアドレスが許可リストに含まれているかどうかを確認します。REST APIを1回呼び出すだけで実現できるので、コードを改善していきましょう。

async function handleRequest(request) {
  const ip = request.headers.get("cf-connecting-ip");
  res = await fetch(
    "https://YOUR_DATABASE_ENDPOINT/sismember/allowed-set/" +
      ip +
      "?_token=YOUR_REST_API_TOKEN"
  );
  if ((await res.text()).includes("1")) {
    return new Response(ip + " is allowed.");
  }
  return new Response(ip + " is not allowed.");
}

このコードでは、Upstash Redisサーバーに対してREST APIを呼び出し、そのIPアドレスがリストに存在するかを確認しています。結果に「1」が含まれていればリストに存在することを意味し、含まれていなければ存在しないということです。

Redisのセットは、redis-cliから以下のコマンドで更新できます。

sadd allowed-set $IP_ADDRESS

まとめと今後の展望

これにより、REST API経由でRedisサーバーインスタンスにアクセスできるようになりました。ほぼすべてのコマンドがREST APIでサポートされています。詳細については、公式ドキュメントをご覧ください。

Cloudflare KVストレージの場合、KVディクショナリAPIしか使えず、サードパーティアプリケーションからCloudflare Workers KVへアクセスするのは容易ではありません。一方、Redisには豊富なクライアントSDKやredis-cliが用意されており、UpstashではさらにREST API経由でもRedisデータベースにアクセス可能です。

このシンプルなアプリケーションは、Cloudflare Workers上の一種のセキュリティガードへ拡張できます。ユーザーはRedisデータベース内の設定値を変更でき、Cloudflare Worker側はその設定をRedisから読み取る仕組みです。

  1. エッジキャッシングで実現する、世界どこでも5ミリ秒のRedisレイテンシ

    Redisでは、データベースとクライアントが同じリージョン内にあれば、1ミリ秒のレイテンシは容易に実現できます。しかし、クライアントが世界中に分散している場合、レイテンシは100ミリ秒を超えてしまいます。この課題を解決するために開発されたのが「Edge Caching(エッジキャッシング)」です。 エッジキャッシングとは エッジキャッシングでは、CDNと同じようにREST APIのレスポンスが世界各地のエッジロケーションにキャッシュされます。エッジキャッシングを有効にすると、平均5ミリ秒というグローバルレイテンシを実現できます。実際に、10の異なるリージョンに配置したクライアントからレイテンシ

  2. Cloudflare WorkersとRedisで実現するエッジコンピューティング活用術

    エッジコンピューティングは、近年もっとも注目されている技術のひとつです。CDNがファイルをユーザーの近くに配置できるようにしたのと同じように、エッジコンピューティングはアプリケーションそのものをユーザーの近くで実行できるようにします。これにより、開発者はグローバルに分散され、高いパフォーマンスを発揮するアプリケーションを構築できるようになります。 Cloudflare Workersとステートレス性の課題 現在この分野をリードしている製品がCloudflare Workersです。コールドスタートのないサーバーレス実行環境を提供し、Cloudflareのグローバルネットワークを活かすことで、ア