Amazon EC2 + ELB + RDS + S3とCloudFlareでブログ運用 ネイキッドドメインでもOK!

追記: CloudFlareでのネイキッドドメイン運用に問題がありましたのでAmazon Route 53に移行しました。詳細は「結局ネームサーバーをCloudFlareからAmazon Route 53に移行」を参照してください。

ブログをAmazon EC2で運用していましたが、CloudFlareでもネイキッドドメインのCNAMEにドメイン名を指定できることがわかりましたので、EC2 + S3 + RDS + ELBの運用に変更しました。

このブログはAmazon EC2のみで運用していました。

Amazon EC2でOSはCentOS、データベースはMySQL、WebサーバーはnginxでWordPressを運用していました。そして、負荷分散という意味を込めて無料で利用できるCDNであるCloudFlareを利用していました。CDNを利用すると、画像などのファイルはCDNのキャッシュから配信されるため、Webサーバーにかかる負荷を減らすことができます。CloudFlareはDNSを登録することで、アクセスをCloudFlare経由にしています。詳しい仕組みはCloudFlareのページを参照してください。

ホーム | CloudFlare | ウェブパフォーマンス&セキュリティーカンパニー

ただ、EC2のみで運用していると、急激なアクセス数増加に柔軟に対応できませんので、ロードバランサーによる冗長構成に対応できるようにサーバー構成を変更する必要があります。まず、データベースはAmazon RDSでMySQLを運用することにして、アップロードした画像ファイルはNephila clavataというWordPressプラグインでAmazon S3に転送して参照するようにしました。

WordPress › Nephila clavata « WordPress Plugins

そして、ロードバランサーとしてAmazon ELBを利用することにします。

AWSStructure

↑ こんな感じの構成。やっつけの絵ですまん。

データベースと画像ファイルをEC2の外に出したのは、アクセス数に応じてEC2のインスタンスを増減させるためです。EC2にデータベースやファイルがあるとEC2間で同期をとらなくてはいけませんので、最初から外出しにしておけば同期をとる必要がなくなります。

ところが、ELBは仕様上IPアドレスが変動するので、ネームサーバーにIPアドレスを登録できません。ELBのドメイン名を登録する必要があるのです。

通常ネームサーバーには次のように登録します。

a kosukety.org xxx.xxx.xxx.xxx

* xxxはIPアドレスの数字です。

ELBをドメイン名でしか指定できませんので、AレコードではなくCNAMEレコードを使う必要があります。しかし、DNSの仕様上はCNAMEにネイキッドドメインを指定することができません。

ネイキッドドメインとはトップレベルドメイン(org)のひとつ下のドメインまでのこと(kosukety.org)なのですが、CNAMEではサブドメイン(www.kosukety.org)を使用して登録しなくてはいけません。

cname kosukety.org xxxx.xxxx.elb.amazonaws.com ← これは使えない。
cname www.kosukety.org xxxx.xxxx.elb.amazonaws.com ← サブドメインから登録。

この問題を解決するために、通常であればAmazon Route 53というサービスを使う必要があります。Route 53はネームサーバーみたいなもので、ELBのドメイン名を指定すればIPアドレスに動的に変換してくれるというサービスです。

ただ、Route 53も例にもれず従量課金ですし、無料CDNのCloudFlareはできればそのまま使いたいと思って調べてみたら、CloudFlareではネイキッドドメインをCNAMEに指定できるというエントリーを見つけました。

Zone Apex / Naked Domain / Root Domain CNAME Support for Amazon EC2, Google App Engine and Other Cloud Hosts | CloudFlare Blog

Route 53じゃなくても、そのままCloudFlareでもいけるということで、やってみたら本当にいけました。このブログは現在、ELBというロードバランサー経由でEC2上のWordPressにアクセスしています(一時的にELBのヘルスチェックの設定をミスってブログが見えなくなったので、設定は合ってます!ドヤっ)。

しかもCloudFlareなので画像などはCloudFlareのキャッシュから配信されるままです。S3からの転送料も押さえることができるのです。ちなみに画像をCDNにキャッシュしてもらいたければ、S3のドメイン名も登録しておく必要があります。こちらはおとなしくサブドメインまで(media.kosukety.org)でCNAMEレコードで登録しました。

これでYahoo!砲などの急激なアクセスがあったときに、一時的にEC2インスタンスを増加させることによってアクセスをさばき、アクセス数が落ち着いてきたら通常のインスタンス数に戻すという柔軟な運用を実現できます。

AmazonにもRoute 53と連携して使うことができるCloudFrontというCDNサービスがありますが従量課金です。

自分のサイトをネイキッドドメインで運用しているけどCDNは無料で使いたい、そんなことでELBによる負荷分散を躊躇していたら、ぜひCloudFlareを利用してみることをおすすめします。

Follow me!

Feedlyで新着記事をチェックしよう!

Feedlyでフォローしておけば、新着記事をチェックすることができます。ぜひ、この機会にFeedlyに追加しておきましょう。