There's an echo in my head

日々のメモ。

一定時間だけS3のオブジェクトにアクセスできるURLを生成する

プライベートなバケットなんだけど、特定の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した…。

このブログに出てくるコードスニペッツは、引用あるいは断りがない限りMITライセンスです。