Laravelのファイルストレージシステムは、Storageファサードを通してローカルもS3も同じようにストレージとして扱える便利機能です。
今回はその練習を兼ねて、フォームからPOSTされた文字列をAWS S3のファイルに書き込みと、それを読み込んで表示するごく簡単なサンプルを作ってみました。
必要な準備
- AWSで何らかのバケットを用意
- AWSで自分のIAMユーザーのアクセスキーを作成
- 使用するIAMユーザーが用意したバケットに読み書きできる
実装
まず事前に必要パッケージをインストールします。
(バージョン指定は公式ドキュメントに書かれていたもの)
1 2 3 4 5 | # S3ドライバインストール composer require league/flysystem-aws-s3-v3 "~1.0" # キャッシュアダプタインストール composer require league/flysystem-cached-adapter "~1.0" |
ちなみにartisan serveを起動している場合パッケージインストール後に起動し直さないとエラーになる気がします。
.envのAWS関連の変数4つを設定します。
1 2 3 4 5 | AWS_ACCESS_KEY_ID=[AWSのアクセスキー ID] AWS_SECRET_ACCESS_KEY=[AWSのシークレットアクセスキー] AWS_DEFAULT_REGION=ap-northeast-1 AWS_BUCKET=[バケット名] |
ちなみにこれらの環境変数が読まれる先の設定ファイルはconfig/filesystem.phpにあります。
routes/web.phpにルート追加
1 2 3 | Route::get('/s3', 'S3Controller@index'); Route::post('/s3', 'S3Controller@store'); |
/s3にフォームとファイルの中身を表示して、POSTするとS3に書き込まれてまた/s3に戻るというだけの、昔の掲示板みたいな構成にします。
app/Http/Controllers/S3Controller.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | <?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Support\Facades\Storage; class S3Controller extends Controller { public function index() { // 存在確認 if (Storage::disk('s3')->exists('hoge.txt')) { $data = Storage::disk('s3')->get('hoge.txt'); } else { // 無いときはとりあえず空文字列 $data = ''; } return view('s3.index', compact('data')); } public function store(Request $request) { // 入力取得 $text = $request->input('text'); // S3のファイルに書き込み Storage::disk('s3')->put('hoge.txt', $text); return redirect('/s3'); } } |
resources/views/s3/index.blade.php
1 2 3 4 5 6 7 8 | <form action="/s3" method="post"> @csrf <input type="text" name="text"> <input type="submit"> </form> <hr> {{ $data }} |
書き込むフォームとその下に書き込まれた中身を表示しているだけの単純なページです。
ちなみに@csrfを忘れると419 Page Expiredになります…。
こんな感じでS3への書き込みと読み込みができます。便利ですね。