はじめに
AWSのサービスを評価する目的で、社内サーバーで運用しているREDMINEをAWS上に持っていこうということになりました。ついでにALBやCloudFrontを使ってAWS WAFなんかの評価もできたらいいよねー、などと簡単に考えていたら、思わぬところでハマったので備忘録として残しておきます。
発生した現象 その1
EC2→ALB→CloudFrontの順番で実装。
インターネットから直接ALBを叩くと問題なく接続できることを確認後、CloudFront経由でのテスト開始。ログインID・PW入力し、「ログイン」ボタンを押したところ422 Invalid form authenticity token.
というエラーが出てREDMINEが使えません。
確認と設定 その1
log/production.log
を確認したところ、Can't verify CSRF token authenticity
というエラーメッセージを発見。ググったところ、次のページを見つけました。
stack overflow - AWS Cloudfront causing CSRF Token Mismatch Exception
上記ページの回答から Fowarding cookies が問題だということで、CloudFront の Behaviors タブ、Foward Cookies の Whitelist に_redmine_session
を書き込んだところ、うまく動くようになりました。(Foward Cookies は「None」から「Whitelist」に変更)
発生した現象 その2
チケットの添付ファイルをアップロードしたところ、ファイルが消えてなくなってしまう現象が発生。さらに、プロジェクトの「ファイル」タブからアップロードすると「ファイルは不正な値です」というメッセージが表示されてしまいます。
今度もALB経由だと正常にアップロードできたので、CloudFrontの問題だと切り分けができました。
確認と設定 その2
log/production.log
を確認するも、エラーメッセージは出ていません。
Apache側に何か出ていないかと思い、httpd/access_log
を見たところ、ALB経由のときのログと比較して明らかに文字列が短い。比較すると、Query Stringがすっぽり抜けていることが分かりました。
対応として、先ほどと同じくCloudFrontのBehaviors タブ、Query String Forwarding and Cachingの値をFowrward all, cache based on all
に変更したところ、正常にアップロードできるようになりました。
おわりに
エラーログの確認は基本中の基本ですね。
今回はログをすぐに確認せず、画面に表示されたメッセージだけで調査を開始したので原因にたどり着くまで時間がかかってしまいました。大反省です。ALB経由だと正常動作していたので、ログベースで比較できたのは良かったと思います。
CloudFrontは調査に時間がかかるため、こんな情報でも役に立つかもしれないと考えアップしておきます。お付き合いいただきありがとうございました。