Enviar datos a AWS MSK Topic desde AWS Lambda
Una guía paso a paso para crear una función lambda y la capa Lambda de dependencia requerida en AWS para instalar el paquete necesario para conectarse a AWS MSK Topic (tema de Kafka)
Esta guía asume un conocimiento práctico de la funcionalidad y la ventana acoplable de AWS Lambda.
Trabajando con Docker
Descargue la ventana acoplable en “https://www.docker.com/products/docker-desktop” e instálela con las especificaciones predeterminadas.
Cuando se complete la instalación, abra Docker para iniciar Docker en segundo plano, haga clic en Mostrar iconos ocultos en la barra de tareas de Windows para verificar que Docker se está ejecutando.
1. Abra el editor de línea de comandos (Powershell o Windows CMD) y ejecute para descargar una imagen de Amazon Linux.
Estamos utilizando Amazon Linux para crear paquetes debido a la incompatibilidad entre las diferentes versiones compiladas por máquina y la versión de AmazonLinux, lo que puede generar el siguiente error:
no se puede importar el nombre ‘WinDLL’ de ‘ctypes’ (/var/lang/lib/python3.7/ctypes/__init__.py)”.
docker pull amazonlinux
2. Ahora crea un nuevo contenedor a partir de la imagen y la línea de comando cambia a un comando bash
docker run -it amazonlinux
3. Ejecute el siguiente comando para instalar python, utilidades zip, pip y agregar python a la ruta del sistema
yum install python37 yum install zip unzip curl -O https://bootstrap.pypa.io/get-pip.py python3 get-pip.py --user export PATH=root/.local/bin:$PATH
4. Cree un directorio de trabajo en el contenedor Docker
mkdir python
5. Instale la biblioteca de python necesaria en el nuevo directorio
pip3 install confluent_kafka -t python
6. Comprima el contenido de la carpeta de Python
zip -r /python/python.zip /python
7. Salga de bash escribiendo exit
8. Obtenga el nombre del contenedor del que acabamos de salir
docker container ls --all
9. vamos a copiar el archivo comprimido del contenedor a un directorio accesible por Windows. En este ejemplo, estoy usando una carpeta de Windows llamada tmp. Cambie el nombre del contenedor en consecuencia
docker cp container-name:/python/python.zip d:\tmp
10.python.zip ahora está disponible en nuestro directorio tmp de Windows en este caso (unidad d)
Creación y acceso a la capa Lambda en la consola de AWS
1. Inicie sesión en la consola de cuentas de AWS y busque el servicio Lambda
2. Haga clic en capas y en el lado izquierdo y luego haga clic en crear capa
3. Dé el nombre de una capa, cargue el zip creado en el paso anterior, seleccione la versión de python en tiempo de ejecución muy importante y haga clic en crear.
4. Las capas deben crearse correctamente
Creación de un rol de IAM para la función Lambda
Se necesita el rol de IAM porque el MSK es un servicio administrado alojado dentro de la VPC, y necesitamos que otorgue permiso a la función lambda para acceder a la VPC mediante la cual puede conectarse al clúster de MSK.
1. Busque el rol en la barra de búsqueda en la consola de AWS y haga clic en Roles y luego haga clic en Create Roles
2. Haga clic en siguiente después de ingresar los detalles
3. Agregue la búsqueda de permisos (AmazonVPCFullAccess) y (AmazonMSKFullAccess) y haga clic en siguiente. Para este ejemplo, proporcionamos acceso completo, pero no se recomienda. AWS quiere que el usuario utilice el privilegio de acceso mínimo.
4. Proporcione el nombre del rol, revise la configuración y haga clic en siguiente
Creación y acceso a la función Lambda en la consola de AWS
1. Haga clic en Función en el lado izquierdo en la Consola AWS lambda y haga clic en crear función
2. Ingrese el Nombre de la función y seleccione Runtime Python3.7 (la misma versión que se usó en la creación de la capa). Haga clic en cambiar el rol de ejecución predeterminado y seleccione el rol creado en los pasos anteriores. Luego haga clic en crear función
3. Haga clic en Capas
4. Haga clic en Agregar capa
5. Seleccione la capa personalizada y seleccione la capa que se creó en el paso anterior
6. Actualizar el Código Lambda
import json import time from time import time from confluent_kafka import Producer KAFKA_BROKER = 'your-kafka-broker-endpoint-1.amazonaws.com:9092' KAFKA_TOPIC = 'your_topic_name' producer = Producer({ 'bootstrap.servers': KAFKA_BROKER, 'socket.timeout.ms': 100, 'api.version.request': 'false', 'broker.version.fallback': '0.9.0', 'message.max.bytes': 1000000000 }) def lambda_handler(event, context): print("event = ",event) start_time = int(time() * 1000) #This is test data, you can get data from the event data = {"name": "xyz", "email": "xyz@"} send_msg_async(data) end_time = int(time() * 1000) time_taken = (end_time - start_time) / 1000 print("Time taken to complete = %s seconds" % (time_taken)) def delivery_report(err, msg): if err is not None: print('Message delivery failed: {}'.format(err)) else: print('Message delivered to {} [{}]'.format( msg.topic(), msg.partition())) def send_msg_async(msg): print("Sending message") try: msg_json_str = str({"data": json.dumps(msg)}) producer.produce( KAFKA_TOPIC, msg_json_str, callback=lambda err, original_msg=msg_json_str: delivery_report(err, original_msg ), ) producer.flush() except Exception as ex: print("Error : ", ex)
7. Haga clic en deploy (implementar)
8. Haga clic en configuración y seleccione VPC. Es necesario para conectarse a AWS MSK. Hay dos opciones: puede crear una función lambda dentro de la misma VPC donde se aloja MSK o usar la interconexión de VPC para conectar dos VPC.
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 AWS y Laravel: