Realice reescrituras seguras de bases de datos con Amazon QuickSight

Realice reescrituras seguras de bases de datos con Amazon QuickSight

Nodo de origen: 2641420

Amazon QuickSight es una solución de inteligencia empresarial (BI) escalable, sin servidor y basada en aprendizaje automático (ML) que facilita la conexión a sus datos, la creación de paneles interactivos, el acceso a información basada en ML y el intercambio de imágenes y paneles con decenas de miles de personas. de usuarios internos y externos, ya sea dentro del propio QuickSight o integrado en cualquier aplicación.

Una reescritura es la capacidad de actualizar un data mart, un almacén de datos o cualquier otro backend de base de datos desde los paneles de BI y analizar los datos actualizados casi en tiempo real dentro del propio panel. En esta publicación, mostramos cómo realizar reescrituras seguras de bases de datos con QuickSight.

Resumen del caso de uso

Para demostrar cómo habilitar una capacidad de reescritura con QuickSight, consideremos una empresa ficticia, AnyCompany Inc. AnyCompany es una empresa de servicios profesionales que se especializa en brindar soluciones de fuerza laboral a sus clientes. AnyCompany determinó que ejecutar cargas de trabajo en la nube para respaldar sus crecientes necesidades comerciales globales es una ventaja competitiva y utiliza la nube para alojar todas sus cargas de trabajo. AnyCompany decidió mejorar la forma en que sus sucursales brindan cotizaciones a sus clientes. Actualmente, las sucursales generan cotizaciones de clientes manualmente y, como primer paso en este viaje de innovación, AnyCompany busca desarrollar una solución empresarial para la generación de cotizaciones de clientes con la capacidad de aplicar dinámicamente datos de precios locales en el momento de la generación de cotizaciones.

AnyCompany utiliza actualmente Desplazamiento al rojo de Amazon como su plataforma de almacenamiento de datos empresariales y QuickSight como su solución de BI.

La creación de una nueva solución conlleva los siguientes desafíos:

  • AnyCompany quiere una solución que sea fácil de construir y mantener, y no quiere invertir en la creación de una interfaz de usuario independiente.
  • AnyCompany desea ampliar las capacidades de su panel QuickSight BI existente para permitir también la generación y aceptación de cotizaciones. Esto simplificará la implementación de funciones porque sus empleados ya usan los paneles de QuickSight y disfrutan de la interfaz fácil de usar que proporciona QuickSight.
  • AnyCompany desea almacenar el historial de negociación de cotizaciones que incluye cotizaciones generadas, revisadas y aceptadas.
  • AnyCompany quiere crear un nuevo panel con datos del historial de cotizaciones para análisis e información comercial.

Esta publicación describe los pasos para habilitar la funcionalidad de reescritura en Amazon Redshift desde QuickSight. Tenga en cuenta que las herramientas de BI tradicionales son de solo lectura y tienen pocas o ninguna opción para actualizar los datos de origen.

Resumen de la solución

Esta solución utiliza los siguientes servicios de AWS:

Aunque esta solución utiliza Amazon Redshift como almacén de datos, se puede implementar un enfoque similar con cualquier base de datos que admita la creación de funciones definidas por el usuario (UDF) que puedan invocar Lambda.

La siguiente figura muestra el flujo de trabajo para realizar reescrituras desde QuickSight.

El primer paso de la solución es generar un hash o un resumen de mensaje del conjunto de atributos en Amazon Redshift invocando una función Lambda. Este paso evita la manipulación de la solicitud. Para generar un hash, Amazon Redshift invoca un escalar Lambda UDF. El mecanismo hash utilizado aquí es el popular BLAKE2 función (disponible en la biblioteca de Python hashlib). Para asegurar aún más el hash, se utiliza hash con clave, que es una alternativa más rápida y sencilla a código de autenticación de mensajes basado en hash (HMAC). Secrets Manager genera y almacena esta clave y solo debe ser accesible para las aplicaciones permitidas. Una vez generado el hash seguro, se devuelve a Amazon Redshift y se combina en una vista de Amazon Redshift.

La escritura de la cotización generada en Amazon Redshift se realiza mediante la función Lambda de reescritura y se crea un punto final API REST de API Gateway para proteger y pasar solicitudes a la función de reescritura. La función de reescritura realiza las siguientes acciones:

  1. Genere el hash en función de los parámetros de entrada de la API recibidos de QuickSight.
  2. Firme el hash aplicando la clave de Secrets Manager.
  3. Compare el hash generado con el hash recibido de los parámetros de entrada utilizando el método compare_digest disponible en el HMAC módulo.
  4. Tras la validación exitosa, escriba el registro en la tabla de envío de cotizaciones en Amazon Redshift.

La siguiente sección proporciona pasos detallados con cargas útiles de muestra y fragmentos de código.

Generar el hash

El hash se genera utilizando una UDF Lambda en Amazon Redshift. Además, se utiliza una clave de Secrets Manager para firmar el hash. Para crear el hash, complete los siguientes pasos:

  1. Cree la clave de Secrets Manager desde el Interfaz de línea de comandos de AWS (CLI de AWS):
aws secretsmanager create-secret --name “name_of_secret” --description "Secret key to sign hash" --secret-string '{" name_of_key ":"value"}' --region us-east-1

  1. Cree una UDF de Lambda para generar un hash para el cifrado:
import boto3 import base64
import json
from hashlib import blake2b
from botocore.exceptions import ClientError def get_secret(): #This key is used by the Lambda function to further secure the hash. secret_name = "<name_of_secret>" region_name = "<aws_region_name>" # Create a Secrets Manager client session = boto3.session.Session() client = session.client(service_name='secretsmanager', region_name=<aws_region_name> ) # In this sample we only handle the specific exceptions for the 'GetSecretValue' API. # See https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_GetSecretValue.html # We rethrow the exception by default. try: get_secret_value_response = client.get_secret_value(SecretId=secret_name) except Exception as e: raise e if "SecretString" in get_secret_value_response: access_token = get_secret_value_response["SecretString"] else: access_token = get_secret_value_response["SecretBinary"] return json.loads(access_token)[<token key name>] SECRET_KEY = get_secret()
AUTH_SIZE = 16 def sign(payload): h = blake2b(digest_size=AUTH_SIZE, key=SECRET_KEY) h.update(payload) return h.hexdigest().encode('utf-8') def lambda_handler(event, context):
ret = dict() try: res = [] for argument in event['arguments']: try: msg = json.dumps(argument) signed_key = sign(str.encode(msg)) res.append(signed_key.decode('utf-8')) except: res.append(None) ret['success'] = True ret['results'] = res except Exception as e: ret['success'] = False ret['error_msg'] = str(e) return json.dumps(ret)

  1. Defina una UDF de Amazon Redshift para llamar a la función Lambda y crear un hash:
CREATE OR REPLACE EXTERNAL FUNCTION udf_get_digest (par1 varchar)
RETURNS varchar STABLE
LAMBDA 'redshift_get_digest'
IAM_ROLE 'arn:aws:iam::<AWSACCOUNTID>role/service-role/<role_name>';

La Gestión de identidades y accesos de AWS (IAM) en el paso anterior debe tener adjunta la siguiente política para poder invocar la función Lambda:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "lambda:InvokeFunction", "Resource": "arn:aws:lambda:us-east-1:<AWSACCOUNTID>1:function:redshift_get_digest" }
}

  1. Obtenga la clave de Secrets Manager.

La función Lambda utiliza esta clave para asegurar aún más el hash. Esto está indicado en el obtener_secreto función en el Paso 2.

Configure conjuntos de datos de Amazon Redshift en QuickSight

El panel de generación de cotizaciones utiliza la siguiente vista de Amazon Redshift.

Cree una vista de Amazon Redshift que utilice todas las columnas anteriores junto con la columna hash:

create view quote_gen_vw as select *, udf_get_digest ( customername || BGCheckRequired || Skill|| Shift ||State ||Cost ) from billing_input_tbl

Los registros se verán como la siguiente captura de pantalla.

La vista anterior se utilizará como conjunto de datos de QuickSight para generar cotizaciones. Se creará un análisis QuickSight utilizando el conjunto de datos. Para análisis casi en tiempo real, puede utilizar el modo de consulta directa QuickSight.

Crear recursos de API Gateway

La operación de reescritura se inicia cuando QuickSight invoca un recurso de API Gateway, que invoca la función de reescritura de Lambda. Como requisito previo para crear el campo calculado en QuickSight para llamar a la API de reescritura, primero debe crear estos recursos.

API Gateway protege e invoca la función Lambda de reescritura con los parámetros creados como parámetros de cadena de consulta URL con plantillas de asignación. Los parámetros de mapeo se pueden evitar mediante la integración del proxy Lambda.

Cree un recurso de API REST de tipo de método GET que utilice funciones Lambda (creadas en el siguiente paso) como tipo de integración. Para obtener instrucciones, consulte Creación de una API REST en Amazon API Gateway y Configurar integraciones Lambda en API Gateway.

La siguiente captura de pantalla muestra los detalles para crear un parámetro de cadena de consulta para cada parámetro pasado a API Gateway.

La siguiente captura de pantalla muestra los detalles para crear un parámetro de plantilla de asignación para cada parámetro pasado a API Gateway.

Crear la función Lambda

Cree una nueva función Lambda para que API Gateway la invoque. La función Lambda realiza los siguientes pasos:

  1. Reciba parámetros de QuickSight a través de API Gateway y aplique hash a los parámetros concatenados.

El siguiente ejemplo de código recupera parámetros de la llamada API Gateway utilizando el objeto de evento de la función Lambda:

 customer= event['customer’]) bgc = event['bgc']

La función realiza la lógica hash como se muestra en la crear hash paso anterior utilizando los parámetros concatenados pasados ​​por QuickSight.

  1. Compare la salida hash con el parámetro hash.

Si no coinciden, no se realizará la reescritura.

  1. Si los hashes coinciden, realice una reescritura. Verifique la presencia de un registro en la tabla de generación de cotizaciones generando una consulta desde la tabla usando los parámetros pasados ​​desde QuickSight:
query_str = "select * From tbquote where cust = '" + cust + "' and bgc = '" + bgc +"'" +" and skilledtrades = '" + skilledtrades + "' and shift = '" +shift + "' and jobdutydescription ='" + jobdutydescription + "'"

  1. Complete la siguiente acción según los resultados de la consulta:
    1. Si no existe ningún registro para la combinación anterior, genere y ejecute una consulta de inserción utilizando todos los parámetros con el estado generado.
    2. Si existe un registro para la combinación anterior, genere y ejecute una consulta de inserción con el estado como en revisión. Se reutilizará el quote_Id de la combinación existente.

Crear un objeto visual QuickSight

Este paso implica la creación de un objeto visual de tabla que utiliza un campo calculado para pasar parámetros a API Gateway e invocar la función Lambda anterior.

  1. Agregue un campo calculado de QuickSight denominado Generar cotización para contener la URL alojada de API Gateway que se activará para volver a escribir el historial de cotizaciones en Amazon Redshift:
concat("https://xxxxx.execute-api.us-east-1.amazonaws.com/stage_name/apiresourcename/?cust=",customername,"&bgc=",bgcheckrequired,"&billrate=",toString(billrate),"&skilledtrades=",skilledtrades,"&shift=",shift,"&jobdutydescription=",jobdutydescription,"&hash=",hashvalue)

  1. Cree un objeto visual de tabla QuickSight.
  2. Agregue campos obligatorios como Cliente, Habilidad y Costo.
  3. Agregue el campo calculado Generar cotización y ajústelo como un hipervínculo.

Al elegir este enlace, se escribirá el registro en Amazon Redshift. Esto corresponde a que se devuelva el mismo valor hash cuando la función Lambda realiza el hash en los parámetros.

La siguiente captura de pantalla muestra un objeto visual de tabla de ejemplo.

Escribir en la base de datos de Amazon Redshift

La función Lambda recupera y utiliza la clave de Secrets Manager para generar el hash para comparar. La reescritura se realizará solo si el hash coincide con el hash pasado en el parámetro.

La siguiente tabla de Amazon Redshift capturará el historial de cotizaciones tal como lo completa la función Lambda. Los registros en verde representan los registros más recientes de la cotización.

Consideraciones y próximos pasos

El uso de hashes seguros evita la manipulación de los parámetros de carga útil que son visibles en la ventana del navegador cuando se invoca la URL de reescritura. Para proteger aún más la URL de reescritura, puede emplear las siguientes técnicas:

  • Implemente la API REST en una VPC privada a la que solo puedan acceder los usuarios de QuickSight.
  • Para evitar ataques de repetición, se puede generar una marca de tiempo junto con la función hash y pasarla como parámetro adicional en la URL de reescritura. Luego, la función Lambda de backend se puede modificar para permitir solo reescrituras dentro de un cierto umbral basado en el tiempo.
  • Siga la puerta de enlace API control de acceso y EN LINEA mejores prácticas.
  • Mitigar las posible denegación de servicio para API públicas.

Puede mejorar aún más esta solución para representar un formulario basado en web cuando se abre la URL de reescritura. Esto podría implementarse generando dinámicamente un formulario HTML en la función Lambda del backend para admitir la entrada de información adicional. Si su carga de trabajo requiere una gran cantidad de reescrituras que requieren un mayor rendimiento o simultaneidad, un almacén de datos diseñado específicamente como Edición compatible con Amazon Aurora PostgreSQL podría ser una mejor opción. Para obtener más información, consulte Invocar una función de AWS Lambda desde un clúster de base de datos de Aurora PostgreSQL. Luego, estas actualizaciones se pueden sincronizar en tablas de Amazon Redshift mediante consultas federadas.

Conclusión

Esta publicación mostró cómo usar QuickSight junto con Lambda, API Gateway, Secrets Manager y Amazon Redshift para capturar datos de entrada del usuario y actualizar de forma segura su almacén de datos de Amazon Redshift sin salir de su entorno de QuickSight BI. Esta solución elimina la necesidad de crear una aplicación externa o una interfaz de usuario para las operaciones de actualización o inserción de bases de datos, y reduce los gastos generales de desarrollo y mantenimiento relacionados. La llamada de API Gateway también se puede proteger mediante una clave o token para garantizar que API Gateway solo acepte las llamadas que se originan en QuickSight. Esto se tratará en publicaciones posteriores.


Acerca de los autores

Srikanth Baheti es un Arquitecto de Soluciones Principales Especializado en todo el mundo para Amazon QuickSight. Comenzó su carrera como consultor y trabajó para múltiples organizaciones privadas y gubernamentales. Más tarde, trabajó para PerkinElmer Health and Sciences & eResearch Technology Inc, donde fue responsable del diseño y desarrollo de aplicaciones web de alto tráfico, canalizaciones de datos altamente escalables y mantenibles para plataformas de informes que utilizan servicios de AWS y computación sin servidor.

Raji Shivasubramaniam es un Arquitecto de Soluciones Sr. en AWS, que se enfoca en Analytics. Raji está especializado en la arquitectura de soluciones integrales de administración de datos empresariales, inteligencia empresarial y análisis para empresas Fortune 500 y Fortune 100 en todo el mundo. Tiene una amplia experiencia en datos y análisis integrados de atención médica con una amplia variedad de conjuntos de datos de atención médica, incluido el mercado administrado, la orientación de médicos y el análisis de pacientes.

Sello de tiempo:

Mas de Big Data de AWS