お名前.com / DNS に無料でフロントのラウンドロビンのロードバランサーをさせてみた - - - AWS S3 と Azure Blob Storage に静的WebをActive-Activeさせた話


#Webホスティングのサイズが大きくなくトラフィックが軽微ならほぼ無料でWebサイトのホスティングと手前のロードバランスも
AWSやAzureでロードバランスの機能があってWebサーバーの行き先を変えるという行為はAWSでもAzureでも認定試験の試験範囲であったりするのだがどちらのロードバランサーも金がかかる。クラウド技術を新たに習得する人はこれがデファクトスタンダードだと思う。私にも意外な盲点ではあったのだが金かけたくないなあと思って調べていたところラウンドロビンのロードバランスであればドメイン名解決でやってしまうのも手かなあと思ってテストしたら上手くいった。調べてみたところ意外にオーソドックスではあるものの広く知られていない手法のようだ。静的なWebページをAWS S3とAzure Storageに放り込んだが**私が管理しているWebホスティングがほとんど無料になったのとしかもロードバランスまで無料でできるようになった。**片方が死んでももう片方にラウンドロビンされるので今年の夏にあったAWS死亡の際はタイミングによって自動でAzureにいくし、その逆も可能になった。「負荷分散」より**「障害対策」として「active-active」で複数の行き先を確保しておき完全死亡を妨げるという要素の方が強いかな。半分死にかけていてもDNSで死んだ方のAレコードをワンクリックで無効化すればAレコードに設定するTTLの５分（300秒にしていた場合）で完全復旧するので慌てる必要もない。**最近の技術の組み合わせってすごいよね。

#DNS Aレコードは複数可能だがCNAMEは複数不可能(DNSでやるなら固定IPを強引に割り出すか付与して実施)
下図が私のサイトのお名前のAレコードなのだが一番上はルートで来られたときにwwwに転送するサービスを使っているためのもの。お名前で対応すると月額100円だが最初からwwwなどのサブドメインでアクセスされるのが明確ならこちらは不要。２番目はwwwのサブドメインに対してAzure Blob Storage (価格が安い US West 2), ３番目はwwwのサブドメインに対してAWS S3 (価格が安いバージニア)になる。ストレージのIPアドレスが変わる可能性はゼロではないようだが、まず大丈夫だろう。"nslookup" AWS/Azureストレージアクセス先ドメイン名　のコマンドで自分が使っているところのIPアドレスの割り出しはできる。
![截屏2019-12-2622.45.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/32a6be05-521b-88bb-e03e-fcbc8818819c.png)

#AWS S3 や Azure Storage (BLOB) 静的Webサーバー
両方をWebサーバーとして利用してみて簡易な手順と良し悪しがあったのでまとめておきます（2019年12月現在）

【AWS S3】 https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/WebsiteHosting.html
バージョニング機能がある。ブラウザのドラッグドロップでサブフォルダまで一気にアップロードができる。httpに対応。一つのストレージで複数ドメインのフォルダ作成ができる。ドメインごとにバケットを分ける必要があるがフォルダのように簡単に分けられる。外部からWebだけつなげるようにするにはJSON形式で設定するなどやや複雑に見えるようなところもある（実際にはさほど難しくない）。

![截屏2019-12-2623.14.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/cb470f16-4841-7055-daf3-566d7c1279b4.png)　![截屏2019-12-2623.28.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/ed99bbc1-cf04-0812-7bc9-332c6504d67a.png)

【Azure Blob Storage】 
https://docs.microsoft.com/ja-jp/azure/storage/blobs/storage-blob-static-website
https://docs.microsoft.com/bs-latn-ba/azure/storage/blobs/storage-custom-domain-name
バージョニングがない。ブラウザでStorage Explorerという"プレビュー"機能でアップロードはできるが、ドラッグドロップはできず一気にサブフォルダまで完全にアップロードができない。http/ネイティブではないhttps両方に対応。https使わない場合は無効化(Storage->Configuration->Secure Tranfer RequiredをDisabled)する必要がある。Static Website機能でONにすれば外部からサイトが繋がるようになる（セキュリティ設定という点ではAWSより楽に見える）。格納先は自動で作成される$Webというフォルダになる。

一つのストレージでは一つのサブドメインしか対応できない。自分のドメイン名を使いたい場合は"Custom Domain"機能で登録作業というものがあり、事前にドメイン管理しているDNSサーバーでCNAME登録による認証をしなければならない。結果、一つのストレージで複数サブドメインや複数ドメインのWebページを管理できず都度ストレージを分けなければならない仕様（AWSと大きく異なる）。

![截屏2019-12-2623.10.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/b5ca139f-df12-826e-9138-4fa960fdfcc0.png)![截屏2019-12-2623.24.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/1ebfbd18-4f2f-989c-8c6e-bcd200340001.png)
例えばwwwでアクセスさせたい場合、登録しているドメインのwwwのCNAMEかasverify.wwwのCNAMEを作成して事前認証が必要になる。![截屏2019-12-2623.19.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/b55c192e-1e82-0b4d-d4ed-be8dac9fa537.png)
例としてasverify.wwwというasverifyつきのダミーのCNAMEで認証させる場合はUse indirect CNAME validationにチェックする。

#どこのサーバーに接続されたかわかるのか？
もしサイトのコンテンツが全く同じ場合はWebサイトの表示のどこかにサーバーがわかるような情報を入れ込んでしまうのが良いと思います。私の場合は次のような案内文に目立たない表示の仕掛けにしてみました。なお、サーバーとクライアントサイド（ルーター含む）共にDNSキャッシュ機能が働きリフレッシュを連打しても同じサーバーに繋がることが多いのでお気をつけください。仕様では分散がされますのでS3, Storageのアクセス履歴を確認されたし。

![截屏2019-12-2623.43.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/1ad1e7b3-c3ce-7a68-94b3-d1e98d542259.png)　　![截屏2019-12-2623.59.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/12b0777d-2fec-349e-7b76-dbe89139d27a.png)

#使い方次第でなんとでも

使い方によってはAWSとAzureではなく複数のAWS、複数のAzure、またはその他のWebサーバーで３つ以上のラウンドロビンも可能になります。では頑張ってください。

参考：DNSラウンドロビン　https://www.atmarkit.co.jp/ait/articles/0605/27/news021.html