2025年07月の日記です


akamai の CDN  2025-07-02 18:11:48  コンピュータ

先日、uniqlo のシャツの話題で「akamai」という企業を取り上げた。


話の腰が折れるので、この企業が提供しているサービスについては割愛した。

しかし、面白い技術なので知ってほしい、と思って説明しているページを探してみたものの、的確に書かれたものが見当たらない。


CDN という仕組みを提供している、ということと、その技術について非常に「ふわっと」書かれたページは多い。

ふわっと、というのは書いている人も理解していない、ということだ。


こんなに面白い技術、是非知ってほしいのだけど、書かれたページがないのか…

となれば、自分で書くしかあるまい。




最初に断っておくが、僕自身は akamai の中の人でも何でもないし、利用したこともない。

以前にどこかで聞いて技術概要は知っているが、細かな部分は間違っているかもしれない。


また、以前の Akamai は「CDNの企業」だったのだが、現在はセキュリティなども含めたサーバ運用全般を扱っているようだ。

それに伴い、CDN もどんどん新技術が導入されているようだが、僕はそうした細かなことは知らない。


これから書く話は「基本的な」ものに過ぎない。

現状を正しく表しているものではない、という反面、まだ単純だからわかりやすくもあると思う。




まず、CDN について。Content Delivery Network の略で、コンテンツを届けるネットワーク、という意味になる。


コンテンツという概念はまた微妙なものなのだが、この文脈の中では「WEB ページで提供されるデータ」だと思ってもらってよい。

通常は通信して取得するもので、わざわざ「届けて」もらう必要はないものだ。


ところで、インターネットは世界中と通信できる。

たとえば、海外旅行に行きたくてアフリカの観光サイトを見たとしよう。


もちろん通信できる。でも、ページが表示されるまでに時間がかかる。遅い。

理由は、遠いからだ。世界中と通信できると言っても、遠ければ時間はかかる。


通信は電気で行われていて、光の速さ…とよくいわれるが、途中で何度も中継が入る。

中継点ではコンピューターが処理していて、処理速度は光の速度よりずっと遅い。


距離に応じて中継点も増えるので、遠くへの通信は遅くなるのだ。



CDN は、こうした状況を改善する手段だ。


遠くへ通信するから遅いのだ。

ならば、世界中にサーバーを用意し、キャッシュ(データのコピー)を置いておけばよい。


アフリカのサイトを見ようと思った時に、実際にアフリカに接続するのではなく、日本国内から同じデータを取り寄せられる。

つまり、データが世界中にあらかじめ届けられているわけだ。これが CDN 。


…と、akamai や CDN で検索すると、ここまでの話を書いてあるだけのページが非常に多い。


ただ、そのアイディアが簡単に実現できるほど世の中は甘くない。

キャッシュを行おうとすれば、世界中にそのためのサーバが必要だ。誰がそのサーバの設置・維持料金を払うんだ?


すぐにページが取得できる、というのは、ネット利用者にとってはありがたいけど、それだけでは足りないのだ。




ここで、コンテンツ提供側の立場で考えてみよう。


コンテンツ提供者は、サーバを世界に向けて公開する。

公開する意図があってそうしているのだから、できるだけ多くの人に見てもらいたい。


しかし、ここにいくつかの問題がある。


まず、本当に世界中の人からアクセスが来ると、サーバの処理能力が問題となるのだ。

サーバを、強力な処理能力を持つものに交換しなくてはならない。

実際にはそんなに強力なサーバはないので、「負荷分散」という技術を使って、複数台のサーバで処理することになる。


通信速度の問題も付きまとう。

先にアフリカと通信する例を挙げたが、世界中に配信したとしても、遠くから見てもらうのは遅いのだ。


多くの人に見てもらいたいが、大抵の人はページを開いて、3秒待っても表示されなければ見るのを諦めてしまう。

サーバの処理能力をいくら上げたとしても、距離の問題はいかんともしがたい。


もう一つ、通信料金の問題がある。

個人でネットプロバイダと契約していると、定額制ということが多いのだが、インターネットというのは通信の量によってコストが決まるのだ。(従量制)


つまり、コンテンツ提供側には以下の問題がある


・サーバ増強コストの問題

・「距離」による通信速度の問題

・通信量に応じたコストの問題


このうち、特に距離の問題なんて解決するのが難しくて、世界中にホストを設置しなくてはならない。

これは同時に回線契約の数も増やさないといけないわけで、かかるコストは簡単には見通せない。青天井と言ってよいだろう。


CDN はこれを解決できる。

先に書いたが、世界の世界の各所にキャッシュサーバを置いて、誰かがデータを必要とした際に、近いところからデータを得ようというものだからだ。

自分で設置しようと思えばコストは青天井でも、誰かの設置したものを借りるのであれば、現実的な金額に収まる。


つまり、少なくともコンテンツ提供側は、 akamai と契約してお金を払うだけの価値があるのだ。




ネットには、コンテンツ提供者がいて、それを見たい閲覧者がいる。

しかし、akamai を理解するには、もう一人の登場人物が必要だ。一番重要な役割を担っている。


それが、接続事業者、ネットプロバイダだ。

我々は、ネットに接続するときにネットプロバイダのサービスを使う。


勘違いされやすいのだけど、「回線業者」とは違う。回線業者は NTT など物理的な回線を提供する会社だ。

ネットプロバイダは、この回線を利用して、インターネットに接続するサービスを提供する。


ケーブルテレビのインターネットサービスなど、回線とプロバイダ事業を一体化して提供している場合もある。

携帯電話なども、docomo は回線業者であり、ネットプロバイダでもある。

でも、docomo 回線を借りてネットプロバイダ事業を行う、MVNO 業者のようなところもある。


ともかく、ネットプロバイダはインターネットへの接続サービスを行うのだが、ここで「ネットプロバイダ内」にもネットワークがある。

同じネットプロバイダを利用する顧客は、まずネットプロバイダの小さなネットワークに入り、そこからインターネットに接続しているのだ。


こうした、小さなネットワークが相互接続したもの、というのが「インターネット」のそもそもの語源だ。


さて、ネットプロバイダは通常月額料金を徴収して顧客にネット接続を提供している。

しかし、プロバイダのネットワークの外側にある「インターネット」への接続は、月額固定などではない。

データ通信量に応じて決まる、従量制だ。


つまり、ネットプロバイダにとっては、「社内の」ネットワークへのアクセスで完結してくれればありがたい。

インターネットへの接続コストが減るからだ。

でも、顧客はインターネットに接続したいからこそ、ネットプロバイダと契約している。


ここで akamai の登場だ。


akamai は、ネットプロバイダの「社内ネットワークに」キャッシュサーバを設置する。

すると、世界のどこかにあるはずのコンテンツが、社内にあることになるのだ。

外部へのアクセスが生じないので、ネットプロバイダのコストは減る。


これには副次的な効果もある。

ネットワークは、通信するデータ量が増えれば、より「太い」線が必要になる。

そして、太い線は月額の「基本料」が高い。先ほど従量課金と書いたが、基本料はそれとは別に必ず発生するものだ。


顧客が増え、通信量が増えれば、より太い線が必要になる。

しかし、キャッシュサーバの設置で外部への通信が行われないなら、太い線の契約をしないでも済む。



最初に、akamai のサーバの設置・維持費用は誰が出すのか? と問いかけた。


この答えがここにある。

ネットプロバイダは、社内にサーバを設置することに意味があるので、設置場所を提供し、お金を払ってでも設置を依頼する。


先に書いたように、お金はコンテンツ提供側からももらっているので、設置費用は「設置しない場合の回線利用コスト」よりも安い程度に設定できる。




利用者、コンテンツ提供者、ネットプロバイダ。

ここで、3者の思惑が一致し、キャッシュサーバーを設置すればだれもが幸せになれる状態が出来上がる。


しかし、まだ問題はあるのだ。これを「どうやって」技術的に実現するのだろう?



いちばん簡単な方法は、「すべての」 URL に対するアクセスを受け取るサーバーを作ることだ。


ネットプロバイダ内部からのアクセスを、すべて一旦キャッシュサーバーが受け取る。

キャッシュがあればそれを返し、なければ実際のコンテンツを取りに行く。取得した内容はキャッシュする。


じつは、これは「キャッシュプロクシ」と呼ばれる手法で、akamai 以前から実際に存在した。

そして、特定の目的では非常に有用だったが、一般的に使うには問題の多い方法でもあった。


まず、「プロクシ」について説明しよう。

キャッシュプロクシは、プロクシにキャッシュの機能を後付けしたものだからだ。


そもそもは proxy とは「代理人」の意味だ。


会社など、セキュリティを守る目的で外部のネットワークに直接接続したくない場合に、基本的には全員インターネットへのアクセスを禁止する。

そのうえで、「特定のサーバ」にだけアクセス可能な権限を与え、外部にアクセスしたい場合はそのサーバを経由するようにする。

つまり、外部へのアクセスは、すべて「代理人」に依頼するわけだ。


この特定サーバの事を、「プロクシサーバ」と呼ぶ。


これはもともとアクセスを制限するためのものだ。

全ての通信はプロクシを経由する。だから、ここにキャッシュを入れたり、様々な便利機能を入れることもできる。


その反面、プロクシを使用するといろいろと制限がある。

たとえば、動画を見ることはできないかもしれない。ネットゲームは遊べないかもしれない。


というより、もともとプロクシは前提として「ネット利用禁止」の時に使うのだ。それでも使いたい機能だけを提供する。

会社ならそうした制限はむしろ有用かもしれないが、ネットアクセスを提供することが仕事の「ネットプロバイダ」としては、この手段を使うわけには行かない。


ところで、ネットではプロクシの事を「串」という隠語で呼ぶことがある。

隠語を使う、というのは、悪いことに使う人も多いためだ。


プロクシは「代理人」なので、相手に自分の正体を明かさないでアクセスすることができる…場合がある。プロクシの設定にもよるけど。

何かの理由があって、存在を隠したい人にはとても良い仕組みだ。だから隠語になってしまうのだが。


そういう、何らかの事情がある人には、あえて制限は受け入れたうえで、メリットを得る必要があるのだ。


つまりはメリットとデメリットを秤にかけて、利用者が使うかどうかを選ばないといけない。

決して「自動で使われる」ものであってはならない。


一応、Windows の Chrome や Edge 等でもプロクシの利用は可能だ。

でも、いったいどれだけの人が設定方法を知っているだろう? 普通は使わないで良いものなのだ。


キャッシュサーバーを使うと便利だ、という環境を作りだせたとして、じゃぁ利用するのにはプロクシの設定をお願いね、というのではダメなのだ。

そんな状況では誰も利用しない。


そこで、akamai は巧妙な方法を編み出した。DNS を利用するのだ。




インターネット上のサーバには、IP アドレスが割り振られている。インターネット上の住所、と言われることが多い。

通信を行うときは、「必ず」相手の IP アドレスが必要となる。


でも、URL には IP アドレスは含まれていない。

どうなっているのかというと、「ドメイン名」を元に IP アドレスを調べる方法があるのだ。

その仕組みが DNS だ。


たとえば当ページは www.wizforest.com というドメイン名を使用している。

今ここをアクセスしている人は、DNS を使用してこのドメイン名を IP アドレスに変換し、アクセスしているのだ。


ところで、この DNS というデータベースが、データの登録方法に面白いやりかたを取っている。

話をするうえで必要なので、長くなるが説明しよう。


データベースというのは、普通はデータを1カ所に集約したものだ。

このページの例でいえば、www.wizforest.com 、というドメインに対しての IP アドレスを、どこかに登録しておけばよい。

そうすれば、すぐにドメインから IP アドレスを知ることができる。


実際、ドメインから IP アドレスへの変換は、初期のころは1つのデータベースで行われていたのだ。

たった1つのファイルにすべてのデータを入れ、ネットワークに接続するコンピューターは、そのファイルを取得して使用していた。


(この頃の話は過去に書いている


しかし、ネット上のホストが増えるに従い、この方法は破綻した。

ホストが増えたり減ったりするたびにデータを変更しなくてはならないし、何よりも「世界中の」コンピューターに、最新情報を即座に届けないといけない。

それはもう無理だった。その状況を打開するために考えられたのが、DNS という「分散データベース」だ。


まず、データベースは組織ごとに準備する。

このページでいえば wizforest.com が「組織」であり、そこに www というコンピューターが公開されている、という形式になる。

他にも、メールサーバとか、DNS サーバとか、いろいろなコンピューターが組織内にある。


今、組織内のコンピューターとして「DNS サーバ」と書いた。

僕は自分の DNS サーバに、これら「組織内のサーバ」のデータを記入する。


そして、さらに上の組織… .com の DNS サーバに対して、wizfores.com の DNS サーバアドレスを通達しておく。


これで準備は完了。


誰かが www.wizforest.com にアクセスしたいと思ったら、まず、「その人の端末」に登録された DNS サーバに問い合わせを行う。

これは、その端末から一番近くにある DNS サーバのはずだ。


しかし、すぐ近くの DNS サーバが、世界中のコンピューター全てを知っていることなどまずないだろう。


でも、有名な .com の DNS サーバなら知っている。

そこに問い合わせると、www.wizforest.com は知らなくても、wizforest.com の DNS サーバなら知っている、と返答がある。


そして、wizforest.com の DNS サーバに問い合わせると、www.wizforest.com の IP アドレスが得られる。


DNS サーバはこうした分散管理により、非常に巨大なデータベースを作り上げている。



ところで、最初に問い合わせたサーバが「偶然知っている」こともあり得る。


僕のサイトなんかはともかく、google.com とか youtube.com の場合、問い合わせる人が非常に多い。

そうした問い合わせのたびにいちいち上のような長い手順は踏んでいられない。

DNS サーバは、一度問い合わせた内容はしばらく覚えておいて、次の問い合わせにはすぐ答えられる、という機能も持っている。




ところで、分散管理している、ということは、全体の整合性は誰も管理していない、ということでもある。

これは DNS の重大なセキュリティ―ホールだ。


上に、www.wizforest.com を問い合わせる際の、問い合わせのリレーを書いた。

最終的には、wizforest.com まで問い合わせが来て、正しい IP アドレスを得られる。


じゃぁ、最初に尋ねるネットプロバイダ内の DNS サーバが、聞かれたとたんに嘘の IP アドレスを教えたらどうなるだろう?


「問い合わせた内容は覚えておく」という機能があるので、すぐに IP アドレスを教えてもらえることはある。

だから、それが嘘かどうかなんて気にもせず、本当のアドレスだと信じてしまう。


これは「DNS ポイズニング」と呼ばれる、 DNS の仕組み自体が持つセキュリティホールだ。

(プログラムのバグなどによるセキュリティホールではなく、基本的な仕様自体に欠陥がある)


DNS サーバは「多数のサーバに問い合わせて」IP アドレスを調べるので、その経路のどこか1カ所でもハックされ、嘘を教えるようになっていたら、その問い合わせに関連したすべてのサーバは嘘を信じてしまうのだ。


誰かがどこかの DNS サーバをハッキングして、偽サイトにユーザーを誘導してクレジットカード番号を盗む…なんて犯罪が実際にある。


でも、この仕組みを使って、本物のサイトではなく「キャッシュサーバー」にアクセスさせてしまえば?


ここで、DNS ポイズニングのターゲットは、ネットプロバイダの利用者限定だ。

利用者が外部のサイトを見ようとしたときに、DNS がネットプロバイダ内に設置されたキャッシュサーバの IP アドレスを教える。

「偽のサイト」を教えているのだから DNS ポイズニングなのだが、そのサイトはキャッシュされたもので、寸分たがわず元のサイトと同じだ。


何の被害もないし、むしろメリットだらけなのだ。

セキュリティホールを使うのは褒められたことではないのだが、これは「良い使い方」だ。




akamai のシステム概要としては、以上のようなものだ。


まとめると、キャッシュにより、


・利用者は通信速度が上がる

・コンテンツ提供者は、サーバの負荷が下がる

・ネットプロバイダは回線利用料が下がる


特に、ネットプロバイダが回線利用料を下げるためには「自社にキャッシュサーバを置く」必要があるので、設置場所を提供してくれる。


また、この仕組みを維持するために、DNS という既存の仕組みを巧妙に利用している。

新しい技術ではないので、すぐに使い始めることができる。


誰もが得をする技術で、そのために誰もが喜んでお金を払う。

技術的にも経済的にもよくできている。


こんなシステムを設計したことが、すごいと思う。



おまけ


いい加減話が長いので終わりたいのだが、途中で DNS ポイズニングの話を書いたので、おまけ。

不安にさせたままじゃ申し訳ないからね。


フィッシング詐欺に注意、という呼びかけを見たことはあるだろうか?

メールなどのリンクで偽サイトに誘導されるので、そういうリンクを使わないことが対策とされる。

必要であれば、自分でサイトの URL をブックマークして置いたり、検索したりして入れば大丈夫、と…


でも、DNS ポイズニングは「正しい URL に対して」偽の IP アドレスを教える手法なので、上に書いた方法では対策できない。


DNS ポイズニングの対策はちゃんと用意されていて、誰でも簡単に利用できる。


DNS は普通自動設定されるが、手動で 8.8.8.8 と 8.8.4.4 という二つのアドレスを設定すると良い。

これは google が行っているサービスで、ややこしいので技術説明はしないが、DNS ポイズニングを防いでくれる。


そして、この google DNS は、akamai とも協力していて、ちゃんとキャッシュサーバは利用できる。


本文中で、ネットプロバイダの DNS サーバを使用すると、ネットプロバイダ内に設置されたキャッシュサーバを教えてくれる…と書いていたが、google DNS でも大丈夫なんだ。

これまた巧妙な仕組みになっているのだが、長すぎるので説明はしない。





同じテーマの日記(最近の一覧)

コンピュータ

別年同日の日記

03年 なかなか忙しくて

09年 夏風邪

14年 ダグラス・エンゲルバートの命日(2013)

17年 バーベキュー


申し訳ありませんが、現在意見投稿をできない状態にしています


戻る
トップページへ

-- share --

0000

-- follow --




- Reverse Link -