はじめに
S3(Amazon Simple Storage Service)では、単純なアップロードやダウンロードだけでなく、アクセス権限の制御やバージョニングなど、様々な機能が提供されています。
そこで今回は、タイトルの通りS3で署名付きURLを作成してみたいと思います。
署名付きURLとは?
S3ではアクセスのポリシーをパブリックに設定したり、IAM(Identity and Access Management)ユーザ単位での細かなアクセス制御を行うことができます。
署名付きURLはその一環として、有効期限を設定し、ある特定のURLからのみアクセスができるようにするための機能です。
これを利用することで、通常はプライベートに設定しポリシーを緩めることなく、一時的に他のユーザへファイルを共有したりすることが可能になります。
ユーザ単位のアクセス制御ではないため、有効期限内であれば誰でもそのURLからアクセスできるという点には注意が必要です。
署名付きURLの生成
それでは、早速試していきましょう。
まずは適当なバケットを作成し、ファイルをアップロードしておきます。
このとき、パブリックアクセスを許可しないよう注意してください。
アップロードしたファイルのリンクにアクセスすると、当然アクセスは拒否されます。
署名付きURLを使ってこのファイルにアクセスできるようにするのが目標です。
今回はruby-sdkを使い、コマンドラインで署名付きURLを生成してみます。
準備
以下のようなコードを用意します。
認証情報とバケット名、ファイル名等は適宜変更してください。
[code language="ruby"]
require 'aws-sdk'
resource = Aws::S3::Resource.new(
:region => 'ap-northeast-1', # 東京以外のリージョンの場合は適宜変更してください
:access_key_id => '<your access key>',
:secret_access_key => '<your secret access key>'
)
object = resource.bucket('<your bucket name>').object('<your file name>')
puts url = URI.parse(object.presigned_url(:get, expires_in: 60)) # 有効期限を1分から変更する場合は適宜変更してください。
[/code]
実行
適当な名前で保存し、コマンドラインで実行すると…。
$ ruby test.rb
https://20170605-presigned-url-test.s3-ap-northeast-1.amazonaws.com/test.txt?X-Amz-Algorithm=AWS4-HMAC-SHA256
&X-Amz-Credential=AKIAJFM6SK4BF5JJH2BA%2F20170605%2Fap-northeast-1%2Fs3%2Faws4_request&X-Amz-Date=20170605T101951Z&X-Amz-Expires=60&X-Amz-SignedHeaders=host&X-Amz-Signature=5c90a7378e91c618d9dbeabf0dcf3b65fe78a893c070076275944c8aa25f05d8
このように、署名付きURLが生成されました。
動作確認
有効期限を1分に設定しているので、すぐにアクセスしてみましょう。
ちゃんと表示されましたね。
自分の環境では文字化けしてしまったので、ブラウザのエンコードをUTF-8に変更しました。
有効期限が切れるかどうかも確認しておきましょう。
少し待ってから再度アクセスしてみます。
有効期限切れとなり、アクセスができなくなっています。
このように、簡単にS3で署名付きURLを生成することができました。
おわりに
有効期限付きのダウンロードURLという、自前で実装するとなるとなかなか骨が折れそうな機能がいとも簡単に実現できました。
少し応用してIP制限と組み合わせれば、特定のユーザのみアクセス可能な有効期限付きURLを生成する…なんてこともできます。
ちょっとした機能ではありますが、知っておくと実装の幅が広がりますね。