Tech

RailwayにCloudfrontを接続する

めちゃくちゃハマったので同じ問題を抱えた誰かまたは将来の自分のため。

ドキュメント
https://docs.railway.app/tutorials/add-a-cdn-using-cloudfronthttps://docs.railway.app/tutorials/add-a-cdn-using-cloudfront

自分の補足回答
https://help.railway.app/questions/how-i-can-add-cloud-front-671b8863#p-14https://help.railway.app/questions/how-i-can-add-cloud-front-671b8863#p-14

上記の手法だとオリジナルサーバーにはViewerのヘッダを送らないことによりアプリケーション側からはrailwayからのアクセスと判断されてしまい一部の処理がうまくいきませんでした。
具体的にはAPIベースの単純なNode.jsバックエンドでは問題なかったものの、LaravelをデプロイするとアセットのURLやInertiaのリンクのドメイン部分がrailwayのドメインになってしまう問題が発生しました。
特にアセットはASSET_URLで回避できそうでしたがInertiaの方は難しそうで、表示した人のヘッダをそのまま送った上でリクエストが通るように設定できないか模索していました。

対応方法

  1. RailwayでCustom Domain (e.g xxx.example.com) を設定する
    • Rwailwayので表示されるCNAMEのDNS設定は無視する
    • 生成されるCNAMEの設定値である youroriginal.up.railway.app はコピーしておく
  2. Cloudfront distributionを作成して、オリジンに先程の youroriginal.up.railway.app を設定する
  3. Behaviourを設定する際に Origin request policy - optional は AllViewerにする。これはHeadersをAll viewer headersにするために設定する
  4. カスタムドメイン(xxx.example.com)からCNAMEでcloudfrontにDNSを設定する
  5. これでカスタムドメイン経由で接続できる
    • railway上ではDNS設定待ちとなるが無視して問題ない
share