前提・実現したいこと
画像投稿サイトをAWSでデプロイをして、ユーザーが投稿フォームから画像の投稿する時、エラーが発生するようになりました。文字だけの投稿なら問題なくできます。
.envの設定を変更すれば、解決できると思っておりましたが、以下の対処法でも解決することができませんでした。
踏み台サーバーからSSH接続をして、2台のwebサーバー(Private1,2)に接続をして、
$cd /var/www/html/laravel-app $sudo vim .env ----------------------------------------- AWS_ACCESS_KEY_ID=XXXXXXXXX AWS_SECRET_ACCESS_KEY=XXXXXXXXXXX AWS_DEFAULT_REGION=ap-northeast-1 AWS_BUCKET=AAAAAAA ----------------------------------------- $php artisan config:clear $php artisan cache:clear
発生している問題・エラーメッセージ
"The PutObject operation requires non-empty parameter: Bucket"
投稿用
php
1public function store(PostRequest $request) 2 { 3 4 $image_file = ""; 5 $upload_image = $request->file('image_file'); 6 7 if ($upload_image) { 8 //$path = $upload_image->store('uploads', 'public'); 9 $path = Storage::disk('s3')->put('/', $upload_image, 'public'); 10 if ($path) { 11 //Image::make($upload_image->getRealPath())->resize(150, 150)->save(); 12 $image = Image::make($upload_image->getRealPath()); 13 $image->resize(150, 150); 14 $image->path = Storage::disk('s3')->url($path); 15 $image->save(); 16 $image_file = $path; 17 } 18 } 19 20 21 $post = new Post; 22 $post->subject = $request->subject; 23 $post->message = $request->message; 24 $post->image_file = $image_file; 25 $post->name = ""; 26 $post->user_id = Auth::id(); 27 $post->save(); 28 return redirect('/bbs')->with('poststatus', '新規投稿しました'); 29 }
config/filesystems.php
php
1 'disks' => [ 2 3 'local' => [ 4 'driver' => 'local', 5 'root' => storage_path('app'), 6 ], 7 8 'public' => [ 9 'driver' => 'local', 10 'root' => storage_path('app/public'), 11 'url' => env('APP_URL').'/storage', 12 'visibility' => 'public', 13 ], 14 15 's3' => [ 16 'driver' => 's3', 17 'key' => env('AWS_ACCESS_KEY_ID'), 18 'secret' => env('AWS_SECRET_ACCESS_KEY'), 19 'region' => env('AWS_DEFAULT_REGION'), 20 'bucket' => env('AWS_BUCKET'), 21 #'url' => env('AWS_URL'), 22 #'endpoint' => env('AWS_ENDPOINT'), 23 ], 24 25 ],
それまで行っていた事
ACMを利用してHTTPS通信可能にする。このあたりを問題が起きる直前に動かしていたもの
webサーバがオートスケーリングする仕組みを構築しています。
確認事項
.envの設定変更
バゲット名は、S3より確認をして正しい名前の確認済みです。
AWS_BUCKET="XXXXXXXXX" ダブルクォーテーションで囲っても駄目でした。
// AWS_BUCKETの下に以下を追記
AWS_URL=https://s3-ap-northeast-1.amazonaws.com/AAAAAAAAAA/
参考記事
どこでどうやって環境年数に設定したその値を使っているかわからないので何も言えません。
普通に考えたらPutObjectをするときにBucket名が渡されていないのが原因と読み取れるので、どこでPutObjectしているのかソースを見直して、そこの処理を確認してみてください。
その上でわからなければ該当のソースも質問に追記してください。
問題箇所だと思う、ソースコードを追記いたしました。
PutObjectを使用せずに、S3へアップロード処理して、今までこのようなエラーはローカル環境でも発生していませんでした。
config/filesystems.phpでS3にアクセスするための情報を渡していませんか?
そこではどう設定しているんでしょうか。
また、今回の問題と関係ありませんがEC2上で動かすならアクセスキーを使うのをやめてIAMロールを使用するようにしてください。
https://dev.classmethod.jp/articles/laravel-s3-try/
config/filesystems.phpの設定を追記しました。
さきほどローカル環境で確認したらローカルでも同じエラーが発生しています.. (T_T)
(ローカル環境では問題なく画像の投稿が出来ていたので、AWSでデプロイをし、一昨日からこのエラーが発生しています。)
ありがとうございます。今の問題が解決したらIAMロールへ変更したいと思います。
読みづらいのでソースを貼るときはコードブロックを使って記載してください。
エラーの内容からすると、.envの内容をきちんと読み取れているかがちょっと怪しいですね。
WEBサーバ2台あるとのことですが、ALB配下にあるということですか?
両方のサーバでちゃんと設定を読み込み直していますか?
ところで
url' => env('AWS_URL'),
の設定はなぜ行っているのでしょう?
基本的に特別なことをしてなければ設定は不要ですし、今はパス形式のリクエストは受け付けられない可能性があるので、設定をしないか、するなら仮想ホスト形式で設定してください。
https://dev.classmethod.jp/articles/s3-no-longer-support-path-style-requests/
ベタ貼り失礼いたしました。コードブロックに直しました。
はい、webサーバー2台はALBターゲットグループに登録してあります。
このエラーが発生してから、両方のサーバーの
.envファイルに
"AWS_URL=https://<バゲット名>.s3-ap-northeast-1.amazonaws.com"
追記しました。エラー解消にはなりませんでしたが、 (考えるとこれは設定しなくてもよさそうですね..)
参考URLありがとうございます。
たしか、参考にした記事にurl' => env('AWS_URL')が書いてあったと記憶しています。url' => env('AWS_URL'),コメントアウトにしておきます。
ついでにいうと'endpoint' => env('AWS_ENDPOINT'),もとくに必須ではないと思います。
> webサーバー(Private1,2)
とのことですが、これらはプライベートサブネットの中にあるということですか?
S3にアクセスできるような設定は何かしらしていますか?
プライベートサブネットからS3へアクセスできるようになる設定していません…
こちらを参考にエンドタイプを” Gateway”にして設定してみました。^^
ルートテーブ(private)へもエンドポイントのルーティングが追加されています。それから、
webサーバー(private)で、# AWS-CLIのs3コマンドは実行可能になりました。
$ aws s3 ls --region ap-northeast-1 --recursive s3://<バゲット名>
https://dev.classmethod.jp/articles/vpc-endpoint-for-s3/
まだ、同じエラーが出ています。(;´д`)トホホ…
”'endpoint' => env('AWS_ENDPOINT'),”も削除します。
エラーの内容が変わらないなら.envの内容がきちんと読み込めていない可能性が高いと思うのですが、環境変数が正しく設定されていることはどこかしらで確認できますか?
あなたの回答
tips
プレビュー