👥

CloudFrontオリジンフェイルオーバーでTailscale Funnelの冗長構成

2023/01/01に公開

ども、takiponeです。
CloudFrontとTailscale FunnelでWebサーバーをインターネットに公開する様子を以下の記事で紹介しました。手元に自宅サーバー(Brume 2)が2台あったので、本ブログではCloudFrontの高可用性機能で冗長構成にした様子をご紹介します。

https://zenn.dev/takipone/articles/e514facc532263

冗長構成の概要

Tailscale Funnelは、TailscaleのVPNを生かしたインターネット公開機能です。現在はVPNノードのホスト名がそのままエンドポイントになるため、仮想IPアドレスやエイリアスのような抽象化機能が無くTailscale Funnelのみではサーバーの冗長構成が難しいです。CloudFrontを前段に挟むことで独自ドメインやCDNはもちろん、オリジンフェイルオーバー機能によって以下のように通常時はMain、異常時にReplicaに切り替える高可用な構成が可能になります。

CloudFrontオリジンフェイルオーバーの設定

CloudFrontでのオリジンフェイルオーバーの構成はシンプルです。既存のCloudFrontディストリビューション設定の[オリジン]タブから、mainreplicaそれぞれのオリジンを追加していきます。

続いて[オリジン]タブ下部の[オリジングループ]-[オリジングループを作成]から、さきほどのオリジン2つを登録しmainをプライマリにセット、フェイルオーバー条件を指定してグループを作成します。今回は自宅サーバーのサーバープロセスの障害を想定してフェイルオーバー基準は5xxレスポンスを選択しました。

あとは、ビヘイビアのオリジン選択でさきほど作成したオリジングループを選択すればOKです。

これでCloudFrontの設定が完了しました。

Taildropでカジュアルなデータレプリケーション

Main - Replica間のデータレプリケーションは、Tailscaleのファイル転送機能であるTaildropでカジュアルに実装してみました。TaildropはTailscaleのVPNノード間でのファイル転送を手軽に行う機能で、機能名の通りAirdropがお手本で主にデスクトップやスマホアプリでのファイル共有がメインの機能です。

https://tailscale.com/kb/1106/taildrop/?tab=linux

Linuxでは送信元からの送信コマンドと受信側での受信コマンドでシンプルに使えるので、今回はcronジョブに登録して使ってみました。

main
0 */2 * * * tar zcf /hogehoge.tgz /opt/hogehoge && tailscale file cp /hogehoge.tgz replica:
replica
5 */2 * * * rm /hogehoge.tgz; cd /; tailscale file get . && tar zxf /hogehoge.tgz && cd /opt/hogehoge/ && docker-compose restart

replica→mainへの更新はしないので、Ghostのデータ更新は常にmainで行う方針です。CloudFrontでは更新系のHTTPリクエストは常にプライマリオリジン(main)に向くため、そのままの設定で支障ありませんでした。

https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/high_availability_origin_failover.html

CloudFront は、ビューワーリクエストの HTTP メソッドが GET、HEAD、または OPTIONS の場合にのみ、セカンダリオリジンにフェイルオーバーします。ビューワーが別の HTTP メソッド (たとえば POST や PUT など) を送信しても、CloudFront はフェイルオーバーしません。

また、Tailscaleはノード間通信の経路選択が優秀で、Brume 2のLANポート同士をクロス接続しeth1にスタティックIPアドレスを振ると、Taildropの通信を自動でクロス接続経由で行ってくれました。賢い!

まとめ

CloudFrontの高可用性機能であるオリジンフェイルオーバーとTailscale Funnelを利用し、自宅サーバー2台でフェイルオーバー構成にした様子をご紹介しました。

参考URL

https://dev.classmethod.jp/articles/cloudfront-origin-failover/

https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/high_availability_origin_failover.html

Discussion