Blog de Amazon Web Services (AWS)
SAP CAR en AWS – Un enfoque serverless para la ingesta de datos de POS
Por César Páez Román, Senior SAP Migrations SA, Latam
La industria del retail se enfrenta cada vez más a escenarios desafiantes para mantener una buena y agradable experiencia de cliente. El Customer Activity Repository (CAR) de SAP busca resolver este problema recopilando, limpiando y centralizando todos los datos relacionados con el cliente presente en ambientes omnicanales en tiempo real y poniéndolos a disposición de aplicaciones de terceros.
Sin embargo, cargar datos y obtener información útil para la gestión operativa del negocio es una tarea compleja.
En este blog mostraremos un ejemplo de cómo integrar SAP CAR con la plataforma AWS y así beneficiarnos de la profundidad y amplitud de nuestros servicios.
A continuación, procederemos a configurar un escenario para consumir datos de SAP CAR con AWS Lambda, computación serverless de AWS, lo que le permite escalar a millones de transacciones, sin preocuparse por el aprovisionamiento de infraestructura.
Descripción general de la solución
El siguiente es el diagrama de arquitectura definido para la solución. Usamos AWS Lambda y una capa Lambda que contiene el controlador PyRFC para establecer la conectividad con el AS ABAP en el que está instalado SAP CAR.
Adicionalmente utilizaremos IoT Device Simulator para generar datos de prueba, creando un punto de venta virtual. La información generada es recibida por un tópico MQTT de AWS IoT Core, que activará nuestra función Lambda cada vez que llegue un nuevo mensaje.
La función lambda se encargará de conectarse con SAP CAR y realizar la ingesta mediante la BAPI “/POSDW/CREATE_TRANSACTIONS_EXT”.
Prerequisitos
Para este tutorial, se deben cumplir con los siguientes requisitos:
- Una AWS account
- IoT Device Simulator desplegada en tu cuenta de AWS.
- Un usuario de SAP CAR con las autorizaciones correspondientes.
Tutorial
En este blog, los guiaremos a través de la configuración de IoT Simulator y funciones Lambda para publicar transacciones en SAP CAR.
- Configure el IoT Simulator device con el tipo de dispositivo POS.
- Cree una capa Lambda con PyRFC y una función Lambda.
- Configure reglas de IoT Core para enviar mensajes a la función lambda.
1.- Configure el simulador de IoT Device:
- Inicie sesión en la consola de IoT Device Simulator y haga clic en tipo de dispositivo.
- Clic en agregar tipo de dispositivo.
- Llene los campos requeridos de acuerdo a la siguiente imagen
- Agregue los siguientes atributos y haga clic en Guardar.
Para los atributos Tienda y Fecha, utilice los siguientes valores predeterminados: R100 y 20200602 (o cualquier fecha con formato AAAAMMDD).
- Repita los pasos 1 a 4 cambiando el Nombre y el valor predeterminado de la Tienda. Para este ejemplo, vamos a usar tiendas (R100, R200, R250 y R300).
- Después de crear la cantidad de dispositivos que desea, vaya a la sección Widgets en la barra de menú de la izquierda y luego Agregar Widget.
- En el Tipo de dispositivo, seleccione uno de los creados en los pasos anteriores y la cantidad de widgets que desea crear:
8. Verá el nuevo dispositivo creado. Ahora presione iniciar para ejecutar la simulación:
La simulación comenzará a enviar datos al tópico configurado:
2.- Crear capa Lambda con función PyRFC y también la función Lambda.
- Descargue SAP NW RFC SDK 7.50 del SAP Marketplace (versión para LINUX ON X86_64 64 BIT). Descomprima en una ruta local, se usará en los siguientes pasos.
- En este caso utilizaremos un entorno AWS Cloud9 basado en Amazon Linux 2 para generar la Capa Lambda. Puede encontrar una guía paso a paso sobre cómo ejecutar entornos Cloud9 en el siguiente enlace: https://docs.thinkwithwp.com/cloud9/latest/user-guide/create-environment-main.html
- Dentro del entorno de Cloud9, seleccione Window->Nuevo termianl y ejecute los siguientes comandos shell para crear el entorno de Python e instalar las dependencias requeridas:
sudo yum install -y amazon-linux-extras
sudo amazon-linux-extras enable python3.8
sudo yum install python3.8 -y
virtualenv -p /usr/bin/python3.8 PyRFC_Layer
source PyRFC_Layer/bin/activate
cd PyRFC_Layer
mkdir python
cd python
pip3 install https://github.com/SAP/PyRFC/releases/download/2.1.0/pynwrfc-2.1.0-cp38-cp38-linux_x86_64.whl -t .
cp /usr/lib64/libuuid.so.1 /home/ec2-user/environment/PyRFC_Layer/lib
4. Copie todos los archivos de la ruta LIB del paso 1 a PyrFC_Layer/Lib/ en Cloud9 (drag and drop):
- Nuevamente, abra la consola como lo hicimos en el paso 3 y ejecute los siguientes comandos, reemplazándolos con el bucket S3 donde se almacenará la capa Lambda.
cd /home/ec2-user/environment/PyRFC_Layer zip -r9 pyrfc_layer.zip python lib aws s3 cp pyrfc_layer.zip s3://<bucket>/pyrfc_layer.zi
- En la consola de AWS, abra el servicio Lambda y seleccione Recursos adicionales->Capas->Crear capa.
- Ingrese el nombre y la ruta del bucket S3 indicados anteriormente (modificando) y eligiendo Runtime compatible con Python 3.8:
8. Dentro de Lambda, cree la función que tendrá la lógica para conectarse con SAP CAR (tiempo de ejecución Python 3.8):
9. Seleccione la VPC y la subred donde se encuentra la instancia de SAP CAR, también seleccione un grupo de seguridad con acceso a los puertos 33 (número de sistema ABAP):
10. Después de crear la función, seleccione la Capa creada en los pasos anteriores:
11. Copie y pegue el siguiente código:
import logging import json from pyrfc import Connection USERID = <SAP User> PASSWD = <SAP Password> LANG = 'EN' SAPHOST= <SAP CAR IP Address> SAPINSTANCENUM= <SAP CAR Instance Number> SAPCLIENT= <SAP CAR Client Number> logger = logging.getLogger() logger.setLevel(logging.DEBUG) def lambda_handler(event, context): print(event) STORE=str(event['STORE']) WORKSTATIONID =str(event['WORKSTATION_ID']) DATE=str(event['Date']) Department=str(event['Department']) TRANSNUMBER=str(event['Trans_Number']) RETAIL_Number=str(event['Retail_Number']) ITEM_ID=str(event['Item_ID']) Quantity = str(event['Quantity']) Amount = str(event['Amount']) con = Connection(ashost=SAPHOST, sysnr=SAPINSTANCENUM, client=SAPCLIENT, user=USERID, passwd=PASSWD) ITEM = [{ "RETAILNUMBER": RETAIL_Number, "ITEMID": ITEM_ID,"RETAILQUANTITY":Quantity,"SALESAMOUNT":Amount }] IMPORTSTRUCT = [{ "RETAILSTOREID": STORE, "BUSINESSDAYDATE": DATE, "TRANSNUMBER":TRANSNUMBER, "WORKSTATIONID": WORKSTATIONID, "DEPARTMENT":Department, "RETAILLINEITEM":ITEM }] BapiCAR = con.call('/POSDW/CREATE_TRANSACTIONS_EXT', IT_TRANSACTION=IMPORTSTRUCT) print (BapiCAR) return 0
12. Haga clic en Implementar y ejecute un evento de prueba con los siguientes datos:
{ "WORKSTATION_ID": "zs9x0u9uF", "STORE": "R100", "Date": "20210408", "Department": 1001, "Trans_Number": 4075247, "Retail_Number": 193480, "Item_ID": 150580, "Quantity": 7, "Amount": 889, "_id_": "zs9x0u9uF" }
3.- Configure regla IoT Core para enviar mensajes a la función Lambda.
- En la consola IoT core service, clic en Act->Reglas y después clic en crear.
- Dale a tu regla un nombre y una descripción.
- En la consulta de la regla, ingrese el siguiente quey SQL:
SELECT * FROM '/sapcar/posdata'
4. Haga clic en «Agregar acción» y seleccione «Enviar un mensaje a una función Lambda» y seleccione la función Lambda creada anteriormente.
Limpieza de los servicios
Para evitar incurrir en cargos futuros, elimine los recursos creados.
Conclusión
En este blog mostramos una forma de integrar los servicios nativos de AWS con SAP para la ingesta de datos en SAP CAR. La misma lógica se puede utilizar para integrar cualquier tipo de servicio con SAP Business Suite de manera simple, escalable y rentable.
A continuación, se muestra un video que demuestra el escenario implementado en los pasos anteriores:
Acerca del autor
César Páez Román is an AWS Senior SAP Migrations SA -Latam based in Chile, with vast experience implementing SAP, S/4HANA Conversion and SAP System Upgrade, OS/DB Migrations, HANA and AWS projects as Architect and Consultant.