Rack-Reverse-Proxyを使って特定のURLをS3と連携する
最近はheroku使うことが多い日々です。
サーバー関連のことは殆ど任せられるし、アドオンも充実していて本当に便利ですよね。
しかし、メリットの裏には制約があるものです。
herokuでは、従来では当たり前だった直接FTPでファイルを配置することはできません。
配置するファイルはgit管理に含んでpushしてあげる必要があります。
例えば、Webシステムからアップロードされる画像やファイルであればCarrierWaveや以前に書いた「RailsでPaperclipを使ってAmazon S3に画像を保存する | aguuu」を使えば簡単です。
でも、Webページ(画像+CSS+HTML)を配置したいとなると上記の方法では面倒です。
「そんなのgitに含めてpushすれば?」
その通りです。でも、そのWebページを作っているのが別の人だったら?
今回の要件はこうです。
- 特定のURL配下に静的なWebページを配置したい
- リダイレクトでは無く、URLのドメインは維持したままにしたい
- 配置する場所はFTPでファイルアップロードしたい
例えるなら、キャンペーンや広告での流入ページをデザイナーさんの自由な発想で作ったページを使いたい。それらのページは定期的に増えるので、デザイナーさんに管理してもらいたい。でも、gitやherokuに詳しくないのでFTPで簡単にファイルアップロードして欲しい。
そこで今回は、特定のURL配下にアクセスした場合には、URLはそのままで中身はS3に配置したファイルを表示してみようと思います。S3ならばFTPでフィアルアップロードも可能です。
そこで「rack-reverse-proxy」というgemを使うことにしました。
今回は下記のURLにアクセスした場合にはS3の「demo.aguuu.com」のバケット配下を表示します。
※今回はローカルで試しているのでドメインが「https://reverse-proxy-sample.dev」となっています。
https://reverse-proxy-sample.dev/hoge/
こうすることで「demo.aguuu.com/fuga/hello.html」に配置したファイルは下記のURLでアクセスできます。
https://reverse-proxy-sample.dev/hoge/fuga/hello.html
ではまずは「rack-reverse-proxy」を入れます。
# Gemfile
gem ‘rack-reverse-proxy’
bundle install
そして、特定のURL配下をS3のバケットに向ける為のルーティングを記載します。
正規表現を使って、「hoge/xxx」のをS3の「demo.aguuu.com/xxx」に紐付けます。
# config/application.rb
module ReverseProxySample
class Application < Rails::Application config.middleware.use Rack::ReverseProxy do reverse_proxy /^\/hoge\/?(.*)\/?$/, "https://s3-ap-northeast-1.amazonaws.com/demo.aguuu.com/$1" end end end
後は、S3側にバケットを追加します。忘れてはいけないのがS3側のパーミッションとStatic Web Siteの設定です。 誰でもアクセス可能なWebページなので「Everyone」に「List・View Permissions」を許可します。
次に「Static Website Hosting」の設定で「Enable website hosting」を有効化します。
後はS3に「demo.aguuu.com/fuga/hello.html」のファイルを配置すれば指定のURLにアクセスするとS3に配置したファイルが表示されるはずです。
今回試したソースは下記に置いてあります。
Let’s enjoy development.