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で運用することができるようになりました。