Quiero cargar archivos en la instancia de EC2 usando la biblioteca pysftp (secuencia de comandos de Python). Así que he creado un pequeño script de Python que está usando la línea de abajo para conectarse
pysftp.Connection( host=Constants.MY_HOST_NAME, username=Constants.MY_EC2_INSTANCE_USERNAME, private_key="./mypemfilelocation.pem", ) some code here ..... pysftp.put(file_to_be_upload, ec2_remote_file_path)
Este script cargará archivos desde mi máquina Windows local a la instancia EC2 usando el archivo .pem y funciona correctamente.
Ahora quiero realizar esta acción usando AWS lambda con la funcionalidad API Gateway .
Así que cargué el script de Python en AWS lambda. Ahora no estoy seguro de cómo usar la biblioteca pysftp en AWS lambda, así que encontré una solución que agrega la capa de biblioteca pysftp en la capa lambda de AWS. lo hice con
pip3 install pysftp -t ./carpeta_biblioteca
Y hago zip de la carpeta anterior y lo agrego en AWS lambda Layer.
Pero aún tengo tantos errores como uno por uno: -
Ningún módulo llamado 'pysftp'
Ningún módulo llamado 'paramiko'
Símbolo indefinido: PyInt_FromLong
no se puede importar el nombre '_bcrypt' del módulo 'bcrypt' parcialmente inicializado (probablemente debido a una importación circular)
módulo cffi no encontrado
Acabo de desaparecer de los errores anteriores. No encontré la solución adecuada. ¿Cómo puedo usar la biblioteca pysftp en mi AWS lambda sin problemas?
Construí la capa pysftp
y la probé en mi lambda con python 3.8. Solo para ver la importación y la impresión básica:
import json import pysftp def lambda_handler(event, context): # TODO implement print(dir(pysftp)) return { 'statusCode': 200, 'body': json.dumps('Hello from Lambda!') }
Usé la siguiente herramienta acoplable para construir la capa pysftp
:
Entonces, lo que hice para pysftp
fue:
# create pysftp fresh python 3.8 environment python -m venv pysftp # activate it source pysftp/bin/activate cd pysftp # install pysftp in the environemnt pip3 install pysftp # generate requirements.txt pip freeze > requirements.txt # use docker to construct the layer docker run --rm -v `pwd`:/var/task:z lambci/lambda:build-python3.8 python3.8 -m pip --isolated install -t ./mylayer -r requirements.txt zip -r pysftp-layer.zip .
Y el resto es cargar el zip en s3, crear una nueva capa en la consola de AWS, configurar el tiempo de Compatible runtime
en python 3.8 y usarlo en mi función lambda de prueba.
También puede consultar aquí cómo usar esta herramienta de ventana acoplable (el comando de ventana acoplable que utilicé se basa en lo que hay en ese enlace).
Espero que esto ayude