Boto3: Simplifique la implementación de AWS Lambda

boto3

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:

Recent Post