外部サーバーからローカルへリダイレクトさせる方法

「Developing Facebook Platform Applications with Rails」に掲載されている事例を参考にしながら、気づいた点を随時メモしていきたいと思います。
ローカルマシンでFacebookアプリをRailsで構築して、それをFacebook上で動かすためには、ローカルマシンをInternetに接続する必要がある(FacebookからのCallbackRequestを受け取る必要ある)のですが、それができない場合は、sshを使ってInternetにつなげるサーバーにローカルから接続して、そのサーバーにローカルとFacebookを中継させます。例えば、InternetにつなげるサーバーとしてAmazonEC2を選んだ場合、以下のようにローカルから実行すると、

ssh app@ec2-xxx-xxx-xxx-xxx.compute-1.amazonaws.com -R :3001:localhost:3000 sleep 99999

FacebookからEC2の3001ポートへCallbackされれば、それがローカルの3000ポートへリダイレクトされるようです。

  • 上記を実行する前に、appユーザーのパスワードを指定しておく(passwd app)
  • EC2のインスタンスを起動する時に、ポート3001を開放しておく
  • Facebook側の設定箇所もけっこうたくさんある(それぞれの役割については調査中)
    • Canvas Callback URL
    • Post-Remove URL
    • Post-Authorize URL
  • それぞれのCallback URLには、「http://ec2-xxx-xxx-xxx-xxx.compute-1.amazonaws.com:3001」のように記入
    • 固定IP(Elastic IP)を割り当てれば、インスタンスを再起動しても、Facebook側の設定を変える必要がなくなるのか?

その他、FacebookerをRailsアプリケーションにインストールすると、

script/plugin install git://github.com/mmangino/facebooker.git

config/facebooker.ymlというファイルが生成されるので、そこにFacebook側の情報(API KeyやSecret)を記入する必要があります。また、tunnelにEC2のホスト名や開放しているポートを記入します。

development:
  api_key: <<api_key>>
  secret_key: <<secret_key>>
  canvas_page_name: <<canvas_path>>
  callback_url: http://ec2-xxx-xxx-xxx-xxx.compute-1.amazonaws.com:3001
  pretty_errors: true
  set_asset_host_to_callback_url: true
  tunnel:
    public_host_username: app
    public_host: ec2-xxx-xxx-xxx-xxx.compute-1.amazonaws.com
    public_port: 3001
    local_port: 3000
    server_alive_interval: 0

これで、ローカルでscript/serverを実行して、http://apps.facebook.com/<>を開けば、ローカルのRailsのコードがFacebook上で動きます。

  • 次回までのTODO
    • Railsの仕組みそのものの勉強
    • 特に、config/routes.rb