暇人じゃない

ngx_small_light + ngx_aws_auth で S3 のプライベートな画像を変換する

Nginx で画像を動的に変換するために、ngx_small_light が選択肢に挙がると思います。
AWS S3 にあるプライベートな画像を変換したい時は ngx_aws_auth を使うことで実現できます。

ngx_small_light

https://github.com/cubicdaiya/ngx_small_light

画像を動的に変換するための Nginx モジュールです。
インストール方法については README や他の記事を参照してください。
https://github.com/cubicdaiya/ngx_small_light#installation

ngx_aws_auth

https://github.com/anomalizer/ngx_aws_auth

S3 のオブジェクトにアクセスするための署名を生成しプロキシする Nginx モジュールです。
Releases からソースコードをダウンロードし、適当な場所に展開します。 ビルドを行う必要はありません。

Nginx

モジュールを導入するので、Nginx のソースコードをビルドする必要があります。
以下はコンパイルオプションの例です。

./configure \
  # ...
  --with-pcre \
  --add-module=/usr/local/src/ngx_small_light-0.6.14 \
  --add-module=/usr/local/src/ngx_aws_auth-1.1.1

Configuration

以下の設定は URL 内のパスとオブジェクトの階層が一致していることが前提となります。
例えば /small_light(dw=100,dh=100)/shiba/dog.jpg というリクエストは、バケットの shiba/dog.jpg オブジェクトを取得し処理します。

nginx/conf.d/small_light.conf:

server {
    listen 80;

    small_light on;

    location ~ small_light[^/]*/(.+)$ {
        rewrite ^ /$1;
    }

    location / {
        proxy_pass http://example-bucket.s3-ap-northeast-1.amazonaws.com;

        aws_access_key "AWS ACCESS KEY";
        aws_secret_key "AWS SECRET KEY";
        s3_bucket "example-bucket";

        proxy_set_header Authorization $s3_auth_token;
        proxy_set_header x-amz-date $aws_date;
    }
}

ngx_aws_auth で使用する IAM ユーザーは s3:GetObject を許可していれば OK です。

以上で Nginx に対して http://example.com/small_light(dw=100,dh=100)/shiba/dog.jpg という具合でリクエストを行うと、 変換された画像がレスポンスされてくると思います。

まとめ

Nginx モジュールである ngx_small_light と ngx_aws_auth を使用することで S3 のプライベートな画像を変換できるようになりました。

このままでは自由にパラメーターやバケットのパスを変更することができてしまいますので、URL にハッシュを含めるなどして、正当なアクセスか検証するなどの対応が必要となるでしょう。