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

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

ただいまの
回答率

90.39%

  • AWS(Amazon Web Services)

    2674questions

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

  • Python 2.7

    1487questions

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

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 1,965

umechan47

score 11

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の定義の仕方を色々と試したのですが、うまくいかなかったので、ここで質問させていただいてます.
よろしくお願いします.

該当のソースコード

from __future__ import print_function

#!/usr/bin/env python
# -*-coding: utf-8 -*-
# cording:utf-8

import boto3  # aws lambda python module
import json
import csv  # csv module
import os
import re
import linecache
# import numpy as np # import numpy module

print('Loading function')


# aws s3 information for connection
s3_client = boto3.client('s3') # .client or .resource

## Event handler------------------------------------------
def lambda_handler(event, context):

    # Get uploded file names
    bucket = event['Records'][0]['s3']['bucket']['name'] # get latest event record happen in s3 bucket
    key = event['Records'][0]['s3']['object']['key'] # get latest put filename
    print(bucket)
    print(key)
    # obj = bucket.Object(key) # get object

    path_tmp = '/tmp/' + os.path.basename(key) # path to the uploded file (filename)
    # path_savefile = re.sub('original_csv/', 'read_csv/', key) # replace the file path
    path_savefile = '/read_csv/' + os.path.basename(key)
    print(path_tmp)
    print(path_savefile)

    try:
        # Download the file from s3
        s3_client.download_file(Bucket = bucket, Key = key, Filename = path_tmp)

        # readfile and write file to the new csv file

        with open(path_tmp, "r") as f1:  # open file for reading
            with open(path_savefile, "w") as f2:  # open file for writing
                readData = f1.readline()  # read lines one by one and delete /n
                f2.write(readData) # write data to new file

        print('finish create copy')

        # Save the file to s3
        s3_client.upload_file(Filename = path_savefile, Bucket = bucket, Key = key)
        print('Succeed in creating a new file')

    except Exception as e:
        print(e)
        # raise e
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • matobaa

    2016/08/25 09:31

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

    キャンセル

  • umechan47

    2016/08/25 10:15

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

    キャンセル

回答 2

checkベストアンサー

+2

「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/27 19:13

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

    キャンセル

+2

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/27 19:14

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

    キャンセル

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

  • ただいまの回答率 90.39%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • AWS(Amazon Web Services)

    2674questions

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

  • Python 2.7

    1487questions

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