Error "Read-only file system" in AWS Lambda when downloading a file from S3
Solution 1
Only /tmp
seems to be writable in AWS Lambda.
Therefore this would work:
filepath = '/tmp/' + key
References:
- https://aws.amazon.com/blogs/compute/choosing-between-aws-lambda-data-storage-options-in-web-apps
- https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html
Solution 2
According to http://boto3.readthedocs.io/en/latest/guide/s3-example-download-file.html
The example shows how to use the first parameter for the cloud name and the second parameter for the local path to be downloaded.
in other hand, the amazaon docs, says
Thus, we have 512 MB for create files. Here is my code for me in lambda aws, for me works like charm.
.download_file(Key=nombre_archivo,Filename='/tmp/{}'.format(nuevo_nombre))
Solution 3
I noticed when I uploaded a code for lambda directly as a zip file
I was able to write only to /tmp
folder, but when uploaded code from S3
I was able to write to the project root folder
too.
Related videos on Youtube
user1530318
Updated on April 27, 2022Comments
-
user1530318 about 2 years
I'm seeing the below error from my lambda function when I drop a file.csv into an S3 bucket. The file is not large and I even added a 60 second sleep prior to opening the file for reading, but for some reason the file has the extra ".6CEdFe7C" appended to it. Why is that?
[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'
Code:
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)
The result of the above is:
mytestbucket file.csv /file.csv [Errno 30] Read-only file system: u'/file.csv.6CEdFe7C'
If the key/file is "file.csv", then why does the s3.download_file method try to download "file.csv.6CEdFe7C"? I'm guessing when the function is triggered, the file is file.csv.xxxxx but by the time it gets to line 75, the file is renamed to file.csv?
-
dsgdfg over 7 yearsDump not equal to read ! So your file on temp folder (or in ram) need dump not
self._osutil.open(filename, 'wb') as f:
, only allowedrb
etc. So need handle source file before processing. -
Nikolai K. almost 6 years@user1530318, would you mind to mark the top answer as correct? It seems all right.
-
-
ProgrammingLlama about 7 yearsAn hour and a half later, I find your answer... Why do they not make this clear? Thanks!
-
joonas.fi about 7 yearsI was wondering the same. It was even hard Googling for the reason! Glad I could help, mate.
-
sjaustirni over 6 yearscool, that's your code, what about it? If your answer solves the question, please add an explanation why it works. If it doesn't, please delete it.
-
Egalicia over 6 yearsCorrected, let me know if I have to set more information
-
sjaustirni over 6 yearsEven if it is just an example, please, don't put code in an image. While doing that, please fix the typos in your answer. Overall however, the answer got better. :-D
-
Ivan Aracki about 6 years@john AWS has that problem with massive documentation!
-
cellepo about 5 yearsIn my similar situation (writing
File
to user.dir:/<filename>
), but with JAVA & a 3.8MB .zip Object, this warning printed right before my ["Read-only"]SDKClientException
printed (but it was happily resolved after using/tmp/
Solution instead! Probably because theS3ObjectInputStream
died as soon as it couldn't get the/<filename>
prior):WARNING: Not all bytes were read from the S3ObjectInputStream, aborting HTTP connection. This is likely an error and may result in sub-optimal behavior. Request only the bytes you need via a ranged GET or drain the input stream after use.
-
annedroiid over 4 yearsDo you have an example?
-
Himanshu dua over 4 yearsTried the same but givig the error OSError: [Errno 30] Read-only file system: 'tmp/token.json'\n"
-
Himanshu dua over 4 yearsThanks will validate '/tmp'
-
Andrey over 3 yearsThis is odd, but writing without '/tmp' worked for me for months. Until today, when it broke. Thanks
-
Dubraven almost 2 yearsHey, do you know what happens to a file/folder created in /tmp/ after the function ends? Is it permanently deleted?
-
joonas.fi almost 2 years@Dubraven no files whatsoever in Lambda are expected to persist. I'm not sure if it's defined how often they're deleted, but you should design with the expectation that after your function call is done, your files are deleted.