LoginSignup
6
6

More than 5 years have passed since last update.

league/flysystem-aws-s3-v3 への移行時のつまった話

Last updated at Posted at 2016-03-31

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 を利用していて、

  1. 画像のget処理の中でkeyを発行
  2. viewのimgタグのパラメーターにkeyとその他必要パラメーターをつける
  3. nginx側でkeyの中身と他のパラメーターとの整合生をチェック
  4. 問題なければ静的インスタンスにデータを見に行く

こんな感じになってる。
そのため、パーミッションが最低でも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タグのパラメーターとの整合生をチェックしているので、まだ難しそう。

6
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6