Mi función de AWS Lambda de Python (Boto3) devuelve los errores «unknown service», «parameter validation failed» u «object has no attribute».
Descripción corta
Una función de Lambda de Python Boto3 que no utilice la versión más reciente de Boto3 podría devolver los siguientes errores:
- unknown service
- parameter validation failed
- object has no attribute
Estos errores se producen cuando la función llama a un servicio de AWS o a una API de AWS que requiere la versión más reciente de Boto3.
Para resolver este problema, crea una capa de Lambda que utilice la versión más reciente de Boto3. Puedse crear una capa de Lambda manualmente o con Docker. Se recomienda actualizar la capa de Lambda a través de Docker para asegurarte de que los binarios sean correctos para el sistema operativo de Lambda.
Importante: Los siguientes procedimientos asumen que tienes la versión más reciente de Botocore. Si no tienes la versión más reciente de Botocore, debes actualizar Botocore antes de poder actualizar a la versión más reciente de Boto3. Para obtener más información, consulta botocore en el sitio web de GitHub.
Resolución
Nota: Si se muestran errores al poner en marcha comandos de Interfaz de la línea de comandos de AWS (AWS CLI), consulta Solución de problemas de AWS CLI. Además, asegúrate de utilizar la versión más reciente de AWS CLI.
Se recomienda crear una capa de Lambda en el mismo sistema operativo en el que se basa la versión ejecutable de Lambda. Por ejemplo, las versiones 3.8 y 3.9 de Python se basan en una imagen de máquina de Amazon (AMI) de Amazon Linux 2. Sin embargo, Python 3.7 y Python 3.6 se basan en la AMI de Amazon Linux.
Requisitos previos:
- Instala el paquete pip3 para Python 3. O bien, si tienes una versión anterior de pip, actualízala. Para obtener más información, consulta Installation (Instalación) en el sitio web de pip.
- Instala o actualiza AWS CLI con pip3.
Nota: La versión más reciente de la AWS CLI incluye el modelo de API Lambda Layers.
Usa Docker para crear o actualizar una capa de Lambda que utilice la versión más reciente de Boto3
Requisito previo: Instala Docker en tu sistema. Para descargar la versión más reciente de Docker, consulta Installing Docker (Instalación de Docker).
Creación y aplicación de la capa
Sigue estos pasos:
-
Navega hasta el directorio en el que desees crear el archivo de la capa.
-
Usa el siguiente comando en la CLI del sistema:
docker run --entrypoint "" -v "$PWD":/var/task "public.ecr.aws/lambda/python:3.9.2023.03.21.20" /bin/sh -c "mkdir -p /tmp/python && pip3 install boto3 -t /tmp/python && cd /tmp && yum install -y zip && zip -r /var/task/boto3-mylayer.zip ."
Nota: Sustituye public.ecr.aws/lambda/python:3.9.2023.03.21.20 por la imagen base de tu versión de Python. Sustituye boto3-mylayer por un nombre personalizado para tu paquete.
Cuando el comando se procese correctamente, verás un archivo con el nombre del paquete en el directorio actual, como boto3-mylayer.zip.
-
Para crear o actualizar la capa de Lambda, usa el siguiente comando:
aws lambda publish-layer-version --layer-name boto3-mylayer --zip-file fileb://boto3-mylayer.zip --compatible-runtimes python3.9 --region REGION_NAME
Nota: Sustituya boto3-mylayer por el nombre de su paquete. Sustituya REGION_NAME por su región de AWS. Además, incluya los tiempos de ejecución compatibles que ha especificado anteriormente.
Creación de forma manual de una capa de Lambda que utiliza la versión más reciente de Boto3
Los siguientes comandos de AWS CLI funcionan para los sistemas operativos Linux, Unix y macOS.
Nota: En cada comando, asegúrate de sustituir boto3-mylayer por el nombre que prefieras para la carpeta lib y la capa de Lambda.
Sigue estos pasos:
-
Crea una carpeta lib:
LIB_DIR=boto3-mylayer/pythonmkdir
-
Instala la biblioteca en LIB_DIR.
pip3 install boto3 -t $LIB_DIR
-
Para comprimir todas las dependencias en /tmp/boto3-mylayer.zip, usa el siguiente comando.
cd boto3-mylayer
zip -r /tmp/boto3-mylayer.zip
-
Para publicar la capa, usa el siguiente comando.
aws lambda publish-layer-version --layer-name boto3-mylayer --zip-file fileb:///tmp/boto3-mylayer.zip
El comando devuelve el nombre de recurso de Amazon (ARN) de la nueva capa.
Resultado de ejemplo:
arn:aws:lambda:region:$ACC_ID:layer:boto3-mylayer:1
Adición de la nueva capa a la configuración de tu función de Lambda
Para añadir la nueva capa a la configuración de la función de Lambda, usa el siguiente comando:
aws lambda update-function-configuration --function-name MY_FUNCTION --layers LAYER_ARN
Nota: Sustituye MY_FUNCTION por el nombre de tu función. Sustituya LAYER_ARN por el ARN de su capa.
Todos los servicios y argumentos de AWS están ahora disponibles para tu función de Lambda.
Para confirmar la versión de Boto3 y Botocore, usa print(boto3.__version__) y print(botocore.__version__) en el código de tu función
Información relacionada
Creación de funciones de Lambda con Python
Uso de archivos .zip para funciones de Lambda en Python