IPv6なAPIをつくりたいぞ!
APIGateway x Lambda で APIをつくるのは定石だが、IPv6対応させようとした瞬間に悩む。
そう、APIGatewayが、IPv6対応していないのである!
仕方がないので、手前にCloudFrontを置いてやるのが、これまた定石。
APIGatewayの手前のCloudFrontって、エラー時とかタイムアウト時のキャッシュ周りで癖が強いから、ちゃんと設定しないと、ユーザが無限エラーにハマったりで大変だよね、、とかあるけど、それはまた別の話
独自ドメインを振りたいが?
さて、CloudFront => APIGateway => Lambda したところで、当然ドメインを振りたいわけだ。
AWSあるある、マネージドサービスにドメイン振る場合はRoute53必須問題。
だが、そんなことは百も承知。
しかも私は賢いので、CNAMEではなく、ALIASレコードで華麗にマネージドサービスに別名をつけるのさ、ふふん。
と思っていたんですけどね、補完候補にCloudFrontのDistが出てこねーんだわ。。
仕方なく、手動で入れるとちゃんと認識する、なんでやねん。
(あと地味にCloudFront側のCNAMEリストにALIASレコードと同じ名前の定義を入れないとダメって初見だと気づかんよね...)
あとはHTTPS対応かな?
独自ドメインにする場合、ACMに証明書を登録しておかないとCloudFront側の設定が進めなくなって詰む、ガッテム!
しかし、私は賢いので、ACMにちゃんとGeoTrustの証明書をインポートしてあるのさ、ふふん。
と思ってたんですけどね、補完候補にACMで登録したはずの証明書がでてこねーんだわ。。
調べていくと、CloudFrontが参照するACMはバージニアリージョンのACMなんだってさ!へぇ!
ファック!!と殺意を覚えつつも、バージニアのACMに証明書を入れたら、無事認識してめでたしめでたし。
にしても、CloudFront遅すぎない?
ここまでCloudFrontの設定を変えて更新を繰り返しているのだが、どうにも遅い。
設定をミリ弄って更新を押すと、都度10分〜30分は帰ってこない。
こんな状態でトライ&エラーとかやってられるかという感じだ。
(CNAME/ACMに依存する設定をかえると、30分かかる感じだった)
ちなみに、deploy now みたいなステータスでアクセスすると、変な挙動したり、レスポンスが先祖返りすることがあるが、そういうものみたいなので、この状態での動作を気にしてはいけない。
IPアドレス問題
もう疲れたので終わりにしたいけど、なんかね、APIGatewayで $context.identity.sourceIp を使ってたんですよ。
なんとこいつが、CloudFrontのIPアドレスで入ってきて、クライアントのIPが取れねぇw
ELB挟んだりするのと同じと言われると、なるほど、と思うが...いやいやいや。
で、どうすりゃえーねんというと、 X-Forwarded-For ヘッダーを信用して、APIGateway側のマッピングテンプレートでこいつをLambdaに渡してやれということだ。(カンマ区切りで中継IPが全てはいるので、Lambda側でパースが必要。)
ちなみに、$context.identity.sourceIp は IPv6を受け取れないが、X-Forwarded-For にはIPv6が入る。なるほどね。
IPv6 Only のエッジを分けておきたい
普通はDual StackのAPIでおわり、、なんだが、用途として特殊で、IPv4とIPv6のエッジを明示的に指定できるようにしておきたかったのだ。
Route53のALIASレコードでAとAAAAを違う名前でつけておけば実現できる、そう思っていた時期が私にもありました。
これやるとね、Aしか振ってない名前でIPv4/IPv6両方いけるんですよねww(逆も然り)
色々やったけど、ダメだったので、多分AWSのバグ仕様なんだと思います。
苦肉の策として、CloudFrontのDistributeを二系統つくって、AのALIASとAAAAのALIASをそれぞれ別に指定してやった。そしたら、期待通りの動き、パーフェクトゲームだ。
おわりに
こうして、期待するAPI構築が終わり(実際にはCORS問題もあったが、
Serverless Frameworkが優秀すぎて、数分で解決した)、私は帰宅するのであった。
そうそう、「クラウドはIPv6対応万全だ、アプリケーション開発者が怠けてるだけだ」と口を大にしてゆう人を、非開発系のIPv6推進者(笑)の方でよく見かける。
君らは自分でクラウドのIPv6使って開発してから、そういうこと言おうな?
とマジで思う。
IPv6は普及してきたといっても、実際にコンテンツを開発/運用する上で足りてないものが、まだまだたくさんある。みんな、色んな罠や沼で精神汚染されて、苦しむといい。
その苦しみが、IPv6で自在にコンテンツを開発・運用するための糧になる。
というか、今失敗しないと、永久にIPv4の呪縛からは解かれないからな。