S3で公開しているコンテンツをVarnish経由で公開

静的ファイルを S3 でホストしている場合、S3 上のオブジェクトを Varnish 経由でリバースプロキシする方法をメモ

S3の設定

前提として、S3 でウェブサイトをホストする。
やり方は次のドキュメントを参照

http://docs.aws.amazon.com/AmazonS3/latest/dev/website-hosting-custom-domain-walkthrough.html

この時、S3 のエンドポイントは「バケット名.リージョン.amazonaws.com」となる。
以下ではエンドポイントを “your-bucket-name.s3-website-ap-northeast-1.amazonaws.com” として説明

VCL

backendの定義

リバースプロキシする s3 のエンドポイントを backend で定義

backend s3 {
    .host = "your-bucket-name.s3-website-ap-northeast-1.amazonaws.com";
    .port = "80";
}

S3 への GETリクエストの生成

/img で始まる URL でアクセスされた時は s3 にリバースプロキシーする。
backend を先ほど定義した s3 に向ける。

また、S3 でホストした時の仕様上、リクエストヘッダーの Host をエンドポイントに合わせる必要がある。
あわせないと

HTTP/1.1 301 Moved Permanently
x-amz-error-code: WebsiteRedirect
x-amz-error-message: Request does not contain a bucket name.

というようなエラーメッセージがかえってくる

aws が生成するレスポンスヘッダーを削除

S3 でホストすると、AWS のサーバが

x-amz-id-2:KFiuRpR0chhDHMiFdFkSHVgERytZQ8DYcQmYJbaCiuokYBSi/Cq1ZIbeUw5ueWzL
x-amz-request-id:BDB7892B87156594

というようなレスポンスヘッダーをつける。
邪魔に思う場合は取っ払う。

レスポンスが aws/S3 かどうかの判定はレスポンスヘッダーの Server を利用。

sub vcl_fetch {
  if (beresp.http.server == "AmazonS3") {
    unset beresp.http.x-amz-id-2;
    unset beresp.http.x-amz-request-id;
    set beresp.ttl = 1w;
  }
}

この例では、AWS 系ヘッダーを削除するだけでなく、S3 のコンテンツは ttl を1週間に設定している。

VCL全体

これらをまとめると、VCL は以下のようになる

backend default {
    .host = "127.0.0.1";
    .port = "80";
}

backend s3 {
    .host = "your-bucket-name.s3-website-ap-northeast-1.amazonaws.com";
    .port = "80";
}

sub vcl_recv {
  if (req.url ~ "^/img/.*") {
    set req.http.Host = "your-bucket-name.s3-website-ap-northeast-1.amazonaws.com";
    set req.backend = s3;
  }
}

sub vcl_fetch {
  if (beresp.http.server == "AmazonS3") {
    unset beresp.http.x-amz-id-2;
    unset beresp.http.x-amz-request-id;
    set beresp.ttl = 1w;
  }
}

ブラウザーでアクセスした時のレスポンスヘッダーが以下

Accept-Ranges:bytes
Age:115
Connection:keep-alive
Content-Type:image/png
Date:Fri, 10 Jan 2014 15:02:14 GMT
ETag:"187a220746a7d31cae7e67004d496b7c"
Last-Modified:Fri, 10 Jan 2014 14:25:38 GMT
Server:AmazonS3
Via:1.1 varnish
X-Varnish:1953909036 1953909035

References

Advertisements
Tagged with: , ,
Posted in middleware

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Archives
  • RT @__apf__: How to write a research paper: a guide for software engineers & practitioners. docs.google.com/presentation/d… /cc @inwyrd 6 months ago
  • RT @HayatoChiba: 昔、自然と対話しながら数学に打ち込んだら何かを悟れるのではと思いたち、専門書1つだけ持ってパワースポットで名高い奈良の山奥に1週間籠ったことがある。しかし泊まった民宿にドカベンが全巻揃っていたため、水島新司と対話しただけで1週間過ぎた。 それ… 6 months ago
  • RT @googlecloud: Ever wonder what underwater fiber optic internet cables look like? Look no further than this deep dive w/ @NatAndLo: https… 6 months ago
  • @ijin UTC+01:00 な時間帯で生活しています、、、 1 year ago
  • RT @mattcutts: Google's world-class Site Reliability Engineering team wrote a new book: amazon.com/Site-Reliabili… It's about managing produc… 1 year ago
%d bloggers like this: