{"id":2134,"date":"2023-07-13T07:55:35","date_gmt":"2023-07-13T07:55:35","guid":{"rendered":"https:\/\/keepler.io\/2023\/07\/13\/como-llevar-quicksight-produccion\/"},"modified":"2023-09-12T10:17:40","modified_gmt":"2023-09-12T10:17:40","slug":"como-llevar-quicksight-produccion","status":"publish","type":"post","link":"https:\/\/keepler.io\/es\/2023\/07\/13\/como-llevar-quicksight-produccion\/","title":{"rendered":"C\u00f3mo llevar Quicksight a producci\u00f3n"},"content":{"rendered":"<p>Desde 2016, AWS incluye Quicksight como su servicio de Business Intelligence (BI). Quicksight facilita el an\u00e1lisis empresarial gracias a la sencillez que ofrece en la generaci\u00f3n de visualizaciones y tableros interactivos, y a su alta capacidad para el an\u00e1lisis en tiempo real de los datos. A pesar de ello, se siguen encontrando grandes dificultades cuando llega el momento de promocionar los objetos generados en Quicksight (an\u00e1lisis, dashboards y conjuntos de datos) entre entornos o entre cuentas. No hay un m\u00e9todo sencillo donde el analista de datos que ha generado los an\u00e1lisis y los dashboards de Quicksight en un entorno de desarrollo pueda <strong>promocionar esos an\u00e1lisis\/dashboards al entorno productivo<\/strong>.<\/p>\n<p>Este art\u00edculo tratar\u00e1 de explicar una propuesta desarrollada para solucionar este problema, debido a que aparece de forma recurrente en aquellos proyectos en los que se trabaja con entornos multicuenta con Amazon Quicksight. Esta soluci\u00f3n ha sido validada en entornos productivos por un analista de datos, certificando, de esta forma, su funcionamiento en la mayor\u00eda de casos, y detectando aquellos en los que su funcionamiento no ha sido el esperado.<\/p>\n<p><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-54955 aligncenter\" src=\"https:\/\/i0.wp.com\/keepler.io\/wp-content\/uploads\/2023\/07\/keepler-aws-migration-dashboards-quicksight.png?resize=512%2C219&#038;ssl=1\" alt=\"\" width=\"512\" height=\"219\" \/><\/p>\n<h3>Desarrollo de la soluci\u00f3n<\/h3>\n<p>Para implementar esta soluci\u00f3n se ha hecho uso de boto3, el SDK de AWS para python. Boto3 es una biblioteca de python que facilita la comunicaci\u00f3n con los distintos servicios de AWS, y en este caso, se ha utilizado para interactuar con el servicio de Amazon Quicksight a trav\u00e9s de su API. Esta API permite realizar operaciones CRUD con los distintos objetos de Quicksight, por lo que facilita el objetivo de migrar los conjuntos de datos, an\u00e1lisis y dashboard de una cuenta origen de AWS a una cuenta destino.<\/p>\n<p>Al realizar la migraci\u00f3n de objetos de Quicksight entre entornos, es importante seguir un <strong>orden espec\u00edfico<\/strong> debido a la presencia de <strong>dependencias<\/strong> entre ellos. Por ejemplo, un an\u00e1lisis depender\u00e1 de los conjuntos de datos que utiliza.<\/p>\n<p>Durante el proceso de migraci\u00f3n, se tomar\u00e1n los objetos de la cuenta origen y, mediante la API de Quicksight, ser\u00e1n transformados en objetos JSON, para desde estos objetos JSON poder crear objetos Quicksight en la cuenta destino.<\/p>\n<p>El <strong>primero<\/strong> de los objetos que se debe migrar y crear en la cuenta de destino son los <strong>data sources1<\/strong>. Los data sources son conexiones a la fuente de datos subyacente, que puede ser una base de datos relacional, una base de datos NoSQL u otro tipo de fuente de datos. Es necesario que estos existan en la cuenta de destino antes de migrar los conjuntos de datos, ya que tienen como referencia el identificador \u00fanico de los data source.<\/p>\n<p>Para migrar estos objetos de Quicksight hay que comprobar qu\u00e9 data sources existen en la cuenta de origen, lo que se puede realizar mediante el m\u00e9todo <a href=\"https:\/\/boto3.amazonaws.com\/v1\/documentation\/api\/1.26.93\/reference\/services\/quicksight\/client\/list_data_sources.html\" target=\"_blank\" rel=\"noopener\"><em>list_data_source<\/em><\/a>; luego recorrer cada uno de estos data source de la cuenta origen para comprobar su configuraci\u00f3n (con el m\u00e9todo <a href=\"https:\/\/boto3.amazonaws.com\/v1\/documentation\/api\/1.26.93\/reference\/services\/quicksight\/client\/describe_data_source.html\" target=\"_blank\" rel=\"noopener\"><em>describe_data_source<\/em><\/a>). Y finalmente, crearlo en la cuenta destino, a trav\u00e9s del m\u00e9todo <a href=\"https:\/\/boto3.amazonaws.com\/v1\/documentation\/api\/1.26.93\/reference\/services\/quicksight\/client\/create_data_source.html\" target=\"_blank\" rel=\"noopener\"><em>create_data_source<\/em><\/a>.<\/p>\n<p>Es importante que al crear el data source en la cuenta de destino se utilice el <strong>mismo identificador \u00fanico<\/strong> (<em>DataSourceId<\/em>) que en la cuenta de origen, ya que esto facilitar\u00e1 posteriormente la creaci\u00f3n de los conjuntos de datos, al no tener que modificar el ID del data source que referencian.<\/p>\n<p>Con los data sources migrados, se pueden migrar los <strong>conjuntos de datos<\/strong>. Esta migraci\u00f3n se realiza de la misma forma que la anterior. Primero se comprueba qu\u00e9 conjuntos de datos existen en la cuenta de origen (<a href=\"https:\/\/boto3.amazonaws.com\/v1\/documentation\/api\/1.26.93\/reference\/services\/quicksight\/client\/list_data_sets.html\" target=\"_blank\" rel=\"noopener\"><em>list_data_sets<\/em><\/a>); posteriormente se comprueba su configuraci\u00f3n (<a href=\"https:\/\/boto3.amazonaws.com\/v1\/documentation\/api\/1.26.93\/reference\/services\/quicksight\/client\/describe_data_set.html\" target=\"_blank\" rel=\"noopener\"><em>describe_data_set<\/em><\/a>), y una vez se conoce su configuraci\u00f3n, se pueden crear en la cuenta de destino utilizando el m\u00e9todo <a href=\"https:\/\/boto3.amazonaws.com\/v1\/documentation\/api\/1.26.93\/reference\/services\/quicksight\/client\/create_data_set.html\" target=\"_blank\" rel=\"noopener\"><em>create_data_set2<\/em><\/a>. Una vez creados los conjuntos de datos, para que los usuarios de la cuenta destino puedan visualizarlos desde la consola hay que actualizar sus permisos utilizando el m\u00e9todo <a href=\"https:\/\/boto3.amazonaws.com\/v1\/documentation\/api\/1.26.93\/reference\/services\/quicksight\/client\/update_data_set_permissions.html\" target=\"_blank\" rel=\"noopener\"><em>update_data_set_permissions<\/em><\/a>.<\/p>\n<p>Finalmente, para migrar los <strong>an\u00e1lisis<\/strong> y los<strong> dashboards<\/strong> de la cuenta de origen a la cuenta de destino, es necesario seguir un procedimiento diferente al utilizado previamente con los data sources y data sets. Esto se debe a que la API de Quicksight, al convertir el an\u00e1lisis en un objeto de tipo JSON con el m\u00e9todo <a href=\"https:\/\/boto3.amazonaws.com\/v1\/documentation\/api\/1.26.93\/reference\/services\/quicksight\/client\/describe_analysis.html\" target=\"_blank\" rel=\"noopener\"><em>describe_analysis<\/em><\/a>, da como resultado un objeto JSON que no es compatible con el m\u00e9todo <a href=\"https:\/\/boto3.amazonaws.com\/v1\/documentation\/api\/1.26.93\/reference\/services\/quicksight\/client\/create_analysis.html\" target=\"_blank\" rel=\"noopener\"><em>create_analysis<\/em><\/a>, ya que este m\u00e9todo encuentra problemas de validez de formato. Para solucionar este inconveniente, se debe hacer uso de un template de Quicksight, que actuar\u00e1 como comod\u00edn, facilitando la creaci\u00f3n de los an\u00e1lisis y dashboard en la cuenta destino.<\/p>\n<p><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-54988 aligncenter\" src=\"https:\/\/i0.wp.com\/keepler.io\/wp-content\/uploads\/2023\/07\/keepler-dashboards-migration-quicksight-aws-.jpeg?resize=721%2C393&#038;ssl=1\" alt=\"\" width=\"721\" height=\"393\" \/><\/p>\n<p>Este template se crear\u00e1 a partir de cada uno de los an\u00e1lisis que se quieran migrar, por lo tanto se tendr\u00e1 un template por an\u00e1lisis. El m\u00e9todo <a href=\"https:\/\/boto3.amazonaws.com\/v1\/documentation\/api\/1.26.93\/reference\/services\/quicksight\/client\/create_template.html\" target=\"_blank\" rel=\"noopener\"><em>create_template<\/em><\/a> necesita como par\u00e1metros el arn del an\u00e1lisis a partir del cual se va a crear el template y una lista con los arn de los conjuntos de datos que utiliza este an\u00e1lisis. Estos datos pueden obtenerse a trav\u00e9s del m\u00e9todo <a href=\"https:\/\/boto3.amazonaws.com\/v1\/documentation\/api\/1.26.93\/reference\/services\/quicksight\/client\/describe_analysis.html\" target=\"_blank\" rel=\"noopener\"><em>describe_analysis<\/em><\/a>. Con el template creado, se tienen que conceder al usuario ra\u00edz de la cuenta destino los permisos <em>quicksight:DescribeTemplate<\/em> y <em>quicksight:UpdateTemplatePermissions<\/em>. Y, de esta forma, se podr\u00e1 crear el an\u00e1lisis y el dashboard en la cuenta destino a partir del template. Para ello se tiene que hacer uso de los m\u00e9todos <a href=\"https:\/\/boto3.amazonaws.com\/v1\/documentation\/api\/1.26.93\/reference\/services\/quicksight\/client\/create_analysis.html\" target=\"_blank\" rel=\"noopener\"><em>create_analysis<\/em><\/a> y <a href=\"https:\/\/boto3.amazonaws.com\/v1\/documentation\/api\/1.26.93\/reference\/services\/quicksight\/client\/create_dashboard.html\" target=\"_blank\" rel=\"noopener\"><em>create_dashboard<\/em><\/a>, que ,como se indica en el diagrama, hacen uso del par\u00e1metro <em>SourceEntity<\/em>. Este par\u00e1metro es un diccionario con un campo para el arn del template y otro para una lista de arn de los conjuntos de datos de la cuenta destino que utiliza el an\u00e1lisis, o dashboard, que se est\u00e1 creando.<\/p>\n<p>Una vez creado tanto el an\u00e1lisis como el dashboard, simplemente queda actualizar los permisos de estos para que aquellos usuarios, o roles, que necesiten puedan visualizarlos en la consola y realizar modificaciones sobre ellos.<\/p>\n<p>La soluci\u00f3n que se ha planteado se encarga de realizar una primera migraci\u00f3n de aquellos objetos de Quicksight que no existen en la cuenta destino. Pero se puede a\u00f1adir un condicional que compruebe si existe el objeto de Quicksight antes de crearlo. Y, en caso afirmativo el objeto se actualizar\u00e1 mediante los m\u00e9todos <a href=\"https:\/\/boto3.amazonaws.com\/v1\/documentation\/api\/1.26.93\/reference\/services\/quicksight\/client\/update_data_set.html\" target=\"_blank\" rel=\"noopener\"><em>update_data_set<\/em><\/a>, <a href=\"https:\/\/boto3.amazonaws.com\/v1\/documentation\/api\/1.26.93\/reference\/services\/quicksight\/client\/update_template.html\" target=\"_blank\" rel=\"noopener\"><em>update_template<\/em><\/a>, <a href=\"https:\/\/boto3.amazonaws.com\/v1\/documentation\/api\/1.26.93\/reference\/services\/quicksight\/client\/update_analysis.html\" target=\"_blank\" rel=\"noopener\"><em>update_analysis<\/em><\/a> y <a href=\"https:\/\/boto3.amazonaws.com\/v1\/documentation\/api\/1.26.93\/reference\/services\/quicksight\/client\/update_dashboard.html\" target=\"_blank\" rel=\"noopener\"><em>update_dashboard<\/em><\/a>. De esta forma se podr\u00e1n desarrollar nuevas versiones de los an\u00e1lisis y dashboards de quicksight y migrarlos al entorno productivo cuando la versi\u00f3n sea estable.<\/p>\n<h3>Qu\u00e9 debes tener en cuenta<\/h3>\n<p>Durante la fase de <strong>validaci\u00f3n<\/strong> del proceso de migraci\u00f3n de dashboards, hubo algunos aspectos en los que la migraci\u00f3n de los elementos conten\u00eda alguna diferencia con respecto al informe original.<\/p>\n<p>Este es el caso de la migraci\u00f3n de <strong>documentos<\/strong> que contienen <strong>pesta\u00f1as<\/strong>. Uno de los an\u00e1lisis conten\u00eda tres pesta\u00f1as, de las cuales solo dos de ellas se decidieron publicar en el dashboard del entorno de desarrollo. Tras realizar la migraci\u00f3n y comprobar el resultado en el entorno de producci\u00f3n, el dashboard mostraba las tres pesta\u00f1as de las que constaba el an\u00e1lisis, de forma que la selecci\u00f3n de pesta\u00f1as a mostrar en el dashboard no se hab\u00eda transferido durante la migraci\u00f3n.<\/p>\n<p>Tambi\u00e9n algunos visuales que formaban parte de los an\u00e1lisis mostraron peque\u00f1as <strong>diferencias en los colores utilizados<\/strong>. Esto se daba especialmente en aquellos casos en los que el color a utilizar para un valor concreto se hab\u00eda seleccionado de forma manual, sin que el hexacolor formara parte del tema principal utilizado para el resto del an\u00e1lisis.<\/p>\n<p>Por \u00faltimo, se debe tener en cuenta que aquellas <strong>opciones activadas con posterioridad<\/strong> a la creaci\u00f3n del dashboard no se heredan tras la migraci\u00f3n. Opciones como compartir el documento con \u201c<em>Todos los usuarios de la cuenta<\/em>\u201d o activar el \u201c<em>Detectable en Quicksight<\/em>\u201d se deben realizar directamente sobre el dashboard ya migrado, aunque ya estuvieran activadas en el informe original, ya que son opciones que no forman parte del an\u00e1lisis a partir del cual se crea el dashboard.<\/p>\n<h3>Conclusiones<\/h3>\n<p>Mediante el uso del SDK de AWS para Python, boto3, y la API de Quicksight, se ha <strong>facilitado a los analistas de datos el proceso de migraci\u00f3n<\/strong> de conjuntos de datos, an\u00e1lisis y dashboards de manera efectiva en entornos multicuenta de AWS.<\/p>\n<p>La migraci\u00f3n de objetos de Quicksight entre entornos ha sido una tarea compleja pero gracias a la soluci\u00f3n propuesta y validada en entornos productivos, <strong>se ha logrado generar un mecanismo automatizable, fiable y eficiente<\/strong>.<\/p>\n<p>AWS est\u00e1 trabajando activamente en la optimizaci\u00f3n de este proceso, con el objetivo de facilitar cada uno de los pasos que hay que seguir para lograr esta migraci\u00f3n de recursos de Quicksight. Mientras tanto, esta soluci\u00f3n permitir\u00e1 amenizar la espera y asegurar un correcto funcionamiento de todo el engranaje.<\/p>\n<p>(1)Los data sources se pueden configurar de forma independiente en la cuenta destino sin necesidad de realizar la migraci\u00f3n. Pero si se opta por este m\u00e9todo, entonces se debe contar con alg\u00fan tipo de equivalencia entre los identificadores \u00fanicos (ID) de los data sources de la cuenta origen y los creados en la cuenta destino. Ya que es un campo indispensable para la migraci\u00f3n de los conjuntos de datos.<\/p>\n<p>(2)Durante el desarrollo de la soluci\u00f3n se tuvo que resolver una dependencia entre algunos conjuntos de datos entre s\u00ed. Esto se deb\u00eda a que los dashboards de Quicksight que se utilizaban hac\u00eda uso de la seguridad a nivel de fila (RLS), para filtrar los datos en funci\u00f3n de los permisos de cada usuario. Y, por este motivo, algunos conjuntos de datos ten\u00edan una dependencia con aquel que marcaba la restricci\u00f3n a nivel de fila, por lo tanto este conjunto de datos tuvo que ser migrado en primer lugar.<\/p>\n<p>&nbsp;<\/p>\n<p>Imagen: Unsplash | Shahadat Rahman<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Desde 2016, AWS incluye Quicksight como su servicio de Business Intelligence (BI). Quicksight facilita el an\u00e1lisis empresarial gracias a la sencillez que ofrece en la generaci\u00f3n de visualizaciones y tableros interactivos, y a su alta capacidad para el an\u00e1lisis en tiempo real de los datos. A pesar de ello, se siguen encontrando grandes dificultades cuando [&hellip;]<\/p>\n","protected":false},"author":134360170,"featured_media":1920,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_seopress_robots_primary_cat":"","_seopress_titles_title":"","_seopress_titles_desc":"","_seopress_robots_index":"","_et_pb_use_builder":"","_et_pb_old_content":"","_et_gb_content_width":"","_crdt_document":"","content-type":"","_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"_wpas_customize_per_network":false,"jetpack_post_was_ever_published":false},"categories":[221],"tags":[236,259,274],"class_list":["post-2134","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tecnologias","tag-aws","tag-dashboards-es","tag-quicksight-es"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/keepler.io\/wp-content\/uploads\/2023\/07\/keepler-aws-quicksight-migration-dashboards.png?fit=1280%2C450&ssl=1","jetpack_shortlink":"https:\/\/wp.me\/p9CeZw-yq","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/posts\/2134","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/users\/134360170"}],"replies":[{"embeddable":true,"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/comments?post=2134"}],"version-history":[{"count":1,"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/posts\/2134\/revisions"}],"predecessor-version":[{"id":2236,"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/posts\/2134\/revisions\/2236"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/media\/1920"}],"wp:attachment":[{"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/media?parent=2134"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/categories?post=2134"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/tags?post=2134"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}