share facebook facebook twitter menu hatena pocket slack

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

鈴木 宏康

WRITTEN BY 鈴木 宏康

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

こちらの記事はなかの人(suz-lab)監修のもと掲載しています。
元記事は、こちら

鈴木 宏康

鈴木 宏康

愛知県生まれ。東京工業大学大学院修士課程修了。在学時より、ベンチャー企業でインターネットに関する業務に携わり、現在はクラウド(主にAmazon Web Services)上での開発・運用を軸とした事業の、業務の中心として活躍。

cloudpack

cloudpackは、Amazon EC2やAmazon S3をはじめとするAWSの各種プロダクトを利用する際の、導入・設計から運用保守を含んだフルマネージドのサービスを提供し、バックアップや24時間365日の監視/障害対応、技術的な問い合わせに対するサポートなどを行っております。
AWS上のインフラ構築およびAWSを活用したシステム開発など、案件のご相談はcloudpack.jpよりご連絡ください。