ようへいの日々精進XP

よかろうもん

S3 にファイルアップロードしてレスポンスとして URL を返すサンプル

tl;dr

必要にかられて S3 にファイルをアップしてレスポンスとして URL 返すスクリプトRuby で作ったので作る過程で調べたことや感じたことのメモ。


参考


サンプル

github.com


memo

aws-sdk-resources とはなんぞや

AWS SDK for Ruby V2 より aws-sdk-coreaws-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_urlpresigned_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 って使えたっけ...調べ方の問題、ドキュメントを見落としてしまっているだけかもしれないが未だに結論を見いだせてない。すいません。


以上。