S3にて Pre-Signed URLを発行する

記事タイトルとURLをコピーする

こんにちは。高橋@技術4課です。

小ネタです。S3にて Pre-Signed URL(署名付きURL)発行する方法をご紹介します。
Pre-Signed URLを利用することで、普段は公開していないS3のファイルを、一定期間だけ公開することができます。

S3の権限はそのままに URL を発行でき、かつ Pre-Signed URLを知っている人にだけアクセスが可能にできます。そのため「特定の人に特定の時間だけファイルを配布したい」といった時に使えるかと思います。
例)セミナーのアンケート配布 などなど

Pre-Signed URLは、AWS CLI と SDK から発行できます。

CLI

以下のコマンドを実行することで、Pre-Signed URLが発行できます。

$ aws s3 presign s3://bucket_name/object_name --expires-in second

参考)AWS CLI Command Reference > aws > s3 > presign



実行例はこちらです。5分(300s = 60*5)有効のURLを作成してみます。

$ aws s3 presign s3://(bucket_name)/takagi.png --expires-in 300
https://(bucket_name).s3.amazonaws.com/takagi.png?AWSAccessKeyId=AKIAJGBAKDNQ4SKH6EEQ&Expires=1498633445&Signature=VDo6Em%2F%2FZUFzZ86OYPz7wKqZcco%3D

 

SDK

SDKでも Pre-Signed URLは発行可能です。

今回はRubyで出力してみます。
サンプルコードはこちらです。

require 'aws-sdk'

Aws.config[:region] = 'ap-northeast-1'

s3_bucket_name = 'xxx'
s3_obeject_key = 'xxx'
expire_time = 60*60 #seconds

signer = Aws::S3::Presigner.new
url = signer.presigned_url(:get_object,
                        bucket:s3_bucket_name,
                        key:s3_obeject_key,
                        expires_in:expire_time)
puts url

参考)AWS SDK Ruby > Aws::S3::Presigner

実行結果はこのようになります。

$ ruby s3-presignedurl.rb
https://(bucket_name).s3-ap-northeast-1.amazonaws.com/takagi.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAJGBAKDNQ4SKH6EEQ%2F20170628%2Fap-northeast-1%2Fs3%2Faws4_request&X-Amz-Date=20170628T071600Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=abd05494d114d549d4da1aa8e6a0e4c6108ac928277306e907a59e4dc368d306

動作確認

デフォルトの設定ですと S3の Linkからファイルが開けませんが、

Pre-Signed URLを使えば S3の権限そのままで、期間限定でファイルを公開することができます。

指定した期間を過ぎた Pre-Signed URL にアクセスした場合は、エラーが返されます。

エラーメッセージが「Request has expired」となっており、期限が切れていることが分かると思います。またエラー本文に Expire dateが記載されており、いつまで有効であったかが分かるようになっています。


誤って機密のファイルを公開しないようお気をつけください。
ではでは。