Solución:
ACTUALIZAR:
Ahora parece que hay un nuevo tipo de función Lambda (experimental) en la CDK conocida como PythonFunction. Los documentos de Python para ello están aquí. Y esto incluye soporte para agregar un requirements.txt archivo que usa un contenedor docker para agregarlos a su función. Vea más detalles sobre eso aquí. Específicamente:
Si requirements.txt o Pipfile existe en la ruta de entrada, la construcción se encargará de instalar todos los módulos necesarios en un contenedor Docker compatible con Lambda de acuerdo con el tiempo de ejecución.
Respuesta original:
Así que este es el código asombroso que escribió mi gerente y que ahora usamos:
def create_dependencies_layer(self, project_name, function_name: str) -> aws_lambda.LayerVersion:
requirements_file = "lambda_dependencies/" + function_name + ".txt"
output_dir = ".lambda_dependencies/" + function_name
# Install requirements for layer in the output_dir
if not os.environ.get("SKIP_PIP"):
# Note: Pip will create the output dir if it does not exist
subprocess.check_call(
f"pip install -r {requirements_file} -t {output_dir}/python".split()
)
return aws_lambda.LayerVersion(
self,
project_name + "-" + function_name + "-dependencies",
code=aws_lambda.Code.from_asset(output_dir)
)
En realidad, es parte de la clase Stack como método (no dentro del en eso). La forma en que lo tenemos configurado aquí es que tenemos una carpeta llamada lambda_dependencies
que contiene un archivo de texto para cada función lambda que estamos implementando que solo tiene una lista de dependencias, como un requirements.txt
.
Y para utilizar este código, incluimos en la definición de la función lambda así:
get_data_lambda = aws_lambda.Function(
self,
.....
layers=[self.create_dependencies_layer(PROJECT_NAME, GET_DATA_LAMBDA_NAME)]
)
Debe instalar las dependencias de su lambda localmente antes de implementar la lambda a través de CDK. CDK no tiene idea de cómo instalar las dependencias y qué bibliotecas deben instalarse.
En su caso, debe instalar la dependencia peticiones y otras bibliotecas antes de ejecutar cdk deploy
.
Por ejemplo,
pip install requests --target ./asset/package
Hay un ejemplo de referencia.
También me encontré con este problema. Usé una solución como @Kane y @Jamie sugieren muy bien cuando estaba trabajando en mi máquina ubuntu. Sin embargo, tuve problemas cuando trabajaba en MacOS. Aparentemente, algunos (¿todos?) Los paquetes de Python no funcionan en lambda (linux env) si están instalados con pip en un sistema operativo diferente (ver la publicación de stackoverflow)
Mi solución fue ejecutar la instalación de pip dentro de un contenedor docker. Esto me permitió implementar cdk desde mi macbook y no tener problemas con mis paquetes de python en lambda.
suponga que tiene un directorio lambda_layers / python en su proyecto cdk que albergará sus paquetes de python para la capa lambda.
current_path = str(pathlib.Path(__file__).parent.absolute())
pip_install_command = ("docker run --rm --entrypoint /bin/bash -v "
+ current_path
+ "/lambda_layers:/lambda_layers python:3.8 -c "
+ "'pip3 install Pillow==8.1.0 -t /lambda_layers/python'")
subprocess.run(pip_install_command, shell=True)
lambda_layer = aws_lambda.LayerVersion(
self,
"PIL-layer",
compatible_runtimes=[aws_lambda.Runtime.PYTHON_3_8],
code=aws_lambda.Code.asset("lambda_layers"))