前回まででEC2とWebサーバ+αの設定が終わりました。
今回はロードバランサーのELB、CDNのCloudFrontを設定します。
Elastic Load Balancing(ELB)って?
ロードバランサーです。外からのトラフィックを良い感じに分配してくれたり、サーバの一台が落ちても良い感じに他にまわしてくれたりします。
サーバが2台あれば、負荷分散、冗長化などELBを使う意味もあるのですが、現在の1台構成(無料枠)でELBを使うメリットは… 凄くサーバ負荷がかかったときに無料枠内で2台のEC2を起動したり、ELBにつくパブリックDNS名は再起動しても変わらないので、EC2の再起動が怖くない(ElasticIPつければいいだけですが)… くらいなのかなぁ。勉強の為にやってみました。
ELBの設定
EC2→ネットワーク&セキュリティ→ロードバランサー→ロードバランサーの作成
ロードバランサーの定義
プロトコルは今回80しかないので、それで。
利用可能なサブネットをクリックし、192.168.1.0/24のサブネットを選択→次の手段
セキュリティグループの割り当て
新しいセキュリティグループ→名前:適当(lb-web)、プロトコル:HTTP、送信元:任意の場所
→次の手順
ヘルスチェックの設定
pingパス:/check.html
(EC2のhttpdで設定したチェック用のhtmlの場所)
→次の手順
EC2インスタンスの追加
どのEC2インスタンスをロードバランサーで制御するかを選択する
上記で作ったEC2を選択し、次の手段へ
タグ名の設定
キー:Name 値:任意(elb-web)
確認
設定を確認して作る
起動確認
起動直後はヘルスチェックが行われて居らずステータスがオレンジや赤色になっているが、数分ほっておくと、緑に変わる。緑に変わらなければ、ヘルスチェックが間違っていたりするので設定を見直す(中身が0バイトのファイルだとダメだった)。
緑に変わったら、DNS名を控え、ブラウザでアクセスしてみて、想定したWebページが出るかどうかを確認する。
独自ドメインを割り当てる場合は、”独自ドメイン名 CNAME ELBのDNS名” みたいな感じでDNSのCNAMEの設定をします。再起動や負荷によって増減/変更するらしいELBのIPアドレスをAレコードとかで指定しちゃダメ。
左のネットワークインタフェースを見ると負荷が無くても2つのグローバルIPが割り当てられているのが分かります。
CloudFrontって?
CloudFrontはコンテンツデリバリネットワーク(CDN)とか言う、全世界にあるコンテンツ用キャッシュサーバみたいなもの。ELBと同じく、設定するとホスト名が付くので、ドメイン名 CNAME DNS名と設定すると使えます。
CloudFrontの設定
ストレージ & コンテンツ配信→CloudFrontを選択→Create Distributionを押します。
Web→Get Startedを選択します。
Origin Settingsで、前回設定したELBを選択。
Webサーバで名前ベースのバーチャルホストを使っている場合はHOSTヘッダーを転送させます。
作成後表示される、DNS名にアクセスして、ELB配下のサーバにアクセスできることを確認します(バーチャルホストを使用している場合は、DNSサーバのCNAMEでこれに割り当てます)
ただ、上記の設定だと全てキャッシュされてしまいます。本文がキャッシュされると、ちょっと間違えて変更したいときに直ぐに反映されないため、画像のみCDNを使う設定にしました。結果を先に言うと、想定している形ではできませんでした。
画像のみをCloudFrontで配信
.htaccess # for amazon Cloud Front RewriteCond %{HTTP_HOST} ^hoge\.example\.com$ RewriteCond %{HTTP_USER_AGENT} !^Amazon\ CloudFront$ RewriteRule ^(.*)\.(png|jpg)$ http://XXXXXXXXXXXXX.cloudfront.net/$1.$2 [NE,R=302,L]
確かにこれで、画像のリクエストが(毎回)EC2まで届いて、mod_rewriteの機能でpngとjpgは2回目以降CloudFrontで配信されました。
ただ、今回やりたかったのは若干 特殊なのですが次の形。
- WordPressマルチサイト(apacheバーチャルホスト) + 画像のみCloudFrontで配信
WordPressのマルチサイトでは、画像も含めhostヘッダーを見て、内部的に振り分けているようなのですが、上記の形でXXXXXXXXXXXXX.cloudfront.netに飛ばしてしまうと、hostヘッダが書き換わってしまい、正常に動作しません。
「スイス製のアーミーナイフ」mod_rewriteならきっと良い方法があるような気はするのですが、やり方が分かりませんでした。こんな風にしては?等ありましたら教えてください。
次は最後。RDSを設定します。
・はじめの一歩!無料で始めるAWS
コメント