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

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

新規登録して質問してみよう
ただいま回答率
85.47%
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

Ruby

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

AWS(Amazon Web Services)

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

Q&A

0回答

2451閲覧

AWS Lambdaを使ってCSVファイルの書き出したいが、Read-only file systemとエラーが出る。

kamogi

総合スコア1

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

Ruby

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

AWS(Amazon Web Services)

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

0グッド

1クリップ

投稿2020/11/19 08:17

編集2020/11/20 00:21

前提・実現したいこと

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で読み込めなくなってしまい、タイムアウトになってしまいます。。

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

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

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

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

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

yu_1985

2020/11/19 16:28

zipで実行ファイルを上げてると思いますが、実際に上げたファイルのディレクトリ構成を貼ってください
saoyagi2

2020/11/19 22:52

`file_path = "tmp/ファイル名.csv"` を `file_path = "/tmp/ファイル名.csv"` にしたらどうなりますか?
kamogi

2020/11/20 00:21

修正依頼していただき、ありがとうございます! 修正させていただきましたので、お手隙の際にご確認いただけますと幸いです。 よろしくお願いします!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問