Je vois l'erreur ci-dessous de ma fonction lambda lorsque je dépose un fichier.csv dans un compartiment S3. Le fichier n’est pas volumineux et j’ai même ajouté une pause de 60 secondes avant de l’ouvrir en lecture, mais pour une raison quelconque, le fichier contient l’extrait ".6CEdFe7C". Pourquoi donc?
[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)
Le résultat de ce qui précède est:
mytestbucket
file.csv
/file.csv
[Errno 30] Read-only file system: u'/file.csv.6CEdFe7C'
Si la clé/le fichier est "fichier.csv", pourquoi la méthode s3.download_file essaie-t-elle de télécharger "fichier.csv.6CEdFe7C"? Je devine quand la fonction est déclenchée, le fichier est file.csv.xxxxx mais au moment où il arrive à la ligne 75, le fichier est renommé en file.csv?
Seul /tmp
semble être accessible en écriture dans AWS Lambda.
Par conséquent, cela fonctionnerait:
filepath = '/tmp/' + key
Selon http://boto3.readthedocs.io/fr/latest/guide/s3-example-download-file.html
L'exemple montre comment utiliser le premier paramètre pour le nom du nuage et le second paramètre pour le chemin local à télécharger.
d'autre part, le amazaon docs , dit
Ainsi, nous avons 512 Mo pour créer des fichiers . Voici mon code pour moi dans lambda aws, pour moi cela fonctionne comme un charme.
.download_file(Key=nombre_archivo,Filename='/tmp/{}'.format(nuevo_nombre))
J'ai remarqué que lorsque j'ai chargé un code pour lambda directly as a Zip file
, je pouvais écrire uniquement dans le dossier /tmp
, mais lorsque j'ai téléchargé le code depuis S3
, j'ai également pu écrire dans le project root folder
.