実は「パス形式での S3 API リクエスト」はいつかできなくなるかもしれないという話がありました。
で、うちのサーバはバケット名にドット(.)を使用しているので完全にあかんのですね。なので、新規にバケットを作成してもともと使っていたバケットからファイルを移動しました。
つぎはアクセス関係を整理。「パブリックアクセスをすべて ブロック」する代わりに「バケットポリシー」でmastodonからの書き込みとnginxからの読み込みをそれぞれ設定しました。
nginxの方は、以下のサイトを参考にしてIDでのアクセスをするように変更しました。
luaを使えるようにするために、nginx-extrasをインストール。
さて、nginxの設定ファイルですが、ここベースで作っていきます。
実際のファイルはこんな感じ。IAMのキー関係の実際の値は削っています。
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=CACHE:100m inactive=14d max_size=10g; server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name media.popon.pptdn.jp; root /var/www/html; keepalive_timeout 30; ssl_session_cache shared:ssl_session_cache:10m; ssl_certificate /etc/letsencrypt/live/media.popon.pptdn.jp-0001/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/media.popon.pptdn.jp-0001/privkey.pem; # managed by Certbot ssl_protocols TLSv1 TLSv1.2; ssl_ciphers ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:AES128-SHA; ssl_prefer_server_ciphers on; location = / { index index.html; } set $s3_backend 'https://poponpptdnjp.s3.ap-northeast-1.amazonaws.com'; location ~ /(.+)$ { limit_except GET { deny all; } set $file $1; set $image_host "s3.ap-northeast-1.amazonaws.com"; set $image_bucket_name "poponpptdnjp"; set $image_access_key "${IAM_ACCESS_KEY}"; set $image_secret_key "${IAM_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"; resolver 8.8.8.8; proxy_set_header Host poponpptdnjp.s3.ap-northeast-1.amazonaws.com; proxy_set_header Connection ''; proxy_set_header Authorization ''; proxy_hide_header Set-Cookie; proxy_hide_header 'Access-Control-Allow-Origin'; proxy_hide_header 'Access-Control-Allow-Methods'; proxy_hide_header 'Access-Control-Allow-Headers'; proxy_hide_header x-amz-id-2; proxy_hide_header x-amz-request-id; proxy_hide_header x-amz-meta-server-side-encryption; proxy_hide_header x-amz-server-side-encryption; proxy_hide_header x-amz-bucket-region; proxy_hide_header x-amzn-requestid; proxy_ignore_headers Set-Cookie; proxy_pass $s3_backend/$file; proxy_intercept_errors off; proxy_cache CACHE; proxy_cache_valid 200 48h; proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504; proxy_cache_lock on; expires 1y; add_header Cache-Control public; add_header 'Access-Control-Allow-Origin' '*'; add_header X-Cache-Status $upstream_cache_status; } }
こうすると、例えばS3直接指定はAccess Deniedになりますが、nginx経由だをアクセスできるようになります。
少しはまともになったはず。