2011年8月30日火曜日

Varnish経由でS3のコンテンツをPOSTで取得(Facebookアプリ用)

スズキです。

下記のようにS3にはPOSTでアクセスすることができません。
S3のコンテンツにPOSTでアクセスできない
なので、FacebookアプリのコンテンツをS3に置こうとすると、
FacebookはS3にPOSTでコンテンツを取得しにいくので、うまくいきません。

ということで、一旦FacebookはVarnishにアクセスし、VarnishがPOSTをGETに書き換え
S3からコンテンツを取得できるようにしてみました。

FacebookからS3までのコンテンツ取得経路は下記となり、
Facebook → ELB(www.suz-lab.com) → Varnish → S3(origin.suz-lab.com)
設定ファイル(/etc/varnish/default.vcl)は次の通りです。

backend default {
    .host = "localhost";
    .port = "80";
}
sub vcl_recv {
    if (req.url == "/healthcheck.txt") {
        return (error);
    }
    if(req.http.host == "www.suz-lab.com") {
        set req.backend   = suz_lab;
        set req.http.host = "origin.suz-lab.com";
        set req.request   = "GET";
        return (pass);
    }
    return (lookup);
}
sub vcl_error {
    set obj.http.Content-Type = "text/plain; charset=utf-8";
    if (req.url == "/healthcheck.txt") {
      set obj.status = 200;
      synthetic {"healthcheck"};
    }
    return (deliver);
}
backend suz_lab {
  .host = "origin.suz-lab.com";
  .port = "80";
}

ポイントは下記で、
set req.backend = suz_lab;
バックエンドを指定して、
set req.http.host = "origin.suz-lab.com";
HOSTヘッダを書き換えて、
set req.request = "GET";
メソッドも書き換えて、
return (pass);
キャッシュを利用しないようにしています。

これでFacebookアプリのコンテンツをS3で運用することができるようになりました。

ニーズはあまりないだろうなー...
--------
http://www.suz-lab.com

0 コメント: