![]() |
こんにちは SCSK中山です。
今回は夏休みの自由研究ということで、自由研究チックな内容にしたいと思いまして、AWS上でCloud InterConnect × vSocketで冗長構成を組めるかを試してみようかと思います。
通常、Cato Networksを利用してAWSなどのクラウドサービスと接続する場合、「Cloud InterConnect」または「vSocket」のどちらかを選択します。冗長化を組む際も、Cloud InterConnectであればDirect Connect回線を2本に、vSocketであればvSocketインスタンスを2台に、といった形で同一の接続方式で構成するのが標準的です。
これら2つの異なる接続方式を組み合わせて冗長化に利用することは、Catoの推奨構成ではありません。
しかし、「技術的には本当に不可能なのか?」という純粋な好奇心から、今回はその実現可能性を考察し、記事にまとめてみることにしました。
先に申し上げますと、本記事は現時点では机上考察です。検証はこれからとなりますので、あらかじめご了承ください。
考慮すべきポイント
:動的なルーティング切り替え
この構成を実現する上での鍵は、「どのようにしてルーティングを動的に切り替えるか」です。
Catoでは、Cloud InterConnectとvSocketを利用する場合、それぞれ別の「Site」として登録・管理します。 今回の構成では、通常時はCloud InterConnectを利用するSite(以下、Site A)をメイン経路とし、Site Aの障害時にのみvSocketを利用するSite(以下、Site B)へルーティングを自動で切り替える必要があります。この自動切り替えをどう実現するかが、最大のポイントとなります。
案①BGPを使った方法
ネットワークの経路を動的に切り替えるといえば、まず思い浮かぶのがBGP (Border Gateway Protocol) です。
CatoはBGPをサポートしているため、AWS側との連携が焦点となります。
1. Cloud InterConnect (Site A) 側
こちらは比較的シンプルです。AWS Direct ConnectおよびTransit GatewayはBGPによるルート伝播に標準で対応しているため、Site AとAWS間の経路交換(青色矢印)はBGPで問題なく実現できるでしょう。
TransitGWを通してDirectConnectが生きているときは通信を可能としてくれるはずです。
2. vSocket (Site B) 側
ここが難関です。vSocketはVPC内に配置される仮想アプライアンスであり、それ自体がBGPスピーカーとして機能するわけではありません。そのため、AWSからCatoのSite BへBGPで経路情報を広報するには、何らかの仕組みをVPC内に別途構築する必要があります。
考えられる方法は以下の通りです。
-
BGPソフトウェアを搭載したEC2インスタンスを立てる VPC内にBGPルーティングソフトウェアをインストールしたEC2インスタンスを別途用意し、AWSのネットワークとCato Site Bの間でBGPピアを確立させる方法です。
-
Amazon VPC Route Serverを利用する AWSのマネージドサービスである「Amazon VPC Route Server」を利用する方法も考えられます。これは、VPC内のネットワーク仮想アプライアンス(NVA)とBGPで動的にルーティング情報を交換するためのサービスです。私も詳細は分からないので、以下記事などを見て貰えればと思います。
参考:VPC Route Server の設定を一通りやってみた(サーバワークス)
…と、これでCatoへのルート伝播はできたとして、話は終わりませんでした。。
実はもう一つ、大きな課題があります。それは「AWS内でのvSocketへの経路」です。AWS上のEC2などからCato側へ通信するとき、通常はDirectConnectへ、障害時にはvSocketへ向かうように経路を切り替える必要があります。この切り替えをTransit Gatewayにお願いしたいのですが、vSocket側の経路をTransit Gatewayに動的に伝えるのが、だーいぶ厳しそうです。
この課題を解決する方法を、2つほどを考えてみました。
- BGPだけで頑張る方法(GREトンネル活用)
1つ思いついたのが、BGPを話せるインスタンスを立てる方法の応用です。
Transit Gatewayは、実は「Transit Gateway Connect」という機能を使うと、GREトンネル経由でVPC内のインスタンスとBGPを話すことができます。
これを利用して、
-
- VPC内にBGPとGREに対応したインスタンス(NVA)を立てる
- このNVAとTransit Gatewayの間でBGPピアを張る
- NVAからvSocketへの経路を広報するときに、ASパスプリペンド(ASパスを長くして経路の優先度を下げる技術)を設定する
こうすれば、通常時はASパスが短いDirectConnect側が優先され、障害時にだけvSocket側の経路が使われる、という自動切り替えが実現できる(?)気がします。。
- BGPは諦めて、障害検知で静的ルートを操作する方法
BGPだけで全部やろうとすると複雑すぎるのでBGPに固執せず、別の方法を組み合わせる手もあります。 これは案②にも通じる話ですが、 「DirectConnectがダメになったことをCloudWatchなどで検知して、Lambdaを動かし、Transit GatewayのルートテーブルにvSocket向けの静的ルートをAPIで追加/削除する」 というやり方です。 これなら、複雑なBGP設定を回避しつつ、やりたいことは実現できそうですね。
- CatoのSource NATを活用する方法
こちらの方法はかなり条件付きになりますが、AWS側の複雑な設定を回避できる面白い案なので紹介してみます。
AWSをCatoで利用する場合って、多くはAWS上にいるサーバーにWAN側からアクセスしたい、というケースかと思います。この「外から中への通信」がメインなら、使えるかもしれない技です。
どうやるかというと、vSocketが持っている「Source NAT」機能を使います。 CatoのSocket(vSocket含む)は、通過する通信の送信元IPアドレスを、Socket自身のIPアドレスに変換するNAT機能を持っています。
これを利用して、
-
- WAN側から来た通信がvSocketを通過するときに、送信元IPをvSocketのIPアドレスにNATで書き換えてしまいます。
- AWSのサーバーから見ると、通信は「vSocketから来た」ように見えます。
- サーバーからの応答(戻りの通信)は、当然vSocketに向かいます。Transit GatewayもvSocketのいるVPCへの経路は知っているので、問題なくルーティングできます。
- 応答を受け取ったvSocketは、元の送信元IPアドレスにちゃんと戻してからWAN側に返してくれます。
こうすれば、Transit GatewayでBGPや静的ルートをごちゃごちゃ設定しなくても、戻りの経路をvSocketに強制的に向けることができる、というわけです。Catoの機能をうまく使った裏技的な感じですね。
ただ、最初に「条件付き」と言った通り、大きな制約があります。 この方法は、AWS側から自発的にWAN側へ通信を始める場合には使えません。 (Transit Gatewayのルートテーブルには他拠点宛のルーティング情報がないため)
あくまで「外から中」へのアクセスがメインで、「中から外」への自発的な通信がない、という環境であれば、かなりシンプルな解決策になるかもしれませんね。
色々書いてきましたが、正直なところ調べながら書いたので、実現度はだいぶ低いのかなと思ってます。
# @Amazon Q ファクトチェックして
案②Catoのルーティングを無理やり変更する方法
BGPを使わない方法も一応、思いつきました。
最初に述べた通り、この構成のポイントはルーティングを切り替えることになります。
CatoではSiteへのルーティングは各Siteの設定よりできるので、手動でもそこの設定を切り替えることでSite AからSite Bへルーティングを切り替えることができます。
ただ、それでは芸がないので、何とか自動化する方法がないかを考えてみました。
このアプローチのポイントは、「障害検知」と「ルーティング変更の実行」を自動化することです。
1.障害の検知方法
まず、Cloud InterConnectがダメになった時を検知する方法はないかを考えてみます。
Cloud InterConnect(Site A)の障害を検知する方法として、以下の2つが考えられます。
- Cato側での検知: Catoの「Link Health Rule」機能を利用します。Siteのダウンといったイベントを検知し、指定したWebhook宛に通知を送信できます。
- AWS側での検知: Amazon CloudWatchを利用します。Direct Connectのメトリクス「
ConnectionState
」(0=down, 1=up)を監視し、CloudWatch Alarmを発報させます。
2. ルーティング変更の実行方法
続いてSiteのルーティングの変更の自動化方法について考えてみます。
こちらはCatoのAPIを使えばいけそうです。
障害を検知したら、Cato APIを呼び出し、以下の通りルーティング設定を書き換えるLambdaを作成します。
- 障害発生時: Site Aから対象VPC/SubnetへのルートをAPIで削除し、Site Bへ同じルートを追加する。
- 障害復旧時: 上記とは逆の処理(Site Bのルートを削除し、Site Aのルートを再追加)を実行する。
これだけだと「案①」でも触れたAWSからCatoへの戻りの通信経路が切り替わりませんので、LambdaでAWSのAPIも叩いてもらい、Transit Gatewayのルートテーブルを書き換えてもらいます。
具体的には、Lambdaのプログラムの中で、
- 障害発生時: Transit Gatewayのルートテーブルに、Catoのネットワーク宛てのネクストホップをvSocket側に向ける静的ルートを追加する。
- 障害復旧時: 追加した静的ルートを削除する。 という処理を追加します。
全体像としては、以下のようになるかと思います。
- 障害検知: CloudWatch Alarm (Direct Connect) または Cato Link Health Rule (Webhook)
- トリガー: CloudWatch Alarm Action または Amazon API Gateway
- 実行: AWS Lambda
- 処理内容:
- Lambda関数が Cato API をコールし、Cato側のルート情報を書き換え
- Lambda関数が AWS API をコールし、Transit Gatewayのルートテーブルを書き換え
こっちはいけそう度高めで自信はあるのですが、Lambdaがやることも増えますし、プログラムを書かないとなので、そこだけハードルは高そうです。
#AI時代ならLambdaぐらいのコーディングだったら余裕だったりしますかね。。
まとめ
今回は、Cato Cloud InterConnectとvSocketを組み合わせたハイブリッドな冗長構成について考察しました。
どちらの案も、Cato単体の機能というよりは、AWSのサービス(BGP関連サービスやLambda、CloudWatchなど)を深く活用する高度なアプローチとなりました。
しかも、今のところ机上の話なので、実際に実現できるか怪しいので、Catoが公式に推奨する標準構成(Cloud InterConnectであれば回線の冗長化、vSocketであればインスタンスの冗長化)を選択することが、最もシンプルかつ確実な方法で、やはり一番良さそうです。
#検証はできたら追記していく所存ではあります。