Inserte un panel de Amazon QuickSight en una aplicación Angular local - Recomendaciones de AWS

Inserte un panel de Amazon QuickSight en una aplicación Angular local

Sean Griffin y Milena Godau, Amazon Web Services

Resumen

Este patrón proporciona orientación para integrar un panel de Amazon QuickSight en una aplicación Angular alojada localmente para su desarrollo o prueba. La característica de análisis integrada en QuickSight no admite esta funcionalidad de forma nativa. Requiere una cuenta QuickSight con un panel de control existente y conocimientos de Angular.

Cuando trabaja con paneles QuickSight integrados, normalmente tendrá que alojar la aplicación en un servidor web para ver el panel. Esto dificulta el desarrollo, ya que hay que enviar continuamente los cambios al servidor web para asegurarse de que todo funciona correctamente. Este patrón muestra cómo ejecutar un servidor alojado localmente y utilizar los análisis integrados de QuickSight para facilitar y agilizar el proceso de desarrollo.

Requisitos previos y limitaciones

Requisitos previos 

Limitaciones

  • Este patrón proporciona orientación sobre cómo incrustar un panel de QuickSight mediante el tipo de autenticación ANONYMOUS (de acceso público). Si está utilizando la autenticación AWS Identity and Access Management (IAM) o QuickSight con los paneles integrados, el código proporcionado no se aplicará. Sin embargo, los pasos para alojar la aplicación Angular en la sección Epics siguen siendo válidos.

  • El uso de la API GetDashboardEmbedURL con el tipo de identidad ANONYMOUS requiere un plan de precios de capacidad de QuickSight.

Versiones

Arquitectura

Pila de tecnología

  • Frontend de Angular

  • Backend de AWS Lambda y Amazon API Gateway

Arquitectura

En esta arquitectura, las API HTTP de API Gateway permiten que la aplicación Angular local llame a la función de Lambda. La función de Lambda devuelve la URL para incrustar el panel de QuickSight.

Arquitectura para integrar un panel de QuickSight en una aplicación Angular local

Automatizar y escalar

Puede automatizar la implementación de backend mediante AWS CloudFormation o AWS Serverless Application Model (AWS SAM).

Herramientas

Herramientas

  • CLI de Angular  es una herramienta de interfaz de la línea de comandos que se utiliza para inicializar, desarrollar, estructurar y mantener aplicaciones de Angular directamente desde un intérprete de comandos.

  • El SDK de integración de QuickSight se utiliza para incrustar los paneles de QuickSight en el código HTML.

  • mkcert es una herramienta sencilla para crear certificados de desarrollo fiables a nivel local. No requiere configuración. Se requiere mkcert porque QuickSight solo permite solicitudes HTTPS para incrustar paneles.

Servicios de AWS

  • Amazon API Gateway es un servicio de AWS para la creación, publicación, mantenimiento, monitoreo y protección de API REST, HTTP y WebSocket a cualquier escala. 

  • AWS Lambda es un servicio de computación que permite ejecutar código sin aprovisionar ni administrar servidores. Lambda ejecuta su código solo cuando es necesario y escala de manera automática, desde unas pocas solicitudes por día hasta miles por segundo. Solo pagará por el tiempo de computación que consuma, no se aplican cargos cuando el código no se está ejecutando. 

  • Amazon QuickSight es un servicio de análisis empresarial para crear visualizaciones, realizar análisis ad hoc y obtener información empresarial de sus datos.

Epics

TareaDescripciónHabilidades requeridas

Cree una política de EmbedURL.

Cree una política de IAM denominada QuickSightGetDashboardEmbedURL que tenga las siguientes propiedades.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "quicksight:GetDashboardEmbedUrl", "quickSight:GetAnonymousUserEmbedUrl" ], "Resource": "*" } ] }
Administrador de AWS

Crear la función de Lambda.

1. Abra la página Funciones en la consola de Lambda.

2. Elija Crear función.

3. Elija Crear desde cero.

4. En Nombre de la función, introduzca get-qs-embed-url.

5. En Runtime (Tiempo de ejecución), elija Python 3.9.

6. Elija Crear función.

7. En la pestaña Código, copie el siguiente código en la función de Lambda.

import json import boto3 from botocore.exceptions import ClientError import time from os import environ qs = boto3.client('quicksight',region_name='us-east-1') sts = boto3.client('sts') ACCOUNT_ID = boto3.client('sts').get_caller_identity().get('Account') DASHBOARD_ID = environ['DASHBOARD_ID'] def getDashboardURL(accountId, dashboardId, quicksightNamespace, resetDisabled, undoRedoDisabled): try: response = qs.get_dashboard_embed_url( AwsAccountId = accountId, DashboardId = dashboardId, Namespace = quicksightNamespace, IdentityType = 'ANONYMOUS', SessionLifetimeInMinutes = 600, UndoRedoDisabled = undoRedoDisabled, ResetDisabled = resetDisabled ) return response except ClientError as e: print(e) return "Error generating embeddedURL: " + str(e) def lambda_handler(event, context): url = getDashboardURL(ACCOUNT_ID, DASHBOARD_ID, "default", True, True)['EmbedUrl'] return { 'statusCode': 200, 'url': url }

8. Elija Implementar.

Desarrollador de aplicaciones

Añada el ID del panel de control como variable de entorno.

Añada DASHBOARD_ID como variable de entorno a su función de Lambda:

  1. En la pestaña Configuración, seleccione Variables de entorno, Editar y Añadir variable de entorno.

  2. Añada una variable de entorno con la clave DASHBOARD_ID.

  3. Para obtener el valor de DASHBOARD_ID, vaya a su panel de control en QuickSight y copie el UUID al final de la URL en su navegador. Por ejemplo, si la URL es https://us-east-1.quicksight.aws.amazon.com/sn/dashboards/<dashboard-id>, especifique la parte <dashboard-id> de la URL como valor clave.

  4. Seleccione Save.

Desarrollador de aplicaciones

Añada permisos para la función de Lambda.

Modifique la función de ejecución de la función de Lambda y agréguele la política QuickSightGetDashboardEmbedURL.

  1. En la pestaña Configuración, elija Permisos y, a continuación, elija el nombre del rol.

  2. Elija Adjuntar políticas,  busque QuicksightGetDashboardEmbedUrl, marque su casilla de verificación y, a continuación, elija Adjuntar política.

Desarrollador de aplicaciones

Probar la función de Lambda.

Cree y ejecute un evento de prueba. Puede usar la plantilla "Hello World", ya que la función no utilizará ninguno de los datos del evento de prueba.

  1. Elija la pestaña Prueba.

  2. Asigne un nombre al evento de prueba y, a continuación, seleccione Guardar.

  3. Para probar su función de Lambda, elija Probar. La respuesta debería ser similar a la siguiente.

{ "statusCode": 200, "url": "\"https://us-east-1.quicksight.aws.amazon.com/embed/f1acc0786687783b9a4543a05ba929b3a/dashboards/... }
nota

Como se menciona en la sección Requisitos previos y limitaciones, su cuenta QuickSight debe estar sujeta a un plan de precios por capacidad de sesión. De lo contrario, en este se paso mostrará un mensaje de error.

Desarrollador de aplicaciones

Crear una API en API Gateway.

  1. En la consola de API Gateway, elija Crear API y, a continuación, elija REST API, Crear.

    • Para el nombre de la API, escriba qs-embed-api.

    • Seleccione Crear API.

  2. En Acciones, elija Crear método.

    • Seleccione GET y confirme pulsando la marca de verificación.

    • Elija Función de Lambda como tipo de integración.

    • En Función de Lambda, introduzca get-qs-embed-url.

    • Seleccione Save.

    • En el cuadro Agregar permiso a la función de Lambda, elija Aceptar.

  3. Habilite CORS.

    • En Acciones, elija Habilitar CORS.

    • Para Access-Control-Allow-Origin, introduca 'https://my-qs-app.net:4200'.

    • Elija Habiltar CORS y reemplazar los encabezados CORS existentes, y confirme.

  4. Implementar la API.

    • Para Acciones, seleccione Implementar API.

    • En Deployment stage (Etapa de implementación), elija [new stage] ([nueva etapa]).

    • En Stage name (Nombre de etapa), escriba dev.

    • Elija Implementar.

    • Copie la URL de invocación.

nota

my-qs-app.net puede ser cualquier dominio. Si quiere usar un nombre de dominio diferente, asegúrese de actualizar la información de Access-Control-Allow-Origin en el paso 3 y cambiar my-qs-app.net en los pasos siguientes.

Desarrollador de aplicaciones
TareaDescripciónHabilidades requeridas

Cree la aplicación con la CLI de Angular.

  1. Cree la aplicación.

    ng new quicksight-app --defaults cd quicksight-app/src/app
  2. Cree el componente del panel de control.

    ng g c dashboard
  3. Vaya a su archivo src/environments/environment.ts y agregue apiUrl: '<Invoke URL from previous steps>' al objeto del entorno.

    export const environment = { production: false, apiUrl: '<Invoke URL from previous steps>', };
Desarrollador de aplicaciones

Añada el SDK de integración de QuickSight.

  1. Instale el SDK de integración de QuickSight ejecutando el siguiente comando en la carpeta raíz del proyecto.

    npm i amazon-quicksight-embedding-sdk
  2. Cree un nuevo archivo decl.d.ts en la carpeta src con el siguiente contenido.

    declare module 'amazon-quicksight-embedding-sdk';
Desarrollador de aplicaciones

Añada código a su archivo dashboard.component.ts.

import { Component, OnInit } from '@angular/core'; import { HttpClient } from '@angular/common/http'; import * as QuicksightEmbedding from 'amazon-quicksight-embedding-sdk'; import { environment } from "../../environments/environment"; import { take } from 'rxjs'; import { EmbeddingContext } from 'amazon-quicksight-embedding-sdk/dist/types'; import { createEmbeddingContext } from 'amazon-quicksight-embedding-sdk'; @Component({ selector: 'app-dashboard', templateUrl: './dashboard.component.html', styleUrls: ['./dashboard.component.scss'] }) export class DashboardComponent implements OnInit { constructor(private http: HttpClient) { } loadingError = false; dashboard: any; ngOnInit() { this.GetDashboardURL(); } public GetDashboardURL() { this.http.get(environment.apiUrl) .pipe( take(1), ) .subscribe((data: any) => this.Dashboard(data.url)); } public async Dashboard(embeddedURL: any) { var containerDiv = document.getElementById("dashboardContainer") || ''; const frameOptions = { url: embeddedURL, container: containerDiv, height: "850px", width: "100%", resizeHeightOnSizeChangedEvent: true, } const embeddingContext: EmbeddingContext = await createEmbeddingContext(); this.dashboard = embeddingContext.embedDashboard(frameOptions); } }
Desarrollador de aplicaciones

Añada código a su archivo dashboard.component.html.

Agregue el siguiente código al archivo src/app/dashboard/dashboard.component.html.

<div id="dashboardContainer"></div>
Desarrollador de aplicaciones

Modifique el archivo app.component.html para cargar el componente del panel de control.

  1. Elimine el contenido del archivo src/app/app.component.html.

  2. Añada lo siguiente.

    <app-dashboard></app-dashboard>
Desarrollador de aplicaciones

Importe HttpClientModule en su archivo app.module.ts.

  1. En la parte superior del archivo src/app/app.module.ts, añada lo siguiente:

    import { HttpClientModule } from '@angular/common/http';
  2. Agregue HttpClientModule a la matriz  imports para su AppModule.

Desarrollador de aplicaciones
TareaDescripciónHabilidades requeridas

Configure mkcert.

nota

Los siguientes comandos son para máquinas Unix o macOS. Si utiliza Windows, consulte la sección Información adicional para ver el comando echo equivalente.

  1. Cree una entidad de certificación (CA) local en el equipo.

    mkcert -install
  2. Configure my-qs-app.net para que siempre se redirija a su PC local.

    echo "127.0.0.1 my-qs-app.net" | sudo tee -a /private/etc/hosts
  3. Asegúrese de que está en el directorio src del proyecto de Angular.

    mkcert my-qs-app.net 127.0.0.1
Desarrollador de aplicaciones

Configure QuickSight para permitir su dominio.

  1. En QuickSight, elija su nombre en la esquina superior derecha y, a continuación, elija Manage Quicksight.

  2. Vaya a Dominios e integración.

  3. Añada https://my-qs-app.net:4200 como dominio permitido.

Administrador de AWS

Probar la solución.

Para iniciar un servidor de desarrollo local de Angular, ejecute el siguiente comando.

ng serve --host my-qs-app.net --port 4200 --ssl --ssl-key "./src/my-qs-app.net-key.pem" --ssl-cert "./src/my-qs-app.net.pem" -o

Esto habilita la capa de conexión segura (SSL) con el certificado personalizado que ha creado anteriormente.

Cuando se completa la compilación, se abre una ventana del navegador y puede ver su panel de QuickSight integrado alojado localmente en Angular.

Desarrollador de aplicaciones

Recursos relacionados

Información adicional

Si utiliza Windows, ejecute la ventana de línea de comandos como administrador y configure my-qs-app.net para que siempre se redirija a su PC local mediante el siguiente comando. 

echo 127.0.0.1 my-qs-app.net >> %WINDIR%\System32\Drivers\Etc\Hosts