質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

1回答

3669閲覧

外部ストレージにS3を利用する場合にLaravelのソースコードはどのように記述すべきか

poteto4401

総合スコア57

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

0クリップ

投稿2019/02/16 11:00

質問

これまでローカル環境で開発していたため、画像、JS、CSSファイルはpublic以下に保存していました。
(js/cssはresources以下に配置し、webpack.mix.jsでビルド)

AWS上にアプリケーションを公開するために外部ストレージを利用したいのですが、以下のような実装をした場合、画像、JS、CSSファイルはS3上に存在しないといけないことになりますよね?
であれば、デプロイ時には、画像ファイルはともかく、JS/CSSはコンパイルしたapp.jsとapp.cssをS3に保存するような処理を書く必要があるのですが、この考えは間違っていると思っています。

ローカル環境でも本番環境でもenvファイルを書き換えるだけで同じ様に動作させるためには、FILESYSTEM_DRIVER=localにし、アプリケーション側にJSとCSSを配置しビルドして、画像ファイルはS3にアップロードした画像のURLをbladeファイルに記述する、というのも間違っていると思います。

公式ドキュメントを読んでも正しい実装方法が分からないので、ご教授いただきたいです。

実装

.env

env

1FILESYSTEM_DRIVER=s3

filesystems.php

php

1'disks' => [ 2 'local' => [ 3 'driver' => 'local', 4 'root' => storage_path('app'), 5 ], 6 7 's3' => [ 8 'driver' => 's3', 9 // ... 10 ], 11],

app.blade.php

php

1<head> 2 <!-- Scripts --> 3 <script src="{{ asset('js/app.js') }}" defer></script> 4 <!-- Styles --> 5 <link href="{{ asset('css/app.css') }}" rel="stylesheet"> 6</head> 7 8<body> 9 <img src="{{ asset('img/logo.png') }}" class="Logo"> 10</body>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

以下のような実装をした場合、画像、JS、CSSファイルはS3上に存在しないといけないことになりますよね?

いいえ、assetは現在のリクエストからアセットへのURLを生成するのでFILESYSTEM_DRIVER=s3にしたところでs3のURLになるわけではありません。
例えばhttp://example.comに対してリクエストしたとすると、S3のURLではなく、example.comにあるアセットのURLが生成されます。(ローカル環境と同じ挙動をイメージしてもらえれば良いかと思います)

であれば、デプロイ時には、画像ファイルはともかく、JS/CSSはコンパイルしたapp.jsとapp.cssをS3に保存するような処理を書く必要があるのですが

上記が「いいえ」なので、その必要はないのですが、アセットをS3にホストすることも可能(あくまでも任意)です。
個人的には、小規模なら手間がかかるだけでアセットをAWSにホストするメリットがほぼないと思います。

もし、どうしてもアセットをS3にホストしたい場合は、CI/CDによる自動配置がベターですが、それが難しかったりそもそも必要ない環境でしたら手動配置することになるでしょう。
そしてその場合.envを切り替えるだけでアセットの読み込み先を変更する方法としてはLaravelのバージョンによって異なります。
v5.7.14以上:.envASSET_URLを設定する
v5.7.14未満:以下と同様のヘルパーを用意する
https://github.com/laravel/framework/commit/9172a67b783952c1d3e15452d9c8646dc0b3eb6d

投稿2019/02/25 06:30

xenbeat

総合スコア4258

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

poteto4401

2019/02/26 09:35

assetではなく、`{{ Storage::disk('s3')->url($avatar) }}` このように指定しました。 diskを指定しなくても良いかと思ったのですが、ローカル環境のstorageに画像が無いと表示できないので、ローカル環境でもS3にリクエストするようにしたのですが、このアプローチでも問題ないでしょうか?
xenbeat

2019/02/26 09:57

> assetではなく 結果、アセットはS3にホストしないことになったのですね。 > `{{ Storage::disk('s3')->url($avatar) }}` このように指定しました。 このようにdiskを指定するとenv(環境毎)で切り替えが出来ず、全環境でS3が使用されます。 逆にdiskを指定しないとデフォルトディスク(envで指定したFILESYSTEM_DRIVER)が使用されるので環境毎にdiskを調整することができます。 > ローカル環境のstorageに画像が無いと表示できないので、ローカル環境でもS3にリクエストするようにした ローカルではenvを「FILESYSTEM_DRIVER=local」にして本番では「FILESYSTEM_DRIVER=s3」にすれば良いだけかと思いますが何か問題があったのですか? > このアプローチでも問題ないでしょうか? ローカルでも本番でもs3で良いということならその書き方で良いです。 そこを環境変数によって変えたいというのであれば上記の通り「FILESYSTEM_DRIVER」で調整ください。
poteto4401

2019/02/26 10:05

> ローカルではenvを「FILESYSTEM_DRIVER=local」にして本番では「FILESYSTEM_DRIVER=s3」にすれば良いだけかと思いますが何か問題があったのですか? これだと、ローカルと本番に両方画像が存在しないといけないことになりますよね? http://localhost:8000/img/hoge.png http://<s3のURL>/img/hoge.png S3とローカルに同じ画像をそれぞれ配置するのが一般的なのでしょうか?
xenbeat

2019/02/26 10:47

目線が合ってない気がします。 「アセット(/publicに保存)」と「アプリケーションにより生成されるファイル(/storageに保存)」は別物ですよ? 質問されたのは前者の「アセット」について、コメントでは後者の「アプリケーションにより生成されるファイル」について質問されているという認識で良いですか?
poteto4401

2019/02/26 11:16

すみません。そのあたりのWebの常識を理解していませんでした。 > 質問されたのは前者の「アセット」について、コメントでは後者の「アプリケーションにより生成されるファイル」について質問されているという認識で良いですか? おっしゃる通りです。 質問当初はすべてpublic以下に保存していたのでアセットの質問でした。 ただ、他のサーバーからアクセスすることも考え、サイト内で保存する画像のすべてをS3に保存したほうが良いのかと思い、すべてS3に移そうと思った次第です。 サイト内で使用するロゴ等の固定の画像はpublicに保存するものなのでしょうか?
xenbeat

2019/02/26 11:45 編集

> サイト内で使用するロゴ等の固定の画像はpublicに保存するものなのでしょうか? はい、そのような理解で大丈夫です。 そしてそのような画像はGithub等で管理し、それらをそのまま各環境へデプロイすることが一般的です。 laravel.comでもロゴ等のファイルはpublic(アセット)として保存されています。 https://github.com/laravel/laravel.com/blob/master/resources/views/partners.blade.php#L9 ユーザーがアップロードするアバターやプロフィール写真等は、アプリケーションの処理によって(動的に)生成されるものなので、それらは一般的にStorageに保存します。コメントされたコードのイメージですね。 ``` {{ Storage::disk('s3')->url($avatar) }} ```
poteto4401

2019/02/26 11:52

なるほど、そうなんですね!ありがとうございます!助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問