自作CDNを考えてニタニタしてみる
福田です。これまた実際実現はしていない(主に費用面)妄想記事です。今回は「自作CDNをVPSを組み合わせて作る」という構想を描いていこうと思います。まあ、わざわざ何もCloudFlareとかあるのにわざわざコストをバンバンかけて作る必要はないのですがね。単なる戯れごととして聞いてください。
VPSを主要ターゲット国に設置する
まずはここから。VPSを契約していきます。主にDigitalOceanとConoHa、さくらを用います。わざとAWSとかAzureは使っていません。
DigitalOceanではニューヨークとサンフランシスコ、ロンドンとシンガポールに設置し、また日本はこの記事を書いている以上(笑)、日本をターゲットにするため石狩・関東圏・大阪の堂島に設置します。
配信の仕組み・API
配信の仕組みは単純です。lsyncdを使います。CDNサーバにAPI経由でアップロードされたデータは一時的に特定のフォルダへ保管され、その後距離の近いサーバに順次配信されていきます。例えば関東圏のサーバーはサンフランシスコ、大阪、石狩と相互接続をし、大阪はシンガポールと接続します。サンフランシスコはニューヨークと、ニューヨークはロンドンと、ロンドンは石狩と接続します(この間が長いので間にもう一個入れた方がいいのですが)。さらに東京とシンガポールも予備を兼ねて接続しておきます。この辺りは光ファイバーや衛星の基地局などを見て配置していきます。別にAPIのフックで各サーバに連鎖的にアップロードさせていけばいいのですが、いちいちコネクションを張るネットワークコストなどの面からあまり理想的ではありません。
また、サーバ自体はNginxを用い配信します。料金などはNginxのログとアクセスされたファイルのサイズを見てリクエスト数×ファイルサイズあたりで計算します。月一回、まとめて計算した料金を中央サーバにAPIを用いて送り、そこで全てのサーバーの料金を合算して請求計算をします。当然大手サイトなどになれば集計にも時間がかかるので、締め日と請求日は別になりますね。
マネージメントコンソールなどはSSHを使いますが、セキュリティ上の観点からSSHに接続する際に各ユーザーに紐づいた電話(Twilio)で2段階認証を求めることをします(はいなら1を、いいえなら何も押さないで3秒まつだけの簡単な仕事、以下に挙げる例外除く)。Googleの2段階認証のコードでもいいのですが、電話であれば強盗でもしない限りはクラックするのが難しくなるためです。
一斉にプログラムの更新を適用するプラットフォームもAPIに格納してありますが、これを実行する場合は電話承認を一回だけとってあとは先ほどのように承認プログラムに例外ユーザーとして組み込み、確認をした上で自動実行していきます。
ユーザーのアクセスなどを分散するテクノロジー
このあたり僕は頭が弱いので実装が難しいのですが、BINDなどを改造して、アクセス元IPの割り当て国を検索して出てきた国から最も近いサーバーのIPを動的に返すというのが一番スマートかもしれません。いや、実際のところAWSとかGMOとかがどうやってやっているのかは知らないのですが。
と思ったら、やっぱりあった。BIND9.10からGeoIPという機能があるようです(全く同じことをしようとした人がいました: オレオレCDNを作る – Qiita)。まあ、これをつかうのが一番スマートな選択肢と言えるでしょう。
そのほか
そのほか、情報の変更をリアルタイムで送信してサイトを書き換えるJavascriptなども実装できたらいいな、なんて思います。具体的には、API経由でアップロードされた際にフックを用いてWebSocketに差分を通知し、それを適用させる、みたいな感じで。
あとは動的サイトなども運用できると理想的だな、とも思います。そのために、変化した部分のデータの差分をAIなどに蓄積し、キャッシュして先に送る部分と本体のサーバから取得して送る部分を分ける機能を用意したり、データベースやCookie配信情報などを完全にシェアできるAPサーバ用のライブラリを用意できればな、と思っています。それか、ソースコードをアップロードして各CDNのサンドボックス内で動かすのも良いかもしれませんね。
まとめ
この記事は僕がアメリカに留学していて日本のこのサーバとのpingやたら遅いな…と思ったところから始まりました。だーれも実装しないし僕もきっとこれは実装しないと思いますがあくまでテクニックとして自慢しただけです。それから、日本語を話す時間より英語を話す時間の方が長いので、だんだん日本語能力が落ちて、今文章が超ぐちゃぐちゃです。すいません。許して。以上。
※この記事はStudent Advent Calendar 2016の第20日目の記事として書き上げました。
この記事は最終編集から一年以上経過しております。この記事に書かれた内容をご利用・実践される際は十分ご注意ください。