🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby on Rails 5

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

Ruby

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

Ruby on Rails

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

Amazon S3

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

AWS(Amazon Web Services)

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

Q&A

解決済

3回答

1824閲覧

S3に画像保存がしたい ArgumentErrorが出ます

ma_k

総合スコア33

Ruby on Rails 5

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

Ruby

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

Ruby on Rails

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

Amazon S3

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

AWS(Amazon Web Services)

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

0グッド

3クリップ

投稿2019/09/25 12:24

編集2019/09/27 09:31

ruby on rais でアプリを開発しています。
OSはMacです。
プロフィール画像を保存するのに、
S3に保存できるように設定しようとしていますが、
ArgumentError in UsersController#update
is not a recognized provider

イメージ説明

が出ます。
原因を検索してもわからず、
困っています。

参考サイト1
参考サイト2

を見ながら進めました。

AvatarUploader

1notebook/app/uploaders 2 3class AvatarUploader < CarrierWave::Uploader::Base 4 include CarrierWave::RMagick 5 6 # S3にアップロードする場合 7 if Rails.env.production? || Rails.env.staging? 8 storage :fog 9 else 10 storage :fog 11 end 12 13 # S3のディレクトリ名 14 def store_dir 15 "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" 16 end 17 18 # デフォルト画像は700x700に収まるようリサイズ 19 process :resize_to_limit => [700, 700] 20 21 # サムネイル画像 22 version :thumb do 23 process resize_to_fill: [100, 100] 24 end 25 26 # 許可する画像の拡張子 27 def extension_whitelist 28 %w(jpg jpeg gif png) 29 end 30 31 # 保存するファイルの命名規則 32 def filename 33 "something.jpg" if original_filename 34 end 35 36 protected 37 # 一意となるトークンを作成 38 def secure_token 39 var = :"@#{mounted_as}_secure_token" 40 model.instance_variable_get(var) or model.instance_variable_set(var, SecureRandom.uuid) 41 end 42end 43

CarrierWave

1notebook/config/initializers 2 3CarrierWave.configure do |config| 4 config.fog_credentials = { 5 provider: 'AWS', 6 aws_access_key_id: ENV['####キー入れました####'], 7 aws_secret_access_key: ENV['####キー入れました####'], 8 region: ENV['us-east-2'], 9 path_style: true 10 } 11 config.fog_public = true 12 config.fog_attributes = {'Cache-Control' => 'public, max-age=86400'} 13 14 config.remove_previously_stored_files_after_update = false 15 16 config.fog_directory = ENV['AWS_S3_BUCKET'] 17 config.asset_host = ENV['AWS_S3_URL'] 18end 19# 日本語の文字化けを防ぐ 20CarrierWave::SanitizedFile.sanitize_regexp = /[^[:word:].\-+]/

usercontroller

1 2notebook/app/controllers/users 3 4class UsersController < ApplicationController 5 6 7 def update 8 @user = User.find(params[:id]) 9 @user.update(params.require(:user).permit(:name, :profile,:avatar,:email)) 10 redirect_to("/users/#{@user.id}") 11 end 12 13 14end 15 16

edithtml

1 2notebook/app/views/users 3 4 <div class="form-body"> 5 <% @user.errors.full_messages.each do |message| %> 6 <div class="form-error"> 7 <%= message %> 8 </div> 9 <% end %> 10 <%= form_for @user do |f| %> 11 <p >名前</p> 12 <%= f.text_field :name, :class => "form-control my-form" %> 13 <p>メール</p> 14 <%= f.text_field :email, :class => "form-control my-form" %> 15 <div class="circle-avatar"> 16 17 <% if current_user.persisted? && current_user.avatar? %> 18 <%= image_tag current_user.avatar.to_s, class: 'avatar_present_img' %> 19 20 <label> 21 <%= f.check_box :remove_avatar %> 画像を削除</label> 22 <% else %> 23 <%= image_tag 'a-logo.gif', class: 'avatar_present_img' %> 24 <!-- classを追加 --> 25 <%= f.hidden_field :avatar_cache %> 26 <% end %> 27 <%= f.file_field :avatar, id: 'post_img' %> 28 <!-- idを追加 --> 29 </div> 30 <p>プロフィール</p> 31 <!-- name属性を設定してください --> 32 <%= f.text_area :profile, :class => "commentForm_textarea" %> 33 <input type="submit" value="保存"> 34 <!-- endを追加してください --> 35 <% end %> 36 </div>

アクセスキーなども入力したのですが、
うまくいきません

アプリ開発初めてなので、
回答がすぐ理解できるか自信がありません。
申し訳ございませんが、
よろしくお願いいたします。

どなたかご教授いただけたらと思います。

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

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

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

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

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

ma_k

2019/09/26 03:14

コメントありがとうございます。 2つ目のファイル修正しました。 恐れ入ります。アプリケーションのルートディレクトリのフルパスはどうやって掲載したらいいのでしょうか。。。
siruku6

2019/09/26 13:00

/home/ユーザー名/abcde/config/initializers/.... のように記載すると皆さんに伝わると思います 使用OSがwindowsだった場合、この書き方にはちょっと戸惑うかもしれませんが
ma_k

2019/09/26 15:55

なるほど。わかりました。修正します!
guest

回答3

0

自己解決

もう少し寝かせて再チャレンジ。

投稿2019/11/25 07:23

ma_k

総合スコア33

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

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

0

すみません、普段私が使っている設定なのですが、もしなかなかうまくいかないようであれば、こんな設定も試してみてください

ruby

1# config/initializers/carrierWave.rb 2 3require 'carrierwave/storage/abstract' 4require 'carrierwave/storage/file' 5require 'carrierwave/storage/fog' 6 7CarrierWave.configure do |config| 8 config.storage :fog 9 config.fog_provider = 'fog/aws' 10 config.fog_directory = 'バケット名' 11 config.asset_host = 'https://s3.amazonaws.com/バケット名' 12 config.fog_public = false 13 config.fog_credentials = { 14 provider: 'AWS', 15 aws_access_key_id: 'AWS_ACCESS_KEY_ID', 16 aws_secret_access_key: 'AWS_SECRET_ACCESS_KEY', 17 region: 'us-east-2' # ←自身のregionを入力 18 } 19end

↑のは最低限の情報で、一部省略してますが、これでも動くはずです。

↓実際使っているのはここに書いてあります
[Rails4] CarrierWave 経由で AWS S3 に pdf をアップロード(ACCESS DENIED の対処)

補足

また、エラーを見る限りでは環境変数自体が読み込めておらず空になっているように見えますので、環境変数が設定されているか、環境変数名が間違っていないかなども確認した方が良いでしょう。

投稿2019/09/27 11:39

編集2019/09/28 00:10
siruku6

総合スコア1382

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

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

ma_k

2019/09/30 08:36

コメントありがとうございます。 いただいたコメントの中のコードに書き換えて試してみましたが、 同じエラーでした。 補足に追記してくださった環境変数について無知だったため、 検索し、試している所です。 環境変数を調べながら https://qiita.com/yuichir43705457/items/7cfcae6546876086b849 を参考に試していた所、エラーが代わり、 Missing required arguments: aws_access_key_id, aws_secret_access_key になりました。引き続き原因と解決を探しています!
siruku6

2019/10/01 11:51

なぜそのエラーが出るのかイメージが沸かないのですが、そのエラーであればこの人が解決しているようです https://qiita.com/y_u_y_a/items/72bd74ab1a2d2950435a そのエラーが出た該当箇所(ファイル名と行番号)は判明していますか?
ma_k

2019/11/25 07:21

長々と返事してなくて申し訳ありません。エラーの解決試みておりましたが、 頭の容量が足らずフリーズしておりました。 質問のエラーを含め、検討している機能は もう少しスキルつけてから再チャレンジしようと思います。 お世話になりました。またご縁ありましたらよろしくお願いします。
guest

0

こんばんは。
AWS側の設定は正しくできているかと思いますが、AWSのアクセスキーやシークレットを使って、プログラムから操作をすること自体は、初めてでしょうか?

CarrierWaveの設定が気になりましたので、どちらかというと質問になりますが、切り分けのためご確認いただければと思います。

CarrierWaveでの環境変数の設定

一見すると、aws_access_key_id: ENV['####キー入れました####'] という一行を始め、regionの指定のところまで、誤りなのでは?と思います。

ruby

1 config.fog_credentials = { 2 provider: 'AWS', 3 #ここが間違い? 4 aws_access_key_id: ENV['####キー入れました####'], 5 #ここも間違い? 6 aws_secret_access_key: ENV['####キー入れました####'], 7 #ここも間違い? 8 region: ENV['us-east-2'], 9 path_style: true 10 }

本来は、デフォルトでそれぞれ aws_access_key_idはAWS_ACCESS_KEY_ID, aws_secret_access_keyはAWS_SECRET_ACCESS_KEYという名前の環境変数に、値が設定されます。

ruby側でこの値を呼び出す際には、本来はこのような指定になります。

ruby

1 config.fog_credentials = { 2 provider: 'AWS', 3 aws_access_key_id: ENV['AWS_ACCESS_KEY_ID'], 4 aws_secret_access_key: ENV['AWS_SECRET_ACCESS_KEY'], 5 region: 'us-east-2', 6 path_style: true 7 }

もしGitHubのようなSaaSのリポジトリを使ってソースコードを管理しているなら、AWSのアクセスキーのような秘匿情報はソースコード中にハードコードすると漏洩する危険性がありますので、このように環境変数からするように書きます。

ENV['####キー入れました####']

これだと、もし本当に ENV['AKxxxxxxxxxxxxxxxxM7'] みたいな値をセットしてしまったとしたら、誤りですし、うまく動かなかったにしても、キーのハードコードに近いので、ご注意ください。

ソースは手元の環境のみで動かしていて、キーはコミットしていないという状態なら、

ruby

1 config.fog_credentials = { 2 provider: 'AWS', 3 aws_access_key_id: 'ここに実際のアクセスキーIDの値', 4 aws_secret_access_key: 'ここに実際のシークレットアクセスキーの値', 5 region: 'us-east-2', 6 path_style: true 7 }

でうまく動くか試せば良いかとは思います。
(ただ、やはりリモートリポジトリにキーを直書きしたままプッシュしないようにご注意を)

OSの情報やプログラムをコーディング、動かしている環境

もし、キーをハードコードした状態でうまく動いたなら、あとはハードコードの部分を環境変数で渡すように修正すれば良いです。

なお、環境変数の設定はOSによって差があったりしますので、後付けで申し訳ないのですが、実行環境(OS)だけは少なくとも質問に追記いただけると助かります。

あとから同じように困って、この質問にたどりついた方にとっても、助かりますので。

以上ですが、見当違いだったらご容赦ください。

投稿2019/09/26 14:22

編集2019/09/26 14:23
suama

総合スコア1997

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

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

ma_k

2019/09/27 09:31

コメントありがとうございます。 AWSを使うのも初めてでして、調べながら進めてます。 https://ty-engineer.com/ruby-on-rails/s3-carrierwave-fog-imageupload/ のサイトをメインに設定しました。 キーそのまま入れていて、Git(非公開でしたが)に 危うくリポジトリする所でした。ご指摘ありがとうございます。 リポジトリする前に回答いただいたコードに実際にキーを入力する方法で 試してみましたが上手くいきませんでした。 ArgumentError in Users#show is not a recognized provider となります。 OSはMacです。
suama

2019/09/27 11:18 編集

ありがとうございます。 (1) ファイル名と配置場所 Carrierwaveの設定は notebook/config/initializers/carrierwave.rb になっている (2) 他の設定もいったんハードコードしてみる Gitにコミット&プッシュしない状態で、アクセキー以外でENV['xxxx'] で渡している部分もいったんハードコードしてみてください。 また、念の為、fog_providerの設定も添えてみて、いかがでしょうか? ``` config.fog_directory = '作成したバケット名' config.asset_host = '実際のAWS_S3_URLに該当する値' # ここも念の為追加 config.storage :fog config.fog_provider = 'fog/aws' ```
ma_k

2019/09/30 08:39

コメントありがとうございます。コミットしない状態で、念の為の追記も試してみましたが 同じエラーになってしまいました。 環境変数?がもしかしたらと思い、今https://qiita.com/yuichir43705457/items/7cfcae6546876086b849 を参照しながら進めてみた所。 Missing required arguments: aws_access_key_id, aws_secret_access_key のエラーになりました。 もう少し色々試してみます。
suama

2019/09/30 08:45

実行する前に、こんなコマンドを打つと環境変数に入ります。 (1) ターミナルでまず実行しておく export AWS_ACCESS_KEY_ID='ほんとのAWSのアクセスキーIDの値' export AWS_SECRET_ACCESS_KEY='ほんとのAWSのシークレットアクセスキーの値' (2)設定ファイルをこのようにしておく(抜粋) ``` config.fog_credentials = { provider: 'AWS', aws_access_key_id: ENV['AWS_ACCESS_KEY_ID'], aws_secret_access_key: ENV['AWS_SECRET_ACCESS_KEY'], region: 'us-east-2', path_style: true } ``` (3) この状態で、アプリケーションを起動 rails s とか bundle exec rails s など。 あまりズバリな回答を出せず申し訳ないのですが、がんばってください!
ma_k

2019/09/30 09:22

早速、コメント通りに実行してみました。 編集ページを表示することはできました! そのあと保存しようと試みたら、 Broken pipe (Errno::EPIPE)というみたことがないエラーに なりました。 今解決策を調べている所です。 一歩進めました。ありがとうございます。
suama

2019/09/30 12:21

regionのところは、'ap-northeast-1' (アジアパシフィック (東京))ではないですか? 'us-east-2' (米国東部 (オハイオ)) と書かれていますが、念の為。バケット名も確認するといいかもしれませんね。
ma_k

2019/11/25 07:22

長々と返事してなくて申し訳ありません。エラーの解決試みておりましたが、 頭の容量が足らずフリーズしておりました。 質問のエラーを含め、検討している機能は もう少しスキルつけてから再チャレンジしようと思います。 お世話になりました。またご縁ありましたらよろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問