こんにちは。高橋@技術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が記載されており、いつまで有効であったかが分かるようになっています。
誤って機密のファイルを公開しないようお気をつけください。
ではでは。