2016-09-08 15 views
12

file.csvをS3バケットにドロップすると、私のラムダ関数から以下のエラーが表示されます。ファイルは大きくなく、私は読書のためにファイルを開く前に60秒の睡眠を加えましたが、何らかの理由でファイルに余分な ".6CEdFe7C"が付いています。何故ですか?Python読み取り専用ファイルシステム読み込み用ファイルを開くときにS3とLambdaでエラーが発生する

[Errno 30] Read-only file system: u'/file.csv.6CEdFe7C': IOError 
Traceback (most recent call last): 
File "/var/task/lambda_function.py", line 75, in lambda_handler 
s3.download_file(bucket, key, filepath) 
File "/var/runtime/boto3/s3/inject.py", line 104, in download_file 
extra_args=ExtraArgs, callback=Callback) 
File "/var/runtime/boto3/s3/transfer.py", line 670, in download_file 
extra_args, callback) 
File "/var/runtime/boto3/s3/transfer.py", line 685, in _download_file 
self._get_object(bucket, key, filename, extra_args, callback) 
File "/var/runtime/boto3/s3/transfer.py", line 709, in _get_object 
extra_args, callback) 
File "/var/runtime/boto3/s3/transfer.py", line 723, in _do_get_object 
with self._osutil.open(filename, 'wb') as f: 
File "/var/runtime/boto3/s3/transfer.py", line 332, in open 
return open(filename, mode) 
IOError: [Errno 30] Read-only file system: u'/file.csv.6CEdFe7C' 

コード:

def lambda_handler(event, context): 

s3_response = {} 
counter = 0 
event_records = event.get("Records", []) 

s3_items = [] 
for event_record in event_records: 
    if "s3" in event_record: 
     bucket = event_record["s3"]["bucket"]["name"] 
     key = event_record["s3"]["object"]["key"] 
     filepath = '/' + key 
     print(bucket) 
     print(key) 
     print(filepath) 
     s3.download_file(bucket, key, filepath) 

上記の結果は次のとおりです。

mytestbucket 
file.csv 
/file.csv 
[Errno 30] Read-only file system: u'/file.csv.6CEdFe7C' 

キー/ファイルは "file.csvになり" であるならば、なぜs3.download_file方法はありません"file.csv.6CEdFe7C"をダウンロードしてください。関数がトリガされたとき、ファイルはfile.csv.xxxxxですが、75行目になるとファイルはfile.csvにリネームされます。

+0

ダンプは読み込みと同じではありません!したがって、一時フォルダ(またはRAM)上のファイルは、 'self._osutil.open(filename、 'wb')をf:'としてダンプする必要はなく、 'rb'etcしか許されません。処理する前にソースファイルを処理する必要があります。 – dsgdfg

答えて

36

AWSラムダでは、/tmpのみ書き込み可能と思われます。

ので、これは動作します:http://boto3.readthedocs.io/en/latest/guide/s3-example-download-file.html

filepath = '/tmp/' + key 
+1

1時間半後に、私はあなたの答えを見つける...彼らはなぜこれを明確にしないのですか?ありがとう! – john

+1

私は同じと思っていた。それは理由のためにグーグルでもハードでした!私が助けてくれるのはうれしいよ、仲間。 –

+0

@john AWSには大量の文書化に関する問題があります。 –

-2

アコードNEXの例を使用する方法を示し、最初のパラメータは、クラウド名で、二つ目は、ダウンロードするローカルパスです。一方で

enter image description here

amazaon docsは、 enter image description here

はこのように、我々はファイルを作成するための512メガバイトを持っていると言います。 ここで私のコードはラムダアウで、私にとっては魅力的です。

.download_file(Key=nombre_archivo,Filename='/tmp/{}'.format(nuevo_nombre)) 
+0

クール、それはあなたのコードです、どうですか?あなたの答えが質問を解決するなら、理由を説明してください**なぜ**それは働きます。そうでない場合は削除してください。 – sjaustirni

+0

修正しました。詳細を設定する必要がある場合はお知らせください –

+0

例でも、画像にコードを入れないでください。それをしている間、あなたの答えのタイプミスを修正してください。全体的には、答えは良くなった。 :-D – sjaustirni

関連する問題