ShinobiLayer: SoftLayerでCNAMEを使ってCDNアクセスする（設定編）

#はじめに
本記事では、SoftLayerが提供するCDNにCNAMEを使ってアクセスする方法をご紹介します。
※2015/02/22注記： 設定の意味については、http://qiita.com/testnin2/items/ebfe59e8f157b024d43c も併せてご参照下さい。

#SoftLayerにおけるCDNとは
SoftLayerではEdgeCast社（http://www.edgecast.com/ ）のCDNを利用しており、SoftLayerのCustomer Portalからポチポチと選択していくだけで、EdgeCast社と別途契約を行うことなく簡単にCDNを利用することができます。
SoftLayerのCustomer portalでは、CDNの基本機能について簡単に利用できる仕組みを提供しています。もし、EdgeCast自身が持つ拡張機能を利用したい場合（例えばSmall Objectのキャッシュ等）は、Add-on機能が別途チケット経由で購入できるようです。まぁ、本格的に使いたいのであれば、EdgeCast社自身と契約した方が良いかもしれませんが。。。

SoftLayerのCustomer Portalのインターフェースはシンプルなので、単にCDNを使うだけなら、多分誰でもできると思います。Storage -> CDNと辿ってCDNを注文した後に、注文したCDNアカウントID配下でCDNでキャッシュしたいURLを入力すれば、SoftLayerがCDN URLのリンクを生成してくれます。このリンクにアクセスすればCDN経由でのアクセスなります。

![CDN_intro.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/dede1419-db63-cd40-8e02-6991c1bd19cf.jpeg)

![CDN_preview1_new.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/1ba36446-2c88-5f5c-e80a-39979720249f.jpeg)

# 今回の目標
上記のやり方は簡単なんですが、、、若干不満点が残るのは、**このCDN URLがSoftLayer/EdgeCastが自動生成したものになっていることです。** もちろん、実際にはredirectなどの機能を使って画像などは別urlから取得するように構成するのは一般的だとは思いますが、そうしたページにこうしたあからさまにSoftLayer生成のURLを記述するのは、メンテナンス上よろしくありません。

ということで、今回はCNAMEを使って自分が管理しているURL経由でCDNにアクセスするための手法をご紹介します。
http://origin.mysl01.com/cdn/images/ninja.png
というoriginサイトの画像を
http://cdn.mysl01.com/images/ninja.png
でアクセスできるようにすることを目標に、設定を行って行きます。

# DNSの設定(CNAMEの設定）
今回はSoftLayerのDNS（ドメイン名: mysl01.com）を使ってCNAMEの設定をします。注意点は以下のとおり。

* SoftLayerのDNSを使う必要はありません。CNAMEが使えるDNSを利用してください。
* 今回は、cdn.mysl01.com（自分の好きなURL) -> wpc.xxxxx.edgecastcdn.net（EdgeCastが割り当てているCDNキャッシュページ）で解決するようにCNAMEを設定しています。xxxxxの箇所は、**CDNを購入した際に割り当てられたCDNのアカウントID**であり、Customer Portalから確認できます。xxxxxの箇所は自分のアカウントIDに合わせて構成して下さい。
* CNAME用ホストのためのAレコードは不要です。（下図のoriginのAレコードは、単にoriginサーバーの名前解決をしたかったので追加しているだけで、直接的には関係ありません）

![CDN_DNS_new.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/ab32302c-c63a-8355-9839-f20d4acc0b15.jpeg)

# CDNの設定（Customer PortalでのCNAME設定）
Customer portalにて、Storage -> CDNからCDNの設定を行います。

http://origin.mysl01.com/cdn/images/ninja.png
というoriginサイトの画像を
http://cdn.mysl01.com/images/ninja.png
でアクセスできるようにしたいので、以下のように入力します。
![CDN02.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/b16ca0c5-3d98-3b8c-c47f-b85c7c0f19c7.jpeg)
![CDN03_new.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/64353002-3669-5ac1-2936-8c3392ac53ca.jpeg)

**モザイクを入れているところがCDNのアカウントID**です。

設定はこれで完了です。

#ちょっと待つ
SoftLayerからEdgeCastにもすぐこの情報は伝播されるのですが、残念ながらEdgeCast側でCNAME設定が反映されるのに時間がかかるようです。うまくいっていない！と心配になって設定を再編集する前に、ちょっと（？）待ちましょう。EdgeCastの資料には1時間ぐらい待つように書かれているのですが、個人的な経験では1時間で反映されたことはありません。2-3時間ぐらい待った方が良い気がします。。。

#確認

####1. ブラウザからアクセスしてみる
うまくいくと、以下の4通りのアクセスが可能になることが分かります。

* オリジンサーバーへの直接アクセス（http://origin.mysl01.com/cdn/images/ninja.png ）<br>
![CDN_origin_new.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/36386f73-58c4-4fbe-6b05-f8e7e9d57c48.jpeg)
* SoftLayerのCustomer Portalで表示されるCDNキャッシュページ（http://xxxxx.http.cdn.softlayer.net/80xxxxx/origin.mysl01.com/cdn/images/ninja.png ）<br>
![CDN_preview1_new.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/1ba36446-2c88-5f5c-e80a-39979720249f.jpeg) 
* EdgeCastが提供する本来のCDNキャッシュページ（http://wpc.xxxxx.edgecastcdn.net/80xxxxx/origin.mysl01.com/cdn/images/ninja.png ）<br>
![CDN_preview2_new.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/c16e462b-71df-eeb2-0044-1da754b3f05e.jpeg)
* 今回の目標だった、CNAMEで設定したCDNキャッシュページ（http://cdn.mysl01.com/images/ninja.png ）<br>
![CDN_final.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/dddfc981-ab65-1890-1461-d1ee97e22a14.jpeg)

####2. HTTPリクエストヘッダの確認
キャッシュ前の状況。

* Serverが（Origin Serverの）Apacheになっている。

```
# curl -I http://cdn.mysl01.com/images/ninja.png
HTTP/1.1 200 OK
Accept-Ranges: bytes
Content-Type: image/png
Date: Wed, 18 Feb 2015 20:05:49 GMT
Etag: "11214d-52cb-50f5a3ee19e00"
Last-Modified: Wed, 18 Feb 2015 10:26:00 GMT
Server: Apache/2.2.15 (CentOS)
Content-Length: 21195
```

キャッシュされた後の状況

* ServerがEdgeCastが提供するECAccになっている。
* 「X-Cache: HIT」の行が増えている。

```
# curl http://cdn.mysl01.com/images/ninja.png > /dev/null
# curl -I http://cdn.mysl01.com/images/ninja.png
HTTP/1.1 200 OK
Accept-Ranges: bytes
Content-Type: image/png
Date: Wed, 18 Feb 2015 20:15:08 GMT
Etag: "11214d-52cb-50f5a3ee19e00"
Last-Modified: Wed, 18 Feb 2015 10:26:00 GMT
Server: ECAcc (sin/ECF4)
X-Cache: HIT
Content-Length: 21195
```

####3. xxxxx.http.cdn.softlayer.net.とwpc.xxxxx.edgecastcdn.net.の関係

どうやら、xxxxx.http.cdn.softlayer.net.のCNAMEがwpc.xxxxx.edgecastcdn.net.になっているようです。

```
# dig xxxxx.http.cdn.softlayer.net. cname | grep -v "^;" | grep -v "^$"
xxxxx.http.cdn.softlayer.net. 86300 IN  CNAME   wpc.xxxxx.edgecastcdn.net.
````

http://cdn.mysl01.com/images/ninja.png
↓
(CNAME: cdn.mysl01.com -> wpc.xxxxx.edgecastcdn.net)
↓
http://wpc.xxxxx.edgecastcdn.net/images/ninja.png
となるように思いますが、実際にはこのリンクではアクセスできません。正確には
http://cdn.mysl01.com/images/ninja.png
↓
(CNAME: cdn.mysl01.com -> wpc.xxxxx.edgecastcdn.net)
↓
http://wpc.xxxxx.edgecastcdn.net/images/ninja.png




#最後に
繰り返しになりますが、CNAMEでURLが変更できたといっても、例えばapacheではMod_rewriteなどを使ってキャッシュさせたいページは別リンクで構成する方が良いでしょう。CNAMEを使えば構成の可読性や可搬性が大幅に高まると思います。
なお、キャッシュ制御もWebサーバーで実行するのがEdgeCast CDNでは一般的のようなので、SoftLayerのCDNを利用する際には下記リンクも併せてご確認いただければ幸いです。

What are some example configuration changes for Origin Pull on an Apache Web Server?
http://knowledgelayer.softlayer.com/faq/what-are-some-example-configuration-changes-origin-pull-apache-web-server

Attach EdgeCast CDN account to SL Object Storage
http://knowledgelayer.softlayer.com/procedure/attach-edgecast-cdn-account-sl-object-storage