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 にハッシュを含めるなどして、正当なアクセスか検証するなどの対応が必要となるでしょう。