web-dev-qa-db-ja.com

Python読み取り専用ファイルシステムで、読み取り用にファイルを開くときにS3とLambdaでエラーが発生する

File.csvをS3バケットにドロップすると、ラムダ関数から次のエラーが表示されます。ファイルは大きくなく、読み取りのためにファイルを開く前に60秒のスリープを追加しましたが、何らかの理由でファイルに追加の「.6CEdFe7C」が追加されています。何故ですか?

[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に名前が変更されますか?

31
user1530318

AWS Lambdaでは/tmpのみが書き込み可能と思われます。

したがって、これは動作します:

filepath = '/tmp/' + key
101
joonas.fi

http://boto3.readthedocs.io/en/latest/guide/s3-example-download-file.html

この例は、クラウド名に最初のパラメーターを使用し、ダウンロードするローカルパスに2番目のパラメーターを使用する方法を示しています。

enter image description here

一方、 amazaon docs は、 enter image description here

したがって、ファイルを作成するための512 MBがあります。ラムダawsでの私のコードは次のとおりです。

.download_file(Key=nombre_archivo,Filename='/tmp/{}'.format(nuevo_nombre))
5
Te ENe Te

ラムダdirectly as a Zip fileのコードをアップロードしたときに気づいたのは、/tmpフォルダーにしか書き込むことができなかったが、S3からコードをアップロードしたとき、project root folderに書き込むことができたも。

0
Pavlo Kovalchuk