【Laravel】AWS S3にファイルをアップロードする

1 min read読了の目安(約1400字

はじめに

LaravelでAWS S3にファイルをアップロードする手順をまとめてみました。
LaravelプロジェクトとAWS S3のバケットはすでに作成されているものとします。

手順

1. パッケージインストール

公式ドキュメントを参考に必要なパッケージをインストールします。

composer require league/flysystem-aws-s3-v3 "~1.0"

バージョンを指定しておかないとエラーになることがあるようです。

https://qiita.com/ucan-lab/items/61903ce10a186e78f15f

2. S3の設定を追加

S3の設定はconfig/filesystems.phpにデフォルト書かれているので、これを元に.envファイルに設定を追加します。

config/filesystems.php
's3' => [
    'driver' => 's3',
    'key' => env('AWS_ACCESS_KEY_ID'),
    'secret' => env('AWS_SECRET_ACCESS_KEY'),
    'region' => env('AWS_DEFAULT_REGION'),
    'bucket' => env('AWS_BUCKET'),
    'url' => env('AWS_URL')
],

アクセスキー、シークレットアクセスキー、バケット名のところにはAWSでS3を作成した時のものを入れます。

.env
AWS_ACCESS_KEY_ID=アクセスキー
AWS_SECRET_ACCESS_KEY=シークレットキー
AWS_DEFAULT_REGION=ap-northeast-1
AWS_BUCKET=バケット名
AWS_URL=https://s3-ap-northeast-1.amazonaws.com/バケット名

また、EC2にS3アクセス用のIAMロールを設定している場合、アクセスキーとシークレットキーは空白で登録します。
空白にすることでインスタンス内部に持っているアクセスキーを参照してくれます。

.env
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=ap-northeast-1
AWS_BUCKET=バケット名
AWS_URL=https://s3-ap-northeast-1.amazonaws.com/バケット名

3. S3にアップロードするコマンドを追加

S3にアップロードするコードを必要な箇所に追加します。

$file = $request->file('file');
Storage::disk('s3')->putFile('/', $file);

ファイル名を指定したい場合は下記の方法でアップロードできます。

$file = $request->file('file');
$file->storeAs('/', $file_name, 's3');