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を使うことにしました。

jaswope/rack-reverse-proxy

今回は下記のURLにアクセスした場合にはS3の「demo.aguuu.com」のバケット配下を表示します。

※今回はローカルで試しているのでドメインが「http://reverse-proxy-sample.dev」となっています。

http://reverse-proxy-sample.dev/hoge/

こうすることで「demo.aguuu.com/fuga/hello.html」に配置したファイルは下記のURLでアクセスできます。

http://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」を許可します。 2014092101

次に「Static Website Hosting」の設定で「Enable website hosting」を有効化します。

2014092102

後はS3に「demo.aguuu.com/fuga/hello.html」のファイルを配置すれば指定のURLにアクセスするとS3に配置したファイルが表示されるはずです。

2014092103

今回試したソースは下記に置いてあります。

tochi/reverse_proxy_sample

Let’s enjoy development.