プライベートなバケットなんだけど、特定のURLを知ってる人だけがダウンロードするのを許可したいというときに使うやつ。
aws-sdk-rubyのv1だとAWS::S3Object#url_for
で生成できたらしいんだけど、v2ではやり方が変わってるとのことなので試しにv2でやってみた。というかこれのコピペ。
# Gemfile gem "aws-sdk", "~> 2" # irbとか require "aws-sdk" s3 = Aws::S3::Client.new signer = Aws::S3::Presigner.new(client: s3) url = signer.presigned_url(:get_object, bucket: "my-private-bucket", key: "path/to/file.txt")
デフォルトだと15分。presigned_url
の:expires_in
オプションで制限時間を秒数単位で指定できる。なおアクセス回数には制限がなくて、時間内であれば異なるブラウザ等から複数回アクセスできる。
詳しくは公式のドキュメントに記載されている。
で、試しにs3_signed_urlという、S3オブジェクトに対してGETできるURLを発行するコマンドを作ってgemにした。*1
例えばexamplebucket
バケットのtest.txt
に対してURLを発行するには次のようにする。
$ s3_signed_url s3://examplebucket/test.txt --expire 60
https://s3.amazonaws.com/examplebucket/test.txt?...
--expire
オプションでURLが有効な秒数を指定できる。デフォルトだとSDKにもとづいて15分。
新しくファイルをアップロードしたい場合にも対応していて、--upload
オプションでパスを指定する。
$ s3_signed_url s3://examplebucket/test.txt --upload /path/to/test.txt
https://s3.amazonaws.com/examplebucket/test.txt?...
そんな感じ。
こういうコマンド系はaws-sdk-goを使って1ファイルにまとめたほうが便利なんだろうけど、ひとまず習作として。
*1:リネームした関係で2回yankした…。