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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Amazon S3

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

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

解決済

1回答

1849閲覧

S3に画像ファイルをアップロードできない

kyosuke

総合スコア48

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Amazon S3

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

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

0グッド

0クリップ

投稿2022/03/28 10:14

編集2022/04/06 09:59

他質問サイトでも同様の質問をしています。解決した場合はそちらも更新します。よろしくお願いします。

前提

railsでDM機能を作成しています。
ActiveStorageを使用してS3に画像ファイルをアップロードし、送信した画像を表示したいのですが、実装中に以下のエラーメッセージが発生しました。

ActiveStorage、S3のセットアップは以下を参考にして設定しました。
https://zenn.dev/kurao/articles/ce8e583450c76e

実現したいこと

メッセージフォームから送信した画像をメッセージ一覧に表示したい。

発生している問題・エラーメッセージ

localhost:3000の内容 Error storing "(ファイル名)". Status: 0

メッセージフォームから画像を選択して送信を押すと、このようなエラーメッセージがポップアップで表示され、画像をアップロードできません。

該当のソースコード

config/environment/development.rb

1Rails.application.configure do 2 # ... 3 4 config.active_storage.service = :amazon 5 6 # ... 7 8 Rails.application.routes.default_url_options[:host] = 'localhost' 9 Rails.application.routes.default_url_options[:port] = 3001 10end

db/migrate/(日付)_create_active_storage_tables.active_storage.rb

1class CreateActiveStorageTables < ActiveRecord::Migration[5.2] 2 def change 3 create_table :active_storage_blobs do |t| 4 t.string :key, null: false 5 t.string :filename, null: false 6 t.string :content_type 7 t.text :metadata 8 t.bigint :byte_size, null: false 9 t.string :checksum, null: false 10 t.datetime :created_at, null: false 11 12 t.index [ :key ], unique: true 13 end 14 15 create_table :active_storage_attachments do |t| 16 t.string :name, null: false 17 t.references :record, null: false, polymorphic: true, index: false 18 t.references :blob, null: false 19 20 t.datetime :created_at, null: false 21 22 t.index [ :record_type, :record_id, :name, :blob_id ], name: "index_active_storage_attachments_uniqueness", unique: true 23 t.foreign_key :active_storage_blobs, column: :blob_id 24 end 25 end 26end

config/storage.yml

1amazon: 2 service: S3 3 access_key_id: <%= Rails.application.credentials.dig(:aws, :access_key_id) %> 4 secret_access_key: <%= Rails.application.credentials.dig(:aws, :secret_access_key) %> 5 region: <%= Rails.application.credentials.dig(:aws, :s3, :region) %> 6 bucket: <%= Rails.application.credentials.dig(:aws, :s3, :bucket) %>

app/models/message.rb

1class Message < ApplicationRecord 2(省略) 3 has_one_attached :image 4end

app/views/rooms/show.html.erb

1<div class="row my-5"> 2(省略) 3 <% if @messages.present? %> 4(省略) 5<!-- 画像を表示するコード --> 6 <%= image_tag @message.image.variant(resize:'500x500'), class: 'message-image' if @message.image.attached? %> 7<!-- --> 8 9 <% else %> 10 <p>メッセージはまだありません。</p> 11 <% end %> 12 13 14 <%= form_with model: @message do |f| %> 15(省略) 16<!-- 画像を選択するコード --> 17 <div class="field"> 18 <%= f.file_field :images, direct_upload: true, multiple: true %> 19 </div> 20<!-- --> 21 22 <div class="form-group"> 23 <%= f.submit "送信", class: "btn btn-primary" %> 24 </div> 25 <% end %> 26</div> 27

messages_controller.rb

1class MessagesController < ApplicationController 2 3 def create 4 if Entry.where(user_id: current_user.id, room_id: params[:message][:room_id]).present? 5 @message = Message.new(message_params) 6 if @message.save 7 redirect_to "/rooms/#{@message.room_id}" 8 end 9 else 10 flash[:alert] = "メッセージ送信に失敗しました。" 11 end 12 end 13 14 private 15 16 def message_params 17 params.require(:message).permit(:user_id, :content, :image, :room_id).merge(user_id: current_user.id) 18 end 19end

試したこと

ActiveStorage、S3のセットアップに問題があると思い、エラーメッセージを検索しましたが、該当するページが見当たらず、お力添えをいただきたいです。

補足情報(FW/ツールのバージョンなど)

ruby '3.0.2'
rails ' 6.0.4'

-追記(20220329)

@messageがsaveされる前にbinging.pryを設置してエラーをチェックした結果、以下が表示されました。
※一部伏せ字にしています。

Started POST "/rails/active_storage/direct_uploads" for 192.168.160.1 at <日時> +0000 Cannot render console from 192.168.160.1! Allowed networks: 127.0.0.0/127.255.255.255, ::1 Processing by ActiveStorage::DirectUploadsController#create as JSON Parameters: { "blob" => { "filename" => "<ファイル名>", "content_type" => "image/png", "byte_size" => 30047, "checksum" => "<checksumの文字列>" }, "direct_upload" => { "blob" => { "filename" => "<ファイル名>", "content_type" => "image/png", "byte_size" => 30047, "checksum" => "<checksumの文字列>" } } } (0.6ms) BEGIN ActiveStorage::Blob Create (1.3ms) INSERT INTO `active_storage_blobs` ( `key` ,`filename` ,`content_type` ,`byte_size` ,`checksum` ,`created_at` ) VALUES ( '<キー>' ,'<ファイル名>' ,'image/png' ,30047 ,'<checksumの文字列>' ,'<日時>' ) (5.8ms) COMMIT S3 Storage (1.6ms) Generated URL for file at key: <キー> (https://<バケット名>.s3.<リージョン名>.amazonaws.com/<キー>?X-Amz -Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=<アクセスキーID>%2F<日付>%2F<リージョン名>%2Fs3%2Faws4_request&X-Amz-Date=<日付>T<時間>Z&X-Amz-Expires=300&X-Amz-Signe dHeaders=content-length%3Bcontent-md5%3Bcontent-type%3Bhost&X-Amz-Signature=01c10359b86d5cf1ef020d0286e428762f907fd7d6a7db1b8a2ed0c5daf08c8e) Completed 200 OK in 1043ms (Views: 0.7ms | ActiveRecord: 12.0ms | Allocations: 231324)

Cannot render console from <IPアドレス>! のエラーが出ていましたので、以下記事を参考に
config/environment/development.rbにホワイトリストを追記しましたが、同様のエラーが表示され解決に至りませんでした。
https://qiita.com/terufumi1122/items/73da039e6fc90ee0a63f

↓追加したホワイトリスト

Rails.application.configure do config.web_console.whitelisted_ips = '192.168.160.1' (略) end

-追記(20220402)

Dockerfile

1FROM ruby:3.0.2 2RUN apt-get update -qq && apt-get install -y nodejs 3 4# yarnパッケージ管理ツールをインストール 5# https://classic.yarnpkg.com/en/docs/install/#debian-stable 6RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - 7RUN echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list 8RUN apt-get update && apt-get install yarn 9 10RUN apt-get install -y vim 11 12WORKDIR /myapp 13COPY Gemfile /myapp/Gemfile 14COPY Gemfile.lock /myapp/Gemfile.lock 15RUN bundle install 16COPY . /myapp 17 18# Add a script to be executed every time the container starts 19COPY entrypoint.sh /usr/bin/ 20RUN chmod +x /usr/bin/entrypoint.sh 21ENTRYPOINT ["entrypoint.sh"] 22EXPOSE 3000 23 24# Start the main process. 25CMD ["rails", "server", "-b", "0.0.0.0"]

docker−compose.yml

1version: "3" 2 3services: 4 db: 5 image: mysql:8.0 6 7 command: mysqld --default-authentication-plugin=mysql_native_password 8 environment: 9 MYSQL_USER: user 10 MYSQL_PASSWORD: password 11 MYSQL_ROOT_PASSWORD: password 12 ports: 13 - 3306:3306 14 volumes: 15 - ./tmp/db:/var/lib/mysql 16 web: 17 build: . 18 command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'" 19 environment: 20 MYSQL_HOST: db 21 volumes: 22 - .:/myapp 23 ports: 24 - "3000:3000" 25 depends_on: 26 - db 27 tty: true 28 stdin_open: true

-追記(20220404)

イメージ説明

-追記(20220404) CORSの設定

イメージ説明

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

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

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

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

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

yu_1985

2022/03/29 04:32

development.rbに追加してますけど、rails_envはdevelopmentでやっているんですか? また、このRailsはどうやって起動しているのでしょう
kyosuke

2022/03/29 06:35

有難うございます。初心者のため回答がご質問の意図とずれていましたらご指摘をお願い致します。 >development.rbに追加してますけど、rails_envはdevelopmentでやっているんですか? はい。developmentです。 irb(main):001:0> Rails.env => "development" >このRailsはどうやって起動しているのでしょう 申し訳ございません。ご質問が理解できず私なりに推測してお答えします💦 アプリケーションサーバのことでお間違いないでしょうか? アプリケーションサーバはPumaを使用しています。 ご指導お願い致します。
yu_1985

2022/03/29 07:19

そうではなく、Railsを起動する環境のことを聞いています。 参考サイトだとDockerで起動していますが、手元ではどのようにRailsを立ち上げて動作確認をしていますか?
kyosuke

2022/03/29 09:11

ご返信有難うございます。失礼しました。 参考サイトと同様にDockerで起動しています。
yu_1985

2022/03/29 18:19

ではホワイトリストに何を追記しましたか? 極力具体的な設定内容や打ったコマンドを記載してください。 この場合どうせ動かしているのはローカルなのでホワイトリスト全許可でいい気もしますが。
kyosuke

2022/03/30 16:04

内容が不足しており申し訳ございません。 以下をホワイトリストに追記しました。 ``` Rails.application.configure do config.web_console.whitelisted_ips = '192.168.160.1' (略) end ``` >この場合どうせ動かしているのはローカルなのでホワイトリスト全許可でいい気もしますが 有難うございます。恐れ入りますが、自分で調べてみても不明な点が多かったため、ホワイトリスト全許可の方法を教示いただけないでしょうか? また、本エラーはホワイトリストが原因であるということになりますでしょうか。
yu_1985

2022/03/31 08:01

同じような質問が過去にもあります。 https://teratail.com/questions/313537 > ホワイトリストが原因 何をもって「原因」とするかが微妙ですが、根本的にはDocker上で動かしていてネットワーク設定周りが想定通り設定されていないのが問題じゃないでしょうか。 そこをトラブルシュートしてもいいですが、ローカルで動かすだけなら全許可でも別にいいと思います。
kyosuke

2022/04/01 08:10

有難うございます。config/environment/development.rbに config.web_console.whitelisted_ips = '0.0.0.0/0'を追加しましたが、 エラーの内容が変わらずでした。 他に考えられる原因はございますでしょうか。
yu_1985

2022/04/01 08:39

追記したあとに立ち上げ直しましたよね? また本当に全く同じでしたか? 表示されるIP等は異なっていませんでしたか?
kyosuke

2022/04/01 09:15

>追記したあとに立ち上げ直しましたよね? はい。立ち上げ直しました。 >また本当に全く同じでしたか? 表示されるIP等は異なっていませんでしたか? 失礼しました。今回のログを確認したところ、2022/03/29 12:23に投稿したコメントのエラーコードの Cannot render console from 192.168.160.1! Allowed networks: 127.0.0.0/127.255.255.255, ::1 の記述だけありませんでした。 表示されたエラーメッセージの「localhost:3000の内容 Error storing "(ファイル名)". Status: 0」は変わらないままでした。
yu_1985

2022/04/01 09:31

Railsは設定や参考サイトを見ると3001番ポートで起動しているようですが、localhost:3000というのはどこから来たものでしょう?
kyosuke

2022/04/01 16:26 編集

有難うございます。 環境構築は別のサイトを参考にしており、後からActiveStorage、Amazon S3を追加しています。 環境のコードも本文に追記しますのでご確認いただけますでしょうか。
yu_1985

2022/04/04 01:45

development.rbで指定しているポートと起動しているポートが異なっているのですが、そこはそろえなくて問題ないですか?
kyosuke

2022/04/04 04:11

ご確認有難うございます。 development.rbのRails.application.routes.default_url_options[:port] = 3001をRails.application.routes.default_url_options[:port] = 3000に変更し再起動しましたが 状況は変わらずでした。
yu_1985

2022/04/04 05:02

S3のアップロード自体は200 OKになっているように見えますが、S3を確認したらどうなっていますか?
kyosuke

2022/04/04 05:27

確認方法が間違っていましたら申し訳ございません。 S3にログインしてオブジェクトを確認したところ何もありませんでした。 画像を本文に追記しますのでご確認いただけますでしょうか。
yu_1985

2022/04/05 04:29

CORS設定は何でもいいわけではなく、今回で言うとアップロードに必要なPUTの許可が足りないのでそれを入れてください。 https://railsguides.jp/active_storage_overview.html PUT以外の許可を入れるかどうかは要件次第です。
kyosuke

2022/04/06 05:14

有難うございます! PUTを許可したところ、本質問のエラーメッセージが表示されることなく、s3のバケットのオブジェクトにファイルが追加されました! ここまでは良かったのですが、ビューに画像が表示されないことで行き詰まってしまいました。 railsガイド確認し抜けている箇所がないと思っていますが、お分かりになりますでしょうか? 何度も申し訳ございません💦
yu_1985

2022/04/06 06:03

さすがに出てくる問題すべてをトラブルシュートはできないので別質問にしてください 表示されないといっても、そもそもどのように表示したいのかによってもやり方が変わるのでまずはそこをハッキリさせてください
kyosuke

2022/04/06 06:56 編集

別の質問に致します。有難うございました!
yu_1985

2022/04/06 06:57

それが関係するところはアップロードのところで、アップロードされているにも関わらず画像が表示されないというのは 表示されないというのも単にからの画像を表示するのか、何かしらエラーが出ているのかなどで全然違うので改めて調査と切り分けをしてください。
kyosuke

2022/04/06 07:10 編集

申し訳ございません。以下、誤って投稿してしまいました。 回答いただき有難うございます! >aws-sdk-s3のgemはインストールしています。 >
guest

回答1

0

ベストアンサー

この質問時点での問題点は下記でした

  • config.web_console.whitelisted_ipsでRailsへの許可設定が足りなかった
  • S3バケットにCORSの設定が足りなかった
  • (もしかしたら)起動しているポートと設定ファイルのポートが違った

ここまでやった上で画像が表示されないのは別事象だと思うので改めて切り分けをしてください

投稿2022/04/06 06:06

yu_1985

総合スコア7447

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

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

kyosuke

2022/04/06 06:57

数日にわたりご協力いただき有難うございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問