いつもお世話になっております。
現在Ralisでwebページを作成しております。
AWS上でRails + Nginxでシステム運用しており、ファイルのアップロードはCarrierwave、アップロード先はAWSのS3を用いております。
AWSはt2 micro(メモリ1G)を使用しています。
ページにダウンロードリンクが存在し、クリックするとS3上のファイルをそのPCにダウンロードする流れです。
しかしダウンロードしようとすると502 Bad Gatewayエラーがブラウザ上には表示され、railsログには「nomemoryerror (failed to allocate memory)」エラーが出ている状況です。
Railsのビューとコントローラは下記のようにコーディングしています。
vmstatでメモリを見てみると初期状態でfreeは520M程度であり、300M程度の動画をダウンロードを開始すると一気に下がっていき、60M付近でエラーとなりpumaがタスクキルされてしまうような流れです。
少々古い記事ですが、下記URLに大きいファイルをダウンロードする際のコードが書いてあるのですが、S3の場合どのようにすればよいのか分からずこちらに質問させていただきました。
https://qiita.com/AKB428/items/a0a7c269e0e910dc18d4
その他S3でダウンロードする場合に適切な方法があればご教示いただけますと幸いです。
よろしくお願いいたします。
環境
Amazon Linux release 2 (Karoo)
Rails 5.2.3
Ruby version: 2.6.1
RDS
ELB
S3
ーーーーーーーーーー 追記 ーーーーーーーーーー
調査してみると、ダウンロード時の「data.read」ではなく
data = client.get_object(:bucket => Bucket_name,
:key => user.movie.path).body
でメモリ不足になっていそうです。
ruby
1# ビュー 2<a href="/dl/movie/id}">ダウンロード</a> 3 4 5# コントローラー 6def download 7 user = User.find_by(id: params[:user_id]) 8 client = Aws::S3::Client.new( 9 :region => Region_name, 10 :access_key_id => S3_access_key, 11 :secret_access_key => S3_secret_key) 12 @bucket = Aws::S3::Resource.new( 13 :region => Region_name, 14 :access_key_id => S3_access_key, 15 :secret_access_key => S3_secret_key 16 ).bucket(Bucket_name) 17 18 data = client.get_object(:bucket => Bucket_name, 19 :key => user.movie.path).body 20 21 send_data data.read, filename: "xxxxx.mp4", disposition: 'attachment' 22 end 23
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。