S3の署名付きURLを取得する

Laravel のファイルシステムはS3やRackspaceのようなオブジェクトストレージをサポートしています。S3にファイルを保管する際、誰でもアクセスできる状態ではあるべきではないファイルは多々あるでしょう。そういったファイルを利用者にDLさせる際にはPre-Signed(署名付き)URLが便利です。

署名付きURLはIAMで署名された期限付きURLですが、Laravel 5.4.31以降ではこれをファイルシステムのAPIを使用して取得することが可能です。 たとえば、以下は1分間有効な一時URLを生成します。

$url = Storage::disk('s3')->temporaryUrl('path/to/file.doc', Carbon::now()->addMinute();

S3だけでなく、任意のカスタムファイルシステムにおいてもgetTemporaryUrlメソッドを実装しておくことでtemporaryUrlが利用可能(Laravel 5.4.32+)、Laravel 5.5からは同メソッドでRackspaceの一時URLも取得可能です。

なお、ファイルシステム(アダプター)がこのメソッドに対応していないのに呼び出した場合はRuntimeExceptionが、そもそも未実装のバージョン(5.4.30以前)で呼び出したらそんなメソッドはないと例外を投げられるでしょう。