es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Código Python en AWS Lambda para cargar un archivo Shapefile en PostGIS (RDS)

Soy nuevo en la implementación de SIG (Sistemas de Información Geográfica). Estoy tratando de desarrollar un código de AWS Lambda en Python para cargar un archivo shape de forma dinámica.

Desarrollé el código después de hacer algunas investigaciones y funciona perfectamente en mi entorno local.

Pero el mismo código me está dando problemas cuando intento ejecutarlo en AWS Lambda.

He agregado las bibliotecas (Lambda Layers) para ‘OSGEO/GDAL’ en AWS Lambda y lo he probado llamando a la importación y funciona correctamente.

A continuación se muestra el código:

import os
import subprocess
import boto3
import urllib.parse
from osgeo import gdal
from osgeo import ogr

s3 = boto3.client('s3')

def lambda_handler(event, context):  

bucket = event['Records'][0]['s3']['bucket']['name']
s3key = urllib.parse.unquote_plus(event['Records'][0]['s3']['object']['key'], encoding='utf-8')

# archivo shape de entrada
input_shp = ('s3://' + bucket + '/' + s3key)

# opciones de base de datos
db_schema = "SCHEMA=public"
overwrite_option = "OVERWRITE=YES"
geom_type = "MULTILINESTRING"
output_format = "PostgreSQL"

# cadena de conexión a la base de datos
db_connection = "PG:host=<nombre del="" host="" de="" rds=""> port=5432 user=<nombre de="" usuario="" de="" rds=""> dbname=postgres password=<contraseña de="" rds="">"

# llamar a ogr2ogr desde python
subprocess.call(["ogr2ogr", "-lco", db_schema, "-lco", overwrite_option, "-nlt", geom_type, "-f", output_format, db_connection, input_shp])

El mensaje de error es:

[ERROR] FileNotFoundError: [Errno 2] No such file or directory: 'ogr2ogr': 'ogr2ogr'

El mismo código funciona correctamente en mi entorno local con la única diferencia de que en lugar de usar S3, estoy proporcionando la ruta codificada en el código donde se encuentra el archivo shape en mi máquina local.

¿Alguna sugerencia?</contraseña>

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Parece que el error está relacionado con el hecho de que el comando ogr2ogr no se encuentra en el entorno de AWS Lambda. Una solución para esto podría ser empaquetar el ejecutable ogr2ogr con tu paquete de implementación de AWS Lambda.

    Para hacer esto, puedes seguir estos pasos:

    1. Descarga el ejecutable ogr2ogr para tu sistema operativo desde el sitio web de GDAL. Asegúrate de elegir la versión correcta para tu sistema operativo y arquitectura.
    2. Agrega el ejecutable ogr2ogr a tu paquete de implementación de AWS Lambda. Puedes hacer esto añadiéndolo a una carpeta en el directorio de tu proyecto y luego incluyendo esa carpeta en el paquete de implementación. Por ejemplo, podrías crear una carpeta llamada “ogr2ogr” en el directorio de tu proyecto y agregar el ejecutable a esa carpeta. Luego, incluirías la carpeta “ogr2ogr” en tu paquete de implementación.

    3. Modifica el código de tu función Lambda para usar el ejecutable ogr2ogr empaquetado en lugar de depender de que esté instalado en el entorno de Lambda. Puedes hacer esto actualizando la línea subprocess.call para usar la ruta completa al ejecutable ogr2ogr en tu carpeta empaquetada. Por ejemplo:

    subprocess.call(['/ruta/a/empaquetado/ogr2ogr', '-lco', db_schema, '-lco', overwrite_option, '-nlt', geom_type, '-f', output_format, db_connection, input_shp])
    

    Asegúrate de reemplazar “/ruta/a/empaquetado/ogr2ogr” con la ruta real a la carpeta que contiene el ejecutable en tu paquete de implementación.

    Con estos cambios, tu función Lambda debería poder usar el ejecutable ogr2ogr desde tu carpeta empaquetada y ya no debería encontrar el error “No such file or directory”.

Comments are closed.