LoginSignup
3
3

More than 5 years have passed since last update.

CloudFlareからCloudFrontに移行してハマった話

Last updated at Posted at 2016-07-02

簡単に切り替えればいいだけかと思いましたが、違いました。

初期の構成

(HTTPS) -> CloudFlare -> (HTTP) -> Heroku -> Rails

移行後の構成1

(HTTPS) -> CloudFront -> (HTTP) -> ELB -> (HTTP) -> Elastic Beanstalk -> Rails

Distribution Settings

Alternate Domain Names (CNAMEs): exsample.com
SSL Certificate: Custom SSL Certificate (ACMで作成)

Origin Settings

Origin Domain Name: ELB
Origin Protocol Policy: HTTPS Only

Default Cache Behavior Settings

Viewer Protocol Policy: Redirect HTTP to HTTPS
Allowed HTTP Methods: GET, HEAD, OPTIONS, PUT, POST, PATCH, DELETE

移行後の構成2

移行後の構成1は、単純にはうまく行きません。まず、CloudFrontはデフォルトでは多くのヘッダーを削除します。

カスタムオリジンの場合のリクエストとレスポンスの動作 - Amazon CloudFront

例えば、Hostが削除されるのでredirect_toしたときに、RailsがURLをELBのURLで返してしまってexsample.comからELBのURLに移動してしまいます。

もともと、コンテンツ配信用でCloudFlareのような使用方法ではなかったからだと思います。そのため、いくつかのヘッダーを許可しましょう。

Default Cache Behavior Settings

Whitelist Headers:
Authorization
Host
Refere
X-Forwarded-For

※ CloudFlontの設定を変更した時は念の為にStatusがDeployedになるまで待ちましょう。

移行後の構成3

移行後の構成2は、またまたうまく行きません。CloudFront -> (HTTP) -> ELBの通信が、HTTPなのでX-Forwarded-ForにHTTPが入ってしまい、これまたRailsがredirect_toをhttpsからhttpに書き換えてしまいます。

X-Forwarded-ForはLoad Balancerのための仕様なので、Railsも対応してくれていて、そこにhttpsが入っていれば実際のリクエストがhttpでもうまく処理してくれます。

CloudFrontからの通信はCloudFront-Forwarded-Protoに入ってるのですが、ちょっと新しい概念だったりするのでRailsでは単純には対応してくれていません。

通常は、Nginxでリバースプロキシを設定するのだと思いますが、面倒なのでHTTPS化してしまいましょう。

AWSの無料SSL ACMはTokyo Regionとかでは現時点では使えません。いつか使えることを夢見つつSSL証明書を購入しましょう。
一番安いSecure Core SSLに乗り換える | デフよん

EC2 -> ロードバランサー -> リスナー -> 編集から追加し、HTTPS - HTTPで追加しましょう。SSL 証明書からSSLを追加できるので、追加しましょう。
ELB の ComodoSSL 証明書を更新 - Qiita

(HTTPS) -> CloudFront -> (HTTPS) -> ELB -> (HTTP) -> Elastic Beanstalk -> Rails

また、ロードバランサーにRoute53からAレコードのエイリアスでelb.exsample.comとかを設定してCloudFrontのoriginをelb.exsample.comに変更しましょう。

ちなみに証明書を削除する方法はこちらです。
ELBに設定したSSL証明書の削除~|期限切れ ロードバランサ 方法 セキュア 対処 対応 設定 トラブルシューティング | ナレコムAWSレシピ

移行後の構成4

さて、移行後の構成3はうまく行きません。CloudFrontはCloudFlareと違って、Cookiesの転送はしてくれません。あと、Queryを転送してくれません。設定しましょう。これで、うまくいきました!

Default Cache Behavior Settings

Forward Cookies: All
Query String Forwarding and Caching: Forward all, cache based on all

3
3
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
3
3