Laravel環境で league/flysystem-aws-s3-v3
のドライバーを使用して、ファイルアップロードをする処理への変更を試みた。
元の処理
Input::file( 'file_name' )->move( 'save_path' );
こんな感じ。
league/flysystem-aws-s3-v3 移行後の処理
$disk = Storage::disk( 's3' );
$file = Input::file( 'file_name' );
//$optionはメタデータや、ACL等を登録する場合
$disk->write( 'save_path' , file_get_contents( $file->getRealPath() ), $option );
こんな感じ( configの設定等々は省略します )
問題
新しい処理によって作成されたファイルがこれ
---------- 1 user group 11111 1月 1 00:00 file.jpg
何も権限が付与されてない。
これがどう問題かというと、現在画像の表示の仕組みが nginx
を利用していて、
- 画像のget処理の中でkeyを発行
- viewのimgタグのパラメーターにkeyとその他必要パラメーターをつける
- nginx側でkeyの中身と他のパラメーターとの整合生をチェック
- 問題なければ静的インスタンスにデータを見に行く
こんな感じになってる。
そのため、パーミッションが最低でも444になっていないとパーミッションで弾かれ表示できない。という状態。
作成後、パーミッションを書き換えるか、権限つけてアップロードできないかを調べてみるも、 league/flysystem-aws-s3-v3
の処理では見つけられなかった。かといってchmod()を使うにもその権限がない状況なので、エラー。
とりあえず、移行を一旦中断し、前の処理に戻すという一時撤退を選択。
解決
CloudFront導入を行った際、対象のバケットにCloudFront用のポリシーが付与されるという事を知る。
そこでふと過去の撤退を思い出す。
「nginxからCloudFrontを通しての読み込みになったのなら、league/flysystem-aws-s3-v3
でぶち当たった問題が解消されるのでは?」
思惑は的中し、パーミッションの書き換え等々する手間も発生させることなく解決。
最後に
そもそもCloudFrontの設定でRestrict View Access と Forward Query Strings を利用すれば、nginxを使わなくてもいいのでは?と思ったけども、現行の仕組みはkeyの期限チェックだけでなく、keyの中身のデータとimgタグのパラメーターとの整合生をチェックしているので、まだ難しそう。