見出し画像

AWSとCloudflareを使ってマルチクラウドのようなCDNを構築してみた

こんにちは、こんばんは
DELTAのインフラエンジニアの馬場です。

以前、Cloudflareの社内勉強会を行った際のレポートをNoteの記事にまとめさせていただきました。

今回は社内でもCloudflareを使っていく中で出てきた可用性向上のためのアーキテクチャ変更について記事を書いていこうと思います!


今回の記事を書くに至った背景

Cloudflareは以前にちょいちょいサービス障害があったため、悪いイメージがついてしまい、サービスが停止すると売り上げが多く減ってしまうサービスに利用するには、不安だという声が聞こえていました。
なので、通信費を浮かせるために普段はCloudflareのCDNを利用しつつ、障害が起きたときにはAWSのCloudFrontに切り替わるようなアーキテクチャを少しのコストで実現し、1部分だけマルチクラウドのような構成にすることで可用性の向上を狙うことにしました。

今回実現する構成

AWSで構築したサービスの前にCloudflareを配置するのは前回の記事と同じだが、Cloudflareの障害があった際に備えてCloudflareをプライマリとして普段使いのCDNとして使いつつ、障害が起きたときにはCloudFrontに切り替わるようにする。

アーキテクチャのイメージ

実際にやっていく!

AWS上にwebサイト等の既存リソースがすでに構築されている前提で話を進めます。
私の環境では下記で簡単に構築して解説していきます。
Route53,+CloudFront+S3

まずはプライマリのCDNとするためにCloudflare側の設定を行います。Cloudflareのサイトを追加します。
サイトを追加をクリックし、Zone Apexを入力します。

Add a site / サイトを追加 をクリック
Zone Apexを入力して, Add a site / サイトを追加 をクリック

ビジネスプランを選択します。
年間払いにして絶望を味わったので、支払いプランはお気をつけて、、、

$200かかる。。。

画面右下からPartial Setupモードにします。
モード変更をするとTXTレコードが払い出されるのでメモっときます。
次のステップでRoute53に登録します。

Convert to CNAME DNS Setup / フルDNSセットアップに変更 をクリック

cloudflare-verify.ドメイン に、払い出された値をTXTタイプとして登録し、レコードを作成します。

数字の塊が”-”で連結された値を”値”に入力

Cloudflareの画面から下記のエラーが消えていることを確認する。

CDNの設定を行っていく

プライマリとして利用するCloudflareのCDNを登録します。

ここからが難しいのですが、今はNSはRoute53にある状態です。
権威NSに関してはRoute53にあるものの、Cloudflare側にもDNSのコンソールがあります。
Cloudflare側のDNSコンソールはDNSだけではなくCDNのエッジ・オリジンの関係を登録する画面を兼ねています。
ここで、Cloudflare側のDNS兼CDNコンソールに、もともとやりたかったCNAMEレコード(=オリジン)が登録されている必要があります。

例えば、www.sample.jp ⇒ XXX.cloudfront.net というレコードです。
Cloudflare上ではZone Apexが省略されるので名前が"www"でコンテンツがCloudFrontのディストリビューションが設定されることになります。
これ自体は、もともとRoute53に設定があれば、読み込みのステップでここに入っているはずなので基本的にはそれを探してもらえば大丈夫です。
なければ作成してください。
そのうえで、それが「Proxied」と設定されているかを確認してください。


Route53側をCloudflare CDNに向ける

先ほど作成したプライマリになるCloudflareのCDNにルーティングするようにRoute53の設定を行います。

もともとのドメインのCNAMEは そのドメイン.cdn.cloudflare.net に向けてください。

ここで指示されているようにもともとのドメイン+Cloudflareのサフィックスの値を登録する。
(↑ホントはRoute53のレコード一覧の右側に出てくる細長いやつ)
sample.domainと変えてしまっているが適宜読み替えてください。

イメージとしては、
(Route53)
ターゲットとなるドメイン ⇒ そのドメイン.cdn.cloudflare.net
(Cloudflare)
ターゲットとなるドメイン(実体としてはそのドメイン.cdn.cloudflare.net) ⇒ オリジンサーバーのドメイン名(or IP)
となります。

ここまでで、プライマリのCDNの設定作業は完了!


フェイルオーバーをするための設定を行っていく!!

流れとしては
Route53のヘルスチェックの作成

Route53で対象サービス/サイト用のフェイルオーバールーティングの
プライマリレコードの設定を行う。

セカンダリレコードの設定を行う。
以上!

Route53のヘルスチェックの作成

プライマリが利用できない状態を判断するためのヘルスチェックを作成。

Route53 > ヘルスチェック  > ヘルスチェックの作成をクリック

自身の管理している対象サービス等のヘルスチェック用の設定を入力して「次へ」

通知について聞かれるので好きに答える。
今回はわざと失敗させたりして挙動を試したいので通知は切っておく。

設定を終えたら「ヘルスチェックの作成」をクリック

プライマリレコードの設定を行う

Route53のホストゾーンに戻って、CloudflareのCDNに向けていたレコードを編集する。
”ルーティングポリシー”を”フェイルオーバー”に設定。
”フェイルオーバーレコードタイプ”を”プライマリ”に
”ヘルスチェックID”は先ほど作成したヘルスチェックを設定し
”レコードID”は好きな値を入れていいらしいのでCloudflare用という意味を込めてrecord-for-Cfとした。(後続のセカンダリと被らなければなんでもいいっぽい)

セカンダリレコードの設定を行う

本当はソーリーページとかを表示したりする用だと思うが、Cloudflareが落ちたときにCloudFrontにフェイルオーバーさせるために設定するので
Cloudflare側で設定したCloudFrontを値に持つレコードをプライマリと同名で登録する。

”レコード名”はプライマリとそろえる。
普通だと一意制約違反で怒られるがセカンダリとして登録する場合は怒られない。
”値”は最初の方の手順でCloudflareに登録したものと同じものを登録。
”ルーティングポリシー”を”フェイルオーバー”に設定。
”フェイルオーバーレコードタイプ”を”セカンダリ”に
”ヘルスチェックID”は設定しなかった。
”レコードID”は好きな値を入れていいらしいのでAWS用という意味を込めてrecord-for-awsとした。

設定完了!!

では動作検証を行っていく。

普通に動くのか?を見ていく。

まぁ動くよね

Cloudflareを見てる

ちゃんとIPレンジの中に入っている。

お楽しみのフェイルオーバーの挙動を見ていく

エラーを起こすのに手っ取り早いのでCloudflareのDNSレコードを消す。

消えた。

ヘルスチェックの方を見てみる。
この記事を書くのに時間がかかって消した状態で放置されてたのでついたり消えたりしているがフェイルオーバーしたときにヘルスチェックが成功していることが分かると思う。
設定してすぐの場合は”ヘルスチェッカー”のタブから確認してもらうのが良いと思います。

一方でサイトには変わらず接続できる

切り替わってるはずなので再度digってみる
CloudFrontを見てる=セカンダリに切り替わっている!

一応Cloudflare側のDNSからだと動かないことも確認

Cloudflare側からは確認できなかったので
CloudflareのCDNが使えなくなったとしても、CloudFrontに自動で切り替わってサービスが止まらない挙動になるはず!!

何ができるようになったのか

当初の目的通り、通常時はCloudflareの安いCDNを利用し
Cloudflareで障害が起きた場合には自動でCloudFrontに切り替わるアーキテクチャに変更できた。
これによって、安価で追加の管理コストが不要なより可用性の高いアーキテクチャを実現することが可能になりました。

Team DELTAについて

ここまで読んでくださってありがとうございます!
インフラエンジニアに限らず、幅広いメンバーが活躍しているので、一緒に働きたい、どんなことをやっているのか聞いてみたい等、なんでも答えますので、下記の申し込みフォームからご連絡ください!

この記事が気に入ったらサポートをしてみませんか?