tl;dr
必要にかられて S3 にファイルをアップしてレスポンスとして URL 返すスクリプトを Ruby で作ったので作る過程で調べたことや感じたことのメモ。
参考
- Amazon Simple Storage Service(S3)ドキュメント | アマゾン ウェブ サービス(AWS 日本語)
- File: README — AWS SDK for Ruby V2
- Module: Aws::S3 — AWS SDK for Ruby V2
- 署名付き URL を使用したオブジェクトのアップロード(AWS SDK for Ruby)
サンプル
memo
aws-sdk-resources とはなんぞや
AWS SDK for Ruby V2 より aws-sdk-core と aws-sdk-resources に分割された Gem の一つ。ドキュメントを抜粋させて頂くと...
Resource interfaces are object oriented classes that represent actual resources in AWS. Resource interfaces built on top of API clients and provide additional functionality.
雑に訳す(Powered by Google 翻訳)と...
- AWS の各種リソース(EC2 や S3 等)を表すクラス
- API Client 上に実装されている
雲を掴むような(クラウドだけに)フワッとした感じだが、API クライアントよりも上位レイヤーで AWS の各種リソースをオブジェクトとして扱えるクラスという認識。
今回はこの aws-sdk-resources を利用してサンプルを作った。
サンプルから抜粋
以下、ファイル(オブジェクト)をアップロードしてその URL を返してくれる部分。
def upload key = File.basename(@filename) obj = @s3.bucket(@s3_bucket).object("#{key}") obj.upload_file(@filename) unless @presign then obj.public_url(virtual_host: @vhost) else obj.presigned_url(:get, duration_in: @duration, virtual_host: @vhost) end end
upload_file
メソッドで指定されたオブジェクトを S3 にアップロードするpresigned_url
メソッドは Presigned URL(署名付き URL)を返すpublic_url
メソッドは Presigned URL(署名付き URL)ではない普通の URL を返してくれる
public_url / presigned_url メソッドの virtual_host オプションについて
public_url
と presigned_url
のパラメータとして virtual_host
というオプションがあるが、値は Boolean で true
又は false
で指定する。
obj.public_url(virtual_host: true)
を指定すると以下のようにバケット名とオブジェクト名が返ってくる。
http://your-bucket/file.png
オリジナルドメインで Web ホスティング機能を有効にしている場合にはドメイン名でバケット名を作成していることになるので、以下のようにドメイン名(バケット名)とコンテンツファイル名(オブジェクト名)の URL が返ってくることになる。
http://foo.example.com/bar.png
尚、この virtual_host
オプションはデフォルトで false
となっている。
オリジナルドメインで Presigned URL って
presigned_url
メソッドで virtual_host
オプションが利用出来るのでオリジナルドメインでの署名付き URL を作成することが出来ることになるので以下のような URL が返ってくる。
"http://foo.example.com/bar.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKxxxxxxxxxxxxxxxxxxxx%2F20150919%2Fap-northeast-1%2Fs3%2Faws4_request&X-Amz-Date=20150919T134938Z&X-Amz-Expires=60&X-Amz-SignedHeaders=host&X-Amz-Signature=d4ffafd980868d63dd811ceb50fb17c4971b4e4c033c027106f2dc5dc67c9b4e"
この URL を利用してコンテンツアクセスすることが出来る。また、URL のパラメータには X-Amz-Expires=60
とあるので期限も設定されているようだが、無期限でアクセス出来る状態になっている。なんでやろう...そもそもオリジナルドメインで Presigned URL って使えたっけ...調べ方の問題、ドキュメントを見落としてしまっているだけかもしれないが未だに結論を見いだせてない。すいません。
以上。