6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

CloudFront で IPv6対応の APIを作る際の罠

Last updated at Posted at 2019-10-08

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の呪縛からは解かれないからな。

6
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?