少しだけ注意する点がありますが、それ以外はいつもどおりです。
結論
必要な gem
aws-sdk
nokogiri
nokogiri
でなくともox
やoga
やlibxml
やrexml
でもいいですnokogiri
を選んだ理由は、Rails の場合は明示的に入れなくてよく、馴染み深いから、というだけで深い理由はありません
コード
require 'aws-sdk' s3_client = Aws::S3::Client.new( region: 'ap-northeast-1', access_key_id: 'YOUR_ACCESS_KEY_ID', secret_access_key: 'YOUR_SECRET_ACCESS_KEY', ) signer = Aws::S3::Presigner.new(client: s3_client) signed_url = signer.presigned_url( :get_object, bucket: 'your-minio.example.com', key: 'bucket_name/path/to/file.jpg', expires_in: 60 * 5, # 単位は秒 virtual_host: true # 大事 ) puts signed_url
注意する点
注意する点は次のとおりです。
1. region
s3_client
で指定している region
は、MinIO の Server Location
に一致させる必要があります。
2. bucket
presigned_uri
のキーワード引数の bucket
に指定する値は MinIO のエンドポイント になります(スキーム除く)。
3. key
presigned_uri
のキーワード引数の key
には階層を含めた値を指定しますが、bucket
を前述のように指定するため、key
の最初の階層が bucket名 に等しくなります。
4. virtual_host
presigned_uri
のキーワード引数の virtual_host
は true
に指定します。これにより、戻り値の signed_url
のホスト名に bucket
の値が入ってくるようになり、期待通りの戻り値が得られます。
デフォルトの false のままだと戻り値のドメインに AWS のエンドポイントが自動で推測されて入ってきてしまいます*1 。
余談
MinIO の CLI (mc) で署名付きURLを取得する
MinIO の CLI (mc
) を利用する場合は以下のように実行すればいいです。my_minio
という alias が設定済みとします。
$ mc share download --expire 120s my_minio/bucket_name/path/to/file.jpg
AWS の CLI で署名付きURLを取得する
同様のことを AWS の CLI でやりたい場合は次のとおりです。my_minio
というプロファイルにクレデンシャルが設定済みとします。
$ aws s3 presign s3://bucket_name/path/to/file.jpg --profile my_minio --endpoint-url https://your-minio.example.com --expires-in 120
*1:サブサブドメインが bucket の値で、サブドメイン以降が ap-northeast-1.amazonaws.com のような値が戻り値となる