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から読み取る仕組みです。
-
エッジキャッシングで実現する、世界どこでも5ミリ秒のRedisレイテンシ
Redisでは、データベースとクライアントが同じリージョン内にあれば、1ミリ秒のレイテンシは容易に実現できます。しかし、クライアントが世界中に分散している場合、レイテンシは100ミリ秒を超えてしまいます。この課題を解決するために開発されたのが「Edge Caching(エッジキャッシング)」です。 エッジキャッシングとは エッジキャッシングでは、CDNと同じようにREST APIのレスポンスが世界各地のエッジロケーションにキャッシュされます。エッジキャッシングを有効にすると、平均5ミリ秒というグローバルレイテンシを実現できます。実際に、10の異なるリージョンに配置したクライアントからレイテンシ
-
Cloudflare WorkersとRedisで実現するエッジコンピューティング活用術
エッジコンピューティングは、近年もっとも注目されている技術のひとつです。CDNがファイルをユーザーの近くに配置できるようにしたのと同じように、エッジコンピューティングはアプリケーションそのものをユーザーの近くで実行できるようにします。これにより、開発者はグローバルに分散され、高いパフォーマンスを発揮するアプリケーションを構築できるようになります。 Cloudflare Workersとステートレス性の課題 現在この分野をリードしている製品がCloudflare Workersです。コールドスタートのないサーバーレス実行環境を提供し、Cloudflareのグローバルネットワークを活かすことで、ア