概要
Nginx から AWS にあるプライベートな S3 のバケットにリバースプロキシしたいという要件があったため、その方法をご紹介します。
AWS にある EC2 上からであれば、IAM Role の設定を行いより簡単に解決することができるますが、
今回は、外部サーバからプライベート設定をしている、AWS S3 を使用したい場合にどうするかを紹介します。
この方法は、AWS 以外のオブジェクトストレージにも使用できるため、ネットワークまわりの設定を行わずとも利用できます。
準備
必要なモジュールのインストール
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
# yum install lua-devel git libxslt-devel libcurl-devel httpd-devel libxml2-devel openssl-devel zlib-devel GeoIP-devel gcc perl-ExtUtils-Embed pcre-devel # git clone https://github.com/simpl/ngx_devel_kit.git # git clone https://github.com/openresty/lua-nginx-module.git ----------- Nginx のビルド ※ 適切なディレクトリで実行してください ----------- #./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-http_ssl_module --with-openssl=/opt/openssl-1.0.2n --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-http_auth_request_module --with-http_xslt_module=dynamic --with-http_image_filter_module --with-http_geoip_module=dynamic --with-http_perl_module=dynamic --with-threads --with-stream --with-stream_ssl_module --with-http_slice_module --with-mail --with-mail_ssl_module --with-file-aio --with-ipv6 --with-http_v2_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic' --add-module=../ngx_devel_kit --add-module=../lua-nginx # make && make install |
ngx_devel_kit と lua-nginx を add_module で追加してビルドしてください。
ご自身の環境に合わせて パスを指定してください。
また S3 バケットにアクセスするための IAM を用意してください。
nginx.conf の設定
S3 ということで 画像ファイルへのアクセスを想定した設定を行ってみました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
server { listen 443 ssl http2; server_name img.scble.net; root /var/www/image; access_log /var/log/nginx/access.log main; error_log /var/log/nginx/error.log warn; ####################### SSL ####################### ssl_certificate /etc/letsencrypt/live/scble.net/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/scble.net/privkey.pem; # managed by Certbot include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS'; ssl_prefer_server_ciphers on; add_header Strict-Transport-Security max-age=15768000; location ~ /images/(.+)$ { set file $1; resolver 8.8.8.8; set $image_host "s3.amazonaws.com"; set $image_bucket_name "バケット名"; set $image_access_key "アクセスキー"; set $image_secret_key "シークレットキー"; set_by_lua $signature ' local date = ngx.http_time(ngx.time()) local string_to_sign = ngx.req.get_method() .. "\\n\\n\\n" .. date .. "\\n/" .. ngx.var.image_bucket_name .. "/" .. ngx.var.file ngx.req.set_header("Date", date) digest = ngx.hmac_sha1(ngx.var.image_secret_key, string_to_sign) return ngx.encode_base64(digest) '; proxy_set_header Authorization "AWS $image_access_key:$signature"; proxy_set_header Host "$image_bucket_name.$image_host"; proxy_pass https://image_bucket_name.$image_host/$file; } } |
上記のように設定を行えば、プライベートな S3 に Nginx からリバースプロキシできます。
resolver を設定しているのは、 s3.amazonaws.com の名前解決を行うためです。
パブリックな S3 をリバースプロキシするのであれば簡単なことですが、プライベート設定をしている S3 を使用する場合はこういった設定が必要です。
最後に
冒頭で述べたように外部からの使用するということを想定して設定してみましたが、通信料がかかるため、Nginx で一度アクセスがあったものは
キャッシュを使用するようにして通信料金の節約してください。
他に VPN 接続などいろいろと方法はあるので参考程度にしていただければと思います。
次回は今回の設定を使用し、画像をリサイズ処理する方法をご紹介したいと思います。