yuktkhs
@yuktkhs (yuki takahashi)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

LaravelでAWS S3に画像をアップロードしたい

Q&A

Closed

解決したいこと

画像投稿機能の実装をしようとしています。
AWS S3へアップロードしたいのですが、うまくいかないのでお力添えください。

・S3より「バケットを作成」
・アクセス許可の設定の際に以下のチェックは外した。
◎新しいアクセスコントロールリスト (ACL) を介して許可されたバケットとオブジェクトへのパブリックアクセスをブロックする
◎任意のアクセスコントロールリスト (ACL) を介して許可されたバケットとオブジェクトへのパブリックアクセスをブロックする

該当ソースコード

createアクションにて画像ファイルの保存先をAWS S3
dd($form)にて画像ファイルがきちんと渡されてはいることは確認できた

public function create(Request $request)
  {
      $this->validate($request, News::$rules);
      $news = new News;
      $form = $request->all();

      if (isset($form['image'])) {
        $path = Storage::disk('s3')->putFile('/',$form['image'],'public');
        $news->image_path = Storage::disk('s3')->url($path);
      } else {
          $news->image_path = null;
      }
      unset($form['_token']);
      unset($form['image']);
      $news->fill($form);
      $news->save();

      return redirect('admin/news/create');
  }

発生している問題・エラー

エラーコード

Aws\S3\Exception\S3Exception
Error executing "PutObject" on "https://s3.us-east-2.amazonaws.com/%60yuktkhs%60/0Eo3zOz6wPV5zasCgzgnbOs6ZZJeTP1Cy9NtYOXJ.png"; AWS HTTP error: Client error: `PUT https://s3.us-east-2.amazonaws.com/%60yuktkhs%60/0Eo3zOz6wPV5zasCgzgnbOs6ZZJeTP1Cy9NtYOXJ.png` resulted in a `400 Bad Request` response: <?xml version="1.0" encoding="UTF-8"?> <Error><Code>InvalidBucketName</Code><Message>The specified bucket is not valid.< (truncated...) InvalidBucketName (client): The specified bucket is not valid. - <?xml version="1.0" encoding="UTF-8"?> <Error><Code>InvalidBucketName</Code><Message>The specified bucket is not valid.</Message><BucketName>`yuktkhs`</BucketName><RequestId>0C47279A63EEDF56</RequestId><HostId>zZ5GMW6Bme4j65J7x0gXeDoF1N/h+eEpVTLLqLwb+lf8fu2I4gg1bYmfdYffPW8TdTajHZOaTnk=</HostId></Error>

エラー画像
スクリーンショット 2021-01-31 14.33.30.png

自分で試したこと

環境変数の確認

env.ファイルから確認
AWSマネジメントコンソールと見比べて確認しましたが、特に間違えてはなさそうでした

AWS_ACCESS_KEY_ID=`******************`
AWS_SECRET_ACCESS_KEY=`**************`
AWS_DEFAULT_REGION=us-east-2
AWS_BUCKET=`yuktkhs`

]

cacheの削除

$ php artisan config:cache
$ php artisan cache:clear
0

1Answer

よく確認していただきたいのですが、Bucketの名前が無効だとエラーメッセージに出力されています。

<?xml version="1.0" encoding="UTF-8"?>
<Error>
<Code>InvalidBucketName</Code>
<Message>The specified bucket is not valid.

では、もう少しエラー内容を詳しく見てみましょう。

PUT https://s3.us-east-2.amazonaws.com/%60yuktkhs%60/(省略).png resulted in a 400 Bad Request

Bucketの前後に%60が入ってしまっています。
ここが怪しそうです。 %60` をURLエンコードした際の値です。

次にBucketを設定している箇所を確認してみましょう。

AWS_ACCESS_KEY_ID=`******************`
AWS_SECRET_ACCESS_KEY=`**************`
AWS_DEFAULT_REGION=us-east-2
AWS_BUCKET=`yuktkhs`

Bucketの前後に ** が含まれています。 これが原因と思われます。 AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY の値の前後にも ** が含まれていますが、これも不要ではないでしょうか。

以上となります。
確認の上で再度試行してみてください。
宜しくおねがいします。

2Like

Comments

  1. @yuktkhs

    Questioner

    コメントありがとうございます。
    ご指摘の通り、env.ファイルの記に問題があったようでした。
    バッククォーテーション(`) ではなくシングルクォーテーション(')でした。
    ありがとうございました。

Your answer might help someone💌