前提・実現したいこと
RubyとLambdaを用いて、定期的にスクレイピングするシステムを作ろうとしています。
スクレイピングのRubyプログラムはローカル環境では問題なく動きます。
ですが、Lambda上で動かそうとすると、下記のエラーが出ます。
発生している問題・エラーメッセージ
{ "errorMessage": "Read-only file system @ rb_sysopen - file_path", "errorType": "Function<Errno::EROFS>", "stackTrace": [ "/var/task/vendor/bundle/ruby/2.7.0/gems/csv-3.1.7/lib/csv.rb:1391:in `initialize'", "/var/task/vendor/bundle/ruby/2.7.0/gems/csv-3.1.7/lib/csv.rb:1391:in `open'", "/var/task/vendor/bundle/ruby/2.7.0/gems/csv-3.1.7/lib/csv.rb:1391:in `open'", "/var/task/scrap.rb:85:in `lambda_handler'" ] }
該当のソースコード
###########################使用するGem(ライブラリ)########################### require 'nokogiri' require "open-uri" require "mechanize" require "csv" require "date" require "aws-sdk" require "fileutils" def lambda_handler(event:, context:) ~~~~~~~~~~~~~ 省略 ~~~~~~~~~~~~~ file_path = "tmp/ファイル名.csv" ###########################取得した情報の出力########################### CSV.open("file_path", "w") do |csv| z = 2 i = 1 csv << @infos @cm_code.each do |cm_code| @values = [] @values << i values = @doc.xpath("//*[@id='right']/table[2]//tr[#{z}]/td/a", "//*[@id='right']/table[2]//tr[#{z}]/td[@class='right']") values.each do |value| @values << value.text.gsub(/(\d{0,3}),(\d{3})/, '\1\2') end csv << @values z += 1 i += 1 end end ###########################作成したファイルの転送########################### s3 = Aws::S3::Resource.new(region: 'ap-northeast-1') bucket = 'バケット名' name = File.basename(file_path) obj = s3.bucket(bucket).object(file_path) obj.upload_file(file_path) end
試したこと
Lambdaの/var/taskは読み取り専用の実行環境ということは調べたら出てきたので、tmp/ディレクトリで書き出しを行わなければならないということは理解しているのですが、tmp/ディレクトリへの移動がうまくいってないように思います。
Web検索するのですが、tmpディレクトリの指定方法は、「file_path = "tmp/ファイル名.csv"」このようにパスとして指定する方法しか見つかりませんでした。。
間違ってるところがありましたら、教えていただけると助かります。
補足情報(FW/ツールのバージョンなど)
Ruby 2.7.0
zipファイルの構成
① ファイル名.rb
② vendor/bundle
その他
・file_path = "tmp/ファイル名.csv"をfile_path = "/tmp/ファイル名.csv"に変更した場合は、Lambdaで読み込めなくなってしまい、タイムアウトになってしまいます。。
あなたの回答
tips
プレビュー