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

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

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

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

Amazon S3

Amazon S3 (Simple Storage Service)とはアマゾン・ウェブ・サービスが提供するオンラインストレージサービスです。

Q&A

解決済

1回答

4423閲覧

Laravel8系 aws S3のアップロードについて

tomoto

総合スコア11

Laravel

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

Amazon S3

Amazon S3 (Simple Storage Service)とはアマゾン・ウェブ・サービスが提供するオンラインストレージサービスです。

0グッド

0クリップ

投稿2021/08/07 10:29

現在laravel8系でaws S3にアップロードする機能を持ったアプリを開発中です。
サーバーは複数設計なのでサーバーごとではなくクラウドに保存。

Laravel公式より

composer require --with-all-dependencies league/flysystem-aws-s3-v3 "^1.0"

パッケージのインストールから各種設定まで行い、アップロードしたところなぜかHEADメソッド?が呼ばれてアップロードできません。

Error executing "HeadObject" on "https:...png"; AWS HTTP error: Client error: HEAD https:...png resulted in a 404 Not Found response NotFound (client): 404 Not Found (Request-ID: AAAAAAAAA) -

愚直に読むとS3にないので取得できないというような意味だと思いますがそもそもアップロードの時に発生するので無くて当たり前だと思うのですが。


この404エラーが出る前に一度403エラーが出て認証系を直したのでそこはクリアできているはず。
s3のブロックパブリックアクセス (バケット設定)もすべてOFF

さらにその403が出る前(一番最初)にstackoverflowで全く同じエラーがでたので対応しました。

vendor\league\flysystem-aws-s3-v3\src\AwsS3Adapter.php

php

1use Aws\Result; 2use Aws\S3\ClearBucket; 3use Aws\S3\Exception\ClearBucketException; 4use Aws\Exception\S3Exception; 5 6//use Aws\S3Client; 7use Aws\S3\S3Client; 8use Aws\S3\S3ClientInterface; 9 10use GuzzleHttp\Exception\RequestException; 11use League\Flysystem\Adapter\AbstractAdapter; 12use League\Flysystem\AdapterInterface; 13use League\Flysystem\Config; 14use League\Flysystem\Util;

余談ですがflysystem-aws-s3-v3のインストール時に一回バージョン指定せずに最新系をインストールしてしまいそれ関係のエラーが出て再度バージョン指定しなおしたことを思い出して(余計なものもインストールされてるかもと思い)、まっさらなLaravel8系で行ってもやはりエラーになったので、こういうものなのだと諦めて新しいlaravelのvendorファイルを書き換えると問題のlaravelと同じ状況に。


ここまですべてローカルのpc(artisan serve)上の話ですがS3ロールを設定した仮想本番環境でも同様のエラーが発生しています。

以下、関係ありそうなファイル群です。冗長だと思われる記述は消してあります
composer.json

php

1{ 2 "name": "laravel/laravel", 3 "type": "project", 4 "description": "The Laravel Framework.", 5 "keywords": ["framework", "laravel"], 6 "license": "MIT", 7 "require": { 8 "php": "^7.3|^8.0", 9 "fideloper/proxy": "^4.4", 10 "franzose/closure-table": "^6.1", 11 "fruitcake/laravel-cors": "^2.0", 12 "guzzlehttp/guzzle": "^7.0.1", 13 "laravel/framework": "^8.40", 14 "laravel/jetstream": "^2.3", 15 "laravel/sanctum": "^2.6", 16 "laravel/tinker": "^2.5", 17 "league/flysystem-aws-s3-v3": "1.0", 18 "league/flysystem-cached-adapter": "~1.0", 19 "livewire/livewire": "^2.0", 20 "nesbot/carbon": "^2.51" 21 }, 22 "require-dev": { 23 "facade/ignition": "^2.5", 24 "fakerphp/faker": "^1.9.1", 25 "laravel/sail": "^1.0.1", 26 "mockery/mockery": "^1.4.2", 27 "nunomaduro/collision": "^5.0", 28 "phpunit/phpunit": "^9.3.3" 29 }, 30 "autoload": { 31 "psr-4": { 32 "App\": "app/", 33 "Database\Factories\": "database/factories/", 34 "Database\Seeders\": "database/seeders/" 35 } 36 }, 37 "autoload-dev": { 38 "psr-4": { 39 "Tests\": "tests/" 40 } 41 }, 42 "scripts": { 43 "post-autoload-dump": [ 44 "Illuminate\Foundation\ComposerScripts::postAutoloadDump", 45 "@php artisan package:discover --ansi" 46 ], 47 "post-root-package-install": [ 48 "@php -r \"file_exists('.env') || copy('.env.example', '.env');\"" 49 ], 50 "post-create-project-cmd": [ 51 "@php artisan key:generate --ansi" 52 ] 53 }, 54 "extra": { 55 "laravel": { 56 "dont-discover": [] 57 } 58 }, 59 "config": { 60 "optimize-autoloader": true, 61 "preferred-install": "dist", 62 "sort-packages": true 63 }, 64 "minimum-stability": "dev", 65 "prefer-stable": true 66} 67

config/filesystem.php
どこかでlaravel8は設定不要と見たが一応

php

1<?php 2 3 'cloud' => env('FILESYSTEM_CLOUD', 's3'), 4 5 'disks' => [ 6 's3' => [ 7 'driver' => 's3', 8 'key' => env('AWS_ACCESS_KEY_ID'), 9 'secret' => env('AWS_SECRET_ACCESS_KEY'), 10 'region' => env('AWS_DEFAULT_REGION'), 11 'bucket' => env('AWS_BUCKET'), 12 'url' => env('AWS_URL'), 13 'endpoint' => env('AWS_ENDPOINT'), 14 'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false), 15 ], 16 ], 17]; 18

Controller

php

1namespace App\Http\Controllers; 2 3use Illuminate\Http\Request; 4use Illuminate\Support\Facades\Storage; 5// use Storage; どっちでも変わらず 6 7class SettingController extends Controller 8{ 9 public function kycPost(Request $request) 10 { 11 //フォームからファイル取得 12 $front = $request->file('front'); 13 $back = $request->file('back'); 14 $selfie = $request->file('selfie'); 15 16 //これはローカルに保存出来てるので、↑↑↑ここまで問題ない 17 //$front = $request->file('front')->store("abc"); 18 19 // バケットへアップロード 以下三つすべてエラー 20 $front_path = Storage::disk('s3')->put("", $front); 21 $back_path = Storage::disk('s3')->putFile("aaa", $back, 'public'); 22 Storage::disk('s3')->putFile("aaa", $selfie); 23 24 return redirect('setting/kyc'); 25 } 26}

.env

php

1AWS_ACCESS_KEY_ID=KKKKKKKKKKKKKKK 2AWS_SECRET_ACCESS_KEY=SSSSSSSSSSSSSSSS 3AWS_DEFAULT_REGION=ap-northeast-1 4AWS_BUCKET=aws-aaaaaaaaaaa 5AWS_USE_PATH_STYLE_ENDPOINT=false

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

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

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

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

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

guest

回答1

0

自己解決

LaravelとしてではなくPHP(AWS SDK for PHP)として妥協的に解決したので一応載せておきます。

あくまで動作確認的なものでアップロード後のpathをデータベースに格納したり、高速化させるためにforeachでputObjectを回さずにcommandを使って一括アップロードしたり、その他リファクタリングはしてないですが...

php

1namespace App\Http\Controllers; 2 3use Illuminate\Http\Request; 4use Aws\S3\S3Client; 5 6// use Illuminate\Support\Facades\Storage; 7// use Storage; 2人ともサヨナラ 8 9public function kycPost(Request $request) 10 { 11 $front = $request->file('front'); 12 13 $s3client = S3Client::factory([ 14 'credentials' => [ 15 'key' => env('AWS_ACCESS_KEY_ID'), 16 'secret' => env('AWS_SECRET_ACCESS_KEY'), 17 ], 18 'region' => env('AWS_DEFAULT_REGION'), 19 'version' => 'latest', 20 ]); 21 22 $result = $s3client->putObject([ 23 'ACL' => 'public-read', 24 'Bucket' => env('AWS_BUCKET'), 25 'Key' => 'abc/front.png', 26 'Body' => fopen($front, 'rb'), 27 'ContentType' => $front->getMimeType(), 28 ]); 29 30 //$result['ObjectURL']; ここにアップロード後のpathが入る 31 32 return redirect('setting/kyc'); 33 }

laravelの解決策が来たら嬉しい?ですがlaravel9でバージョン周りが改善されるまではこれで乗り切ろうと思います。
こっちは本番環境に移した(git clone)ときにわざわざvendorフォルダのファイルの記述ミスを書き換えなくて済むという利点があったりします。


まっさらな状態から始めるなら、
composer require --with-all-dependencies league/flysystem-aws-s3-v3 "^1.0"ではなく
composer require aws/aws-sdk-phpでいいのかな

検証してないですが出来なかったら上の方を入れるけど、configとvendorの中のやつは使わないはずなので.envだけ書き換えて、解決方法に記載したControllerで完結

投稿2021/08/08 03:56

tomoto

総合スコア11

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問