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

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

新規登録して質問してみよう
ただいま回答率
85.49%
Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

AWS(Amazon Web Services)

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

Q&A

解決済

2回答

5822閲覧

AWS Lambda S3接続に関するPATH設定 (Python 2.7)

umechan47

総合スコア17

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

AWS(Amazon Web Services)

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

0グッド

0クリップ

投稿2016/08/24 19:50

AWS Lambdaでs3からcsvファイルを読み込む関数を書いています.
コードはpython 2.7です.

関数の動作段階で、新しく書き込んだファイルを保存する先のパス設定がおかしくなり以下のエラーが出てきてしまいます。
[Errno 2] No such file or directory: u'/read_csv/write.csv'

保存先はread_csv/write.csvのはずなのですが、なぜu'/read_csv/write.csv'で設定されてしまうのでしょうか.PATHの定義の仕方を色々と試したのですが、うまくいかなかったので、ここで質問させていただいてます.
よろしくお願いします.

###該当のソースコード

python2.7

1from __future__ import print_function 2 3#!/usr/bin/env python 4# -*-coding: utf-8 -*- 5# cording:utf-8 6 7import boto3 # aws lambda python module 8import json 9import csv # csv module 10import os 11import re 12import linecache 13# import numpy as np # import numpy module 14 15print('Loading function') 16 17 18# aws s3 information for connection 19s3_client = boto3.client('s3') # .client or .resource 20 21## Event handler------------------------------------------ 22def lambda_handler(event, context): 23 24 # Get uploded file names 25 bucket = event['Records'][0]['s3']['bucket']['name'] # get latest event record happen in s3 bucket 26 key = event['Records'][0]['s3']['object']['key'] # get latest put filename 27 print(bucket) 28 print(key) 29 # obj = bucket.Object(key) # get object 30 31 path_tmp = '/tmp/' + os.path.basename(key) # path to the uploded file (filename) 32 # path_savefile = re.sub('original_csv/', 'read_csv/', key) # replace the file path 33 path_savefile = '/read_csv/' + os.path.basename(key) 34 print(path_tmp) 35 print(path_savefile) 36 37 try: 38 # Download the file from s3 39 s3_client.download_file(Bucket = bucket, Key = key, Filename = path_tmp) 40 41 # readfile and write file to the new csv file 42 43 with open(path_tmp, "r") as f1: # open file for reading 44 with open(path_savefile, "w") as f2: # open file for writing 45 readData = f1.readline() # read lines one by one and delete /n 46 f2.write(readData) # write data to new file 47 48 print('finish create copy') 49 50 # Save the file to s3 51 s3_client.upload_file(Filename = path_savefile, Bucket = bucket, Key = key) 52 print('Succeed in creating a new file') 53 54 except Exception as e: 55 print(e) 56 # raise e

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

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

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

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

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

matobaa

2016/08/25 00:31

「保存先はread_csv/write.csvのはずなのですが、なぜu'/read_csv/write.csv'で設定されてしまうのでしょうか」とのことですが、疑問点は以下のどちらですか? 1. read_csv の前にスラッシュがついているのが期待と違う 2. u'…'で囲まれているのが期待と違う
umechan47

2016/08/25 01:15

返信ありがとうございます. 疑問点は2のu'…'で囲まれているという点です.
guest

回答2

0

u'...' という表記は、Python2.xにおけるUnicode文字列を意味しています。
この質問の場合、path_savefile に Unicode文字列が格納されているんでしょう。あまり気にしなくていいかと思います。


エラーの原因については TaichiYanagiya さんも言及していますが、おそらく open(path_savefile = u'/read_csv/write.csv', "w") as f2 で書こうとしたディレクトリがないことが原因でしょう。

よくある質問#Lambda関数 によれば

Q: AWS Lambda 関数のためにディスクにスクラッチスペースが必要な場合はどうすればよいですか?
A: 各 Lambda 関数では /tmp ディレクトリに 500 MB の容量を割り当てることができます。

とのことなので、つまり、path_savefile を /tmp/write.csv.cloned のように作ればよいでしょう。


しかし、単にS3オブジェクトを別のバケットや別キーとしてコピーしたいだけなら、S3.Client.copy_object を使えばいいでしょう。一時ファイルを作ってコピーしようとした場合、作業領域が500MBなので、その半分のサイズしか使えないですし、複数の処理が同時に走った場合など、もっと狭くなってしまう可能性がありますし、質問にあるプログラムだと掃除してないのでゴミも溜まってしまうでしょうけれど、このAPIであれば、そんなサイズの制約を受けずにつかえるかと。

投稿2016/08/25 08:27

編集2016/08/25 09:40
matobaa

総合スコア2493

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

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

umechan47

2016/08/27 10:14

TaichiYanagiyaさんと同様解答ありがとうございました。おかげで解決しました! tmp側の作業領域が500MBまでだとは知らなかったです。 今後に活用させていただきます。
guest

0

ベストアンサー

「u」が付く原因はわかりませんが、エラーの内容は /read_csv/ ディレクトリが存在しないからだと思います。
lambda function の実行環境として、裏でテンポラリーな EC2インスタンスが起動しているのだとすると、/tmp/ は Linux にもともと存在するのでいいのですが、/read_csv/ は lambda function 側で作成する必要があるのではないでしょうか。

(訂正)
lambda function の実行ユーザーは root ではなく一般ユーザーですので、/read_csv/ ディレクトリは作成できないのでした。
matobaa さんの回答のとおり、/tmp/ を使うといいと思います。
「/tmp/別ファイル名」でも、「/tmp/read_csv/」を作成しても。

投稿2016/08/25 02:14

編集2016/08/25 09:08
TaichiYanagiya

総合スコア12141

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

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

umechan47

2016/08/27 10:13

解答ありがとうございました!S3側でのフォルダーを作成し忘れていたことが原因だったようです.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問