2014年4月28日月曜日

Amazon VPCをYAMAHA RTX-1200で落ち着かせる

とりあえず、VPCならVPN接続(BGP)すると思うんです。

Amazon Virtual Private Cloud (Amazon VPC) 設定例

グローバルではどうか知らないですけど、国内ならYAMAHAルーター使ってるひと、結構いると思うんですよね。安いですし。

んで、RTX1200使って接続させるんです。設定自体は簡単だし。
が、これが、なかなか曲者で。

気づきはVPCからオンプレのDB接続に失敗して、処理が正常終了しないことが、たまにある、です。
そもそも、ちゃんと検証して、どういうことが起きるのか確認しときなさい、っていうのはもうそりゃそうですよね。
ちなみにDB接続をリトライする処理を入れる、じゃ問題は解決しないんすよね。

結論から言うと「VPNアップダウン繰り返すなら、SAキープアライブにIPSec DPD使わずにICMP Echo使いましょう」です。

IPsec DPD
18.19 IKE キープアライブ機能の設定

いずれもIKEの生存確認のための機能だけど、AWSやらYAMAHAに問い合わせしたり、ログから判断した結果、DPDだとレスポンスが返ってこないことが、結構あってDOWN/UPを繰り返す。そのタイミングでアプリケーションからみたConnection Poolは、切れてないと思ってるから接続を使いまわそうとする。けど、実質再接続されちゃってるもんだから、データは到達しない。

と、いう状況なので、アプリケーションから対処しようとするなら、接続がロストしたと判定した場合はClearAllPoolでプールを全部クリアしたのちの再接続、という処理にしましょう。この辺TDS ProxyのSQL Databaseでの挙動とは違う(そこから先が切り替わったから再接続、って意味では同じだけど、直接の接続先が変わるわけではない)ので対応方法も違うことになりましょう。

SqlConnection.ClearAllPools Method (System.Data.SqlClient)

と、いっても、既存システムをそのままクラウドに持っていきたいのにソースいじるの?っていうのはちょっと納得できないすよね。もちろん、そういう風に最初から作っておけば、いいんですけど、それはまぁ、ねー。

どういう挙動をしていたか、ルーターのsyslogを監視してたら、一日のうち何度もDOWN/UPを繰り返してるんです。なんで、繰り返すんだろー、と思って、syslog debug onで様子見。完全に不定期。規則性が見つからない状況で繰り返すんですけど、どうもキープアライブのところで、返事が返ってきてないことがちょくちょくあってシーケンスエラーが出てる。2本あるトンネルのうち、片方だけ。

標準のコンフィグ設定で指定されてるトンネルを入れ替えて様子みてると、入れ替え前と同じトンネルにつながってるほうだけ相変わらず変な挙動。

ふむ。いろいろ試してみたんすよね。コンフィグ変えたり(mssとかさー)。でも、少し落ち着いたかな、と思いきやすぐまたDOWN/UP。なんど解決したと夢見たことか。

それもあれですよね、SAの有効期限がISAKMPとIPSec別々に指定してて方や初期値で8時間のままだったりして、なんか、うまく動いてるように見えただけ、的な?こちらの設定都合じゃないところでDPDの返事がないから、関係ないのにね。

どうにもこうにもキープアライブ怪しい、って思ってたところAWSのサポートから、ICMP Echoにしてみてください、って返事が来た。理由を教えてほしい、ルーター側の問題なのかAWSの実装なのか知りたいから、っていうと「わかりません」ですって。そういうこともありますよね。
YAMAHAにも同じ問い合わせしたんだけど、返ってきた答えは「わかりません」でした。
これね、しょうがないかな、とは思うんですよね。組み合わせすべてテストするなんて、現実的じゃないしね。

接続の向きはいいとして(VPN通さないようにして、接続テストプログラム動かしても再現しない、っていう検証後の話です)、IPSecでのセッション管理について詳しくないですけど、鍵とセッションは紐づいてるんでしょーね。それなら、IPSec再接続後には、その上位も再接続しなさい、の理屈が通るもんね。

これ、接続できないんじゃなくて、接続するけど、その後再接続繰り返す、っていうのがさ、アプリケーションから見ただけだと意味わかんないエラーにしか見えなくて、ちょっと解決するのに時間かかった。確認するのに24時間かかったりとかね。とりあえずAmazon VPC+YAMAHA RTX1200の組み合わせなら、今のところ、DPDやめとくのがいいんじゃないか、っていう結論です。

dotnetConf2015 Japan

https://github.com/takepara/MvcVpl ↑こちらにいろいろ置いときました。 参加してくださった方々の温かい対応に感謝感謝です。