Simplifique la implementación de AWS Lambda con Python, Boto3
En este artículo, profundizaremos en el proceso de implementación de una función de Python en AWS lambda utilizando la biblioteca Boto3.
AWS Lambda es una plataforma informática sin servidor que permite a los desarrolladores ejecutar código sin la molestia de aprovisionar o administrar servidores.
Primero, escribiremos la función de Python que queremos implementar en Lambda y la guardaremos como lambda_func.py
.
def response(event, context): response = { "statusCode": 200, "body": None } if event["message"] == "ping": response["body"] = "pong" else: response["body"] = "Unknown message" return response
A continuación, escribiremos upload_lambda.py
, un script que cargará nuestra función en AWS Lambda.
Comenzamos importando las bibliotecas requeridas: loguru
para el registro, boto3
como el SDK de Amazon Web Services para Python, zipfile
para trabajar con archivos comprimidos ZIP y argparse
para analizar los argumentos de la línea de comandos en Python.
from loguru import logger import boto3 import zipfile import argparse
Luego definimos los argumentos que queremos pasar a la secuencia de comandos, como el nombre de la función, el nombre del controlador y el rol de IAM que asumirá la función.
parser = argparse.ArgumentParser() parser.add_argument('--function_name', type=str, required=True) parser.add_argument('--handler_name', type=str, required=True) parser.add_argument('--role', type=str, required=True) args = parser.parse_args() function_name = args.function_name handler_name = args.handler_name role = args.role
Aquí, function_name
es el nombre de la función que queremos implementar en AWS Lambda. En nuestro caso es lambda_func
. handler_name
es el nombre de la función del controlador en nuestro código de Python. handler_name
es la response
en nuestro lambda_func
. role
es el rol de IAM que asumirá la función. Después de eso, usamos el método parser.parse_args()
para analizar estos argumentos y asignarlos a las variables relevantes.
Luego creamos un cliente boto3 para AWS Lambda con la siguiente línea de código.
lambda_client = boto3.client('lambda')
Ahora describiremos las funciones que hemos creado para ayudarnos a cargar lambda_func.py
en Lambda.
La función create_zip
toma un function_name
como entrada y crea un archivo zip de un archivo de Python con el mismo nombre.
def create_zip(function_name): with zipfile.ZipFile(f'{function_name}.zip', 'w') as zf: zf.write(f'{function_name}.py')
La función lambda_function_exist
comprueba si la función ya existe en AWS Lambda. Si existe, devuelve True. De lo contrario, devuelve False.
def lambda_function_exist(function_name): try: lambda_client.get_function(FunctionName=function_name) return True except lambda_client.exceptions.ResourceNotFoundException: return False
La función update_lambda
actualiza una función existente en AWS Lambda con el código más reciente.
def update_lambda(function_name): response = lambda_client.update_function_code( FunctionName=function_name, ZipFile=open(f'{function_name}.zip', 'rb').read() )
La función create_lambda
crea una nueva función en AWS Lambda.
def create_lambda(function_name): response = lambda_client.create_function( FunctionName=function_name, Runtime='python3.8', Role=role, Handler=f'{function_name}.{handler_name}', Code={ 'ZipFile': open(f'{function_name}.zip', 'rb').read() } )
Finalmente, si el script se ejecuta como el programa principal, llama a la función create_zip
, verifica si la función ya existe en AWS Lambda mediante la función lambda_function_exist
y actualiza la función mediante la función update_lambda
o crea una función nueva mediante create_lambda
.
if __name__ == '__main__': create_zip(function_name) if lambda_function_exist(function_name): logger.info(f'Updating function {function_name}') update_lambda(function_name) else: logger.info(f'Creating function {function_name}') create_lambda(function_name)
Con estas funciones implementadas, la implementación de una función de Python en AWS Lambda se simplifica con un solo comando. Automatizar el proceso de implementación de actualizaciones de código se convierte en una brisa. Puede usar este comando para crear una función lambda nueva o actualizar una existente.
python upload_lambda.py \ --function_name lambda_func \ --handler_name response \ --role arn:aws:iam::<account_id>:role/<role_name>
Gracias por llegar hasta aquí, si encuentras esto útil no olvides dejar un👍🏼y suscribirse para recibir más contenido.
Si le interesa, puede echar un vistazo a algunos de los otros artículos que he escrito recientemente sobre Node.js y AWS Lambda: