{"id":12394,"date":"2021-10-14T07:48:46","date_gmt":"2021-10-14T07:48:46","guid":{"rendered":"https:\/\/beta.bluetab.net\/serverless-microservices\/"},"modified":"2023-10-17T12:55:45","modified_gmt":"2023-10-17T12:55:45","slug":"serverless-microservices","status":"publish","type":"post","link":"https:\/\/bluetab.org\/en\/serverless-microservices\/","title":{"rendered":"Serverless Microservices"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"12394\" class=\"elementor elementor-12394\" data-elementor-post-type=\"post\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-b2ad9fe elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"b2ad9fe\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-7eac278\" data-id=\"7eac278\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-45481b1 elementor-widget elementor-widget-heading\" data-id=\"45481b1\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h1 class=\"elementor-heading-title elementor-size-default\">Serverless Microservices<\/h1>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-7843b8f elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"7843b8f\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-1a4ee60\" data-id=\"1a4ee60\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-ceb86e7 elementor-position-left elementor-vertical-align-middle elementor-widget elementor-widget-image-box\" data-id=\"ceb86e7\" data-element_type=\"widget\" data-widget_type=\"image-box.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"elementor-image-box-wrapper\"><figure class=\"elementor-image-box-img\"><a href=\"https:\/\/www.linkedin.com\/in\/francisco-linaje-024499175\/\" target=\"_blank\" tabindex=\"-1\"><img decoding=\"async\" width=\"150\" height=\"150\" data-src=\"https:\/\/www.bluetab.net\/wp-content\/uploads\/2021\/10\/Francisco-150x150.jpg\" class=\"attachment-thumbnail size-thumbnail wp-image-12383 lazyload\" alt=\"\" data-srcset=\"https:\/\/bluetab.org\/wp-content\/uploads\/2021\/10\/Francisco-150x150.jpg 150w, https:\/\/bluetab.org\/wp-content\/uploads\/2021\/10\/Francisco-300x300.jpg 300w, https:\/\/bluetab.org\/wp-content\/uploads\/2021\/10\/Francisco-75x75.jpg 75w, https:\/\/bluetab.org\/wp-content\/uploads\/2021\/10\/Francisco.jpg 384w\" data-sizes=\"(max-width: 150px) 100vw, 150px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 150px; --smush-placeholder-aspect-ratio: 150\/150;\" \/><\/a><\/figure><div class=\"elementor-image-box-content\"><h4 class=\"elementor-image-box-title\"><a href=\"https:\/\/www.linkedin.com\/in\/francisco-linaje-024499175\/\" target=\"_blank\">Francisco Linaje<\/a><\/h4><p class=\"elementor-image-box-description\">AWS Solutions Architect<\/p><\/div><\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-ed6cc51\" data-id=\"ed6cc51\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-173edbe elementor-share-buttons--view-icon elementor-share-buttons--skin-minimal elementor-share-buttons--shape-circle elementor-grid-0 elementor-share-buttons--color-official elementor-widget elementor-widget-share-buttons\" data-id=\"173edbe\" data-element_type=\"widget\" data-widget_type=\"share-buttons.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-grid\" role=\"list\">\n\t\t\t\t\t\t\t\t<div class=\"elementor-grid-item\" role=\"listitem\">\n\t\t\t\t\t\t<div class=\"elementor-share-btn elementor-share-btn_twitter\" role=\"button\" tabindex=\"0\" aria-label=\"Share on twitter\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-share-btn__icon\">\n\t\t\t\t\t\t\t\t<i class=\"fab fa-twitter\" aria-hidden=\"true\"><\/i>\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-grid-item\" role=\"listitem\">\n\t\t\t\t\t\t<div class=\"elementor-share-btn elementor-share-btn_linkedin\" role=\"button\" tabindex=\"0\" aria-label=\"Share on linkedin\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-share-btn__icon\">\n\t\t\t\t\t\t\t\t<i class=\"fab fa-linkedin\" aria-hidden=\"true\"><\/i>\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-2b67acd\" data-id=\"2b67acd\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap\">\n\t\t\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-c738cdf elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"c738cdf\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-55b901d\" data-id=\"55b901d\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-7668b05 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"7668b05\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-592ef24\" data-id=\"592ef24\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-6010029 elementor-widget elementor-widget-theme-post-featured-image elementor-widget-image\" data-id=\"6010029\" data-element_type=\"widget\" id=\"introduccion\" data-widget_type=\"theme-post-featured-image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img fetchpriority=\"high\" decoding=\"async\" width=\"1024\" height=\"512\" src=\"https:\/\/bluetab.org\/wp-content\/uploads\/2023\/10\/5-1024x512.png\" class=\"attachment-large size-large wp-image-17826\" alt=\"\" srcset=\"https:\/\/bluetab.org\/wp-content\/uploads\/2023\/10\/5-1024x512.png 1024w, https:\/\/bluetab.org\/wp-content\/uploads\/2023\/10\/5-300x150.png 300w, https:\/\/bluetab.org\/wp-content\/uploads\/2023\/10\/5-768x384.png 768w, https:\/\/bluetab.org\/wp-content\/uploads\/2023\/10\/5.png 1200w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4abbf0e elementor-widget elementor-widget-text-editor\" data-id=\"4abbf0e\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>En esta\u00a0<strong>pr\u00e1ctica cloud<\/strong>\u00a0veremos como construir microservicios dentro de AWS siguiendo el paradigma serverless. Este tipo de soluci\u00f3n permite disponer de sistemas completamente administrados por AWS donde nosotros no deberemos preocuparnos por disponibilizar los recursos o administrarlos, simplemente especificaremos dentro de su configuraci\u00f3n las pol\u00edticas de ejecucion y escalado si se necesitasen, el pago por tanto es exclusivamente por uso.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a182dd1 elementor-widget elementor-widget-heading\" data-id=\"a182dd1\" data-element_type=\"widget\" id=\"objetivos\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Requisitos<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e272341 elementor-widget elementor-widget-text-editor\" data-id=\"e272341\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Para poder realizar esta pr\u00e1ctica deberemos disponer de las siguientes instalaciones que nos permitir\u00e1n poder desarrollar los microservicios y operar el entorno.<\/p><ul><li>Terraform: Desde donde crearemos y desplegaremos nuestro backend e infra.<\/li><li>Un usuario con credenciales de acceso al cli de AWS (access_key y secret_key) y permisos necesarios para operar los servicios empleados en la pr\u00e1ctica.<\/li><li>AWS cli v2: Permitir\u00e1 configurar los credenciales con aws configure, opcionalmente se pueden realizar exports del access_key y secret_key.<\/li><li>Un IDE en este caso visual-studio-code<\/li><li>Conocimiento b\u00e1sico en Api Rest y AWS<\/li><li>Postman<\/li><\/ul>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-7aaf8a9 elementor-widget elementor-widget-heading\" data-id=\"7aaf8a9\" data-element_type=\"widget\" id=\"overview\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Overview<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-84f6117 elementor-widget elementor-widget-text-editor\" data-id=\"84f6117\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Se plantea un escenario donde diferentes usuarios mediante aplicaciones multiplataforma acceden a diferentes recursos dentro de la app consumiendo una API Rest segura desplegada en AWS, para ello deber\u00e1n en primer lugar autenticarse contra el pool de cognito para obtener un token JWT que les permitir\u00e1 consumir los diferentes endpoints de la API.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3fb0f69 elementor-widget elementor-widget-image\" data-id=\"3fb0f69\" data-element_type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"851\" height=\"451\" data-src=\"https:\/\/www.bluetab.net\/wp-content\/uploads\/2021\/10\/overview-micro-serverless.png\" class=\"attachment-large size-large wp-image-12272 lazyload\" alt=\"\" data-srcset=\"https:\/\/www.bluetab.net\/wp-content\/uploads\/2021\/10\/overview-micro-serverless.png 851w, https:\/\/www.bluetab.net\/wp-content\/uploads\/2021\/10\/overview-micro-serverless-300x159.png 300w, https:\/\/www.bluetab.net\/wp-content\/uploads\/2021\/10\/overview-micro-serverless-768x407.png 768w\" data-sizes=\"(max-width: 851px) 100vw, 851px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 851px; --smush-placeholder-aspect-ratio: 851\/451;\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-76ac071 elementor-widget elementor-widget-heading\" data-id=\"76ac071\" data-element_type=\"widget\" id=\"autenticacion\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Autenticaci\u00f3n y Autorizaci\u00f3n<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-cffc795 elementor-widget elementor-widget-text-editor\" data-id=\"cffc795\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Para poder ofrecer seguridad a la API y que sus servicios solo sean consumidos por usuarios autorizados, debemos emplear un broker que nos pueda ofrecer autenticacion y a su vez autorizacion sobre estos servicios.<\/p><p>En primer lugar deberemos de entender el flujo que sigue un usuario para poder ser autenticado y autorizado para consumir un microservicio. En el siguiente diagrama se pueden ver como en una serie de pasos un usuario puede consumir el endpoint.<\/p><ol><li>El usuario se autentica mediante sus credenciales contra el broker.<\/li><li>Si los credenciales son correctos, el broker generara un token JWT que servir\u00eda como mecanismo de autorizaci\u00f3n al poder validar que el usuario es quien dice ser.<\/li><li>Este token deber\u00e1 emplearse en todas las llamadas a la API Rest, para ello se enviar\u00e1 en el header de Authorization junto a un prefijo Bearer.<\/li><li>Si el token es validado por el broker, se le otorgar\u00e1 acceso al consumo del microservicio.<\/li><\/ol>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-46ab838 elementor-widget elementor-widget-image\" data-id=\"46ab838\" data-element_type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"630\" height=\"470\" data-src=\"https:\/\/www.bluetab.net\/wp-content\/uploads\/2021\/10\/jwt-flujo.png\" class=\"attachment-large size-large wp-image-12264 lazyload\" alt=\"\" data-srcset=\"https:\/\/www.bluetab.net\/wp-content\/uploads\/2021\/10\/jwt-flujo.png 630w, https:\/\/www.bluetab.net\/wp-content\/uploads\/2021\/10\/jwt-flujo-300x224.png 300w\" data-sizes=\"(max-width: 630px) 100vw, 630px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 630px; --smush-placeholder-aspect-ratio: 630\/470;\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-7194037 elementor-widget elementor-widget-text-editor\" data-id=\"7194037\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h3 id=\"%C2%BFque-es-jwt-o-json-web-token\"><strong>\u00bfQue es JWT o Json Web Token?<\/strong><\/h3><p>Json Web Token es un est\u00e1ndar abierto (RFC 7519) donde se define una forma aut\u00f3noma de asegurar integridad en los datos enviados gracias a que va firmada digitalmente con HMAC (firma simetrica &#8211; misma clave) o RSA(firma asimetrica &#8211; par de claves privada\/publica) y asi asegurar que el peticionario es una entidad segura. Adem\u00e1s estos tokens pueden estar encriptados adicionalmente para ocultar los reclamos a terceros. El escenario principal donde se emplea es en la autorizaci\u00f3n del peticionario.<\/p><p>Cada token JWT consta de tres partes separados por un \u201c.\u201d de la forma header.payload.signed codificados en base64 por separado.<\/p><p><strong>Header<\/strong>: Indica el tipo de token y su firma, en el caso de RS256 incluir\u00e1 el kid que identifica la clave p\u00fablica del emisor del Token que se empleara para verificar la firma. Mediante el iss del payload y el kid de la clave podremos ver en el navegador https:\/\/\/.well-known\/jwks.json la firma publica empleada para descifrar el token.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f885372 elementor-widget elementor-widget-image\" data-id=\"f885372\" data-element_type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"727\" height=\"247\" data-src=\"https:\/\/www.bluetab.net\/wp-content\/uploads\/2021\/10\/jwt-header.png\" class=\"attachment-large size-large wp-image-12266 lazyload\" alt=\"\" data-srcset=\"https:\/\/www.bluetab.net\/wp-content\/uploads\/2021\/10\/jwt-header.png 727w, https:\/\/www.bluetab.net\/wp-content\/uploads\/2021\/10\/jwt-header-300x102.png 300w\" data-sizes=\"(max-width: 727px) 100vw, 727px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 727px; --smush-placeholder-aspect-ratio: 727\/247;\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3fd4aa7 elementor-widget elementor-widget-text-editor\" data-id=\"3fd4aa7\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><strong>Payload<\/strong>: Contiene los claims que permiten verificar los atributos de la generaci\u00f3n del token: iss (emisor), aud (audience), exp( expiracion) y otros campos que se puedan a\u00f1adir adicionalmente para enviar informaci\u00f3n.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-cd4a49a elementor-widget elementor-widget-image\" data-id=\"cd4a49a\" data-element_type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"736\" height=\"585\" data-src=\"https:\/\/www.bluetab.net\/wp-content\/uploads\/2021\/10\/correo-borrado.png\" class=\"attachment-large size-large wp-image-12377 lazyload\" alt=\"\" data-srcset=\"https:\/\/www.bluetab.net\/wp-content\/uploads\/2021\/10\/correo-borrado.png 736w, https:\/\/www.bluetab.net\/wp-content\/uploads\/2021\/10\/correo-borrado-300x238.png 300w\" data-sizes=\"(max-width: 736px) 100vw, 736px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 736px; --smush-placeholder-aspect-ratio: 736\/585;\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-aa30bc3 elementor-widget elementor-widget-text-editor\" data-id=\"aa30bc3\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h3 id=\"aws-cognito\"><strong>AWS Cognito<\/strong><\/h3><p>Cognito es un servicio completamente administrado que ofrece autenticaci\u00f3n de usuarios para aplicaciones multiplataforma, adem\u00e1s permite el empleo de identidades federadas como Google, Amazon, Facebook, etc para su registro.<\/p><p>Los usuarios podr\u00e1n registrarse y loguearse contra un pool de usuarios que funciona como directorio de usuarios donde ser\u00e1n albergados los par\u00e1metros de autenticaci\u00f3n: email, password, n\u00famero de tel\u00e9fono, etc. Se ofrecen adem\u00e1s opciones de confirmaci\u00f3n de usuario mediante c\u00f3digo o enlace v\u00eda email o sms. Los usuarios autenticados recibir\u00e1n un token de acceso que podr\u00e1n emplear para recibir autorizaci\u00f3n a los microservicios de Api Gateway. Mediante otras opciones no planteadas en este caso de uso, se podr\u00e1 recibir credenciales temporales STS de AWS para acceder directamente a servicios AWS mediante la funci\u00f3n AssumeRoleWithWebIdentity mediante los pool de identidades.<\/p><p>Los usuarios emplearan la interfaz web de Cognito para autenticarse y recibir un c\u00f3digo que podr\u00e1n intercambiar por un token JWT que emplear\u00e1n como autorizaci\u00f3n en los microservicios desplegados en Api Gateway.<\/p><p>Empezaremos creando nuestro pool de usuarios.<\/p><ul><li>Asignaremos un nombre al pool.<\/li><li>A\u00f1adiremos el atributo de acceso y verificaci\u00f3n, en este caso email.<\/li><li>Definiremos como se realiza la verificaci\u00f3n: via enlace. Adem\u00e1s si se har\u00e1 por defecto via SNS \u201cCOGNITO_DEFAULT\u201d o via SES \u201cDEVELOPER\u201d.<\/li><li>La recuperaci\u00f3n de la cuenta se har\u00e1 v\u00eda el email verificado, siendo la prioridad 1, como maxima prioridad en caso de a\u00f1adir futuros m\u00e9todos opcionales.<\/li><\/ul>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3d847bb elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"3d847bb\" data-element_type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-python'>resource &quot;aws_cognito_user_pool&quot; &quot;user_pool&quot; {\n        name = var.cognito.user_pool_name\n        auto_verified_attributes = [&quot;email&quot;]\n        username_attributes = [&quot;email&quot;]\n\n        verification_message_template {\n            email_subject_by_link = &quot;APP Notification - Account Verification&quot;\n            email_message_by_link = &quot;Please click the link to verify your email address: {##VERIFY EMAIL##}\\n&lt;br&gt;&lt;br&gt;\\n&quot;\n            default_email_option = &quot;CONFIRM_WITH_LINK&quot;\n        }\n\n        email_configuration {\n                email_sending_account = &quot;COGNITO_DEFAULT&quot;\n        }\n\n        account_recovery_setting {\n            recovery_mechanism {\n            name = &quot;verified_email&quot;\n            priority =  1\n            }\n        }\n    } <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/bluetab.org\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9423609 elementor-widget elementor-widget-text-editor\" data-id=\"9423609\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Por otro lado, activaremos la interfaz propia de AWS a modo de pruebas para poder realizar el proceso de autenticado contra cognito sin tener que realizar un desarrollo del frontend propio.<\/p><ul><li>Indicamos que recibiremos un code para poder intercambiarlo por un token JWT, teniendo como scope el email.<\/li><li>El proveedor de identidad sera por default Cognito.<\/li><li>Indicaremos una url callback de prueba desde donde nos indicar\u00e1n el code dentro de la url de la forma \u201c?code=\u201d.<\/li><\/ul>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-8951fa4 elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"8951fa4\" data-element_type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-python'>resource &quot;aws_cognito_user_pool_client&quot; &quot;client&quot; {\n  name = var.cognito.app_client_name\n  user_pool_id = aws_cognito_user_pool.user_pool.id\n  supported_identity_providers = [&quot;COGNITO&quot;]\n  callback_urls = var.cognito.callback_urls\n  allowed_oauth_flows_user_pool_client = var.cognito.user_pool_client\n  allowed_oauth_flows = [&quot;code&quot;]\n  allowed_oauth_scopes = [&quot;openid&quot;,&quot;email&quot;]\n}\n\nresource &quot;aws_cognito_user_pool_domain&quot; &quot;main&quot; {\n  domain       = var.cognito.domain_name\n  user_pool_id = aws_cognito_user_pool.user_pool.id\n} <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/bluetab.org\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-bbd5bc2 elementor-widget elementor-widget-text-editor\" data-id=\"bbd5bc2\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h3 id=\"autorizaci%C3%B3n-de-los-microservicios\"><strong>Autorizaci\u00f3n de los microservicios<\/strong><\/h3><p>En Api Gateway configuraremos un autorizador que recibir\u00e1 el token JWT y comprobar\u00e1 la firma del token, como el emisor y audiencia a\u00f1adidos en los propios scopes. El proceso de comprobaci\u00f3n es autom\u00e1tico permitiendo el acceso directo al servicio si este es v\u00e1lido o denegando mediante un unauthorized la request.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c37ba82 elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"c37ba82\" data-element_type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-python'>resource &quot;aws_apigatewayv2_authorizer&quot; &quot;jwtAuth&quot; {\n  api_id           = aws_apigatewayv2_api.api.id\n  authorizer_type  = &quot;JWT&quot;\n  identity_sources = [&quot;$request.header.Authorization&quot;]\n  name             = var.api.jwt_authorizer_name\n\n  jwt_configuration {\n    audience = [aws_cognito_user_pool_client.client.id]\n    issuer   = &quot;https:\/\/${aws_cognito_user_pool.user_pool.endpoint}&quot;\n  }\n} <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/bluetab.org\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-24a80a2 elementor-widget elementor-widget-text-editor\" data-id=\"24a80a2\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h3 id=\"obtenci%C3%B3n-del-token-jwt\"><strong>Obtenci\u00f3n del token JWT<\/strong><\/h3><p>En primer lugar, deberemos abrir la interfaz proporcionada por Cognito para realizar los procesos de sign-up, sign-in. La podremos encontrar dentro de la consola de AWS, en el servicio de Cognito, dentro de la configuraci\u00f3n del cliente de aplicaci\u00f3n &#8220;Lanzar interfaz de usuario alojada&#8221;.<\/p><p>\u00a0 \u00a0 1. Procederemos a registrar un usuario<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3d42b38 elementor-widget elementor-widget-image\" data-id=\"3d42b38\" data-element_type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"524\" height=\"449\" data-src=\"https:\/\/www.bluetab.net\/wp-content\/uploads\/2021\/10\/signup.png\" class=\"attachment-large size-large wp-image-12276 lazyload\" alt=\"\" data-srcset=\"https:\/\/www.bluetab.net\/wp-content\/uploads\/2021\/10\/signup.png 524w, https:\/\/www.bluetab.net\/wp-content\/uploads\/2021\/10\/signup-300x257.png 300w\" data-sizes=\"(max-width: 524px) 100vw, 524px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 524px; --smush-placeholder-aspect-ratio: 524\/449;\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-41792ed elementor-widget elementor-widget-text-editor\" data-id=\"41792ed\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>\u00a0 \u00a0 2. Nos pedira que confirmemos el usuario a trav\u00e9s del enlace enviado a nuestra cuenta de correo introducida.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5fa5298 elementor-widget elementor-widget-image\" data-id=\"5fa5298\" data-element_type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"528\" height=\"333\" data-src=\"https:\/\/www.bluetab.net\/wp-content\/uploads\/2021\/10\/email-verification.png\" class=\"attachment-large size-large wp-image-12256 lazyload\" alt=\"\" data-srcset=\"https:\/\/www.bluetab.net\/wp-content\/uploads\/2021\/10\/email-verification.png 528w, https:\/\/www.bluetab.net\/wp-content\/uploads\/2021\/10\/email-verification-300x189.png 300w\" data-sizes=\"(max-width: 528px) 100vw, 528px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 528px; --smush-placeholder-aspect-ratio: 528\/333;\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e0dccae elementor-widget elementor-widget-text-editor\" data-id=\"e0dccae\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>\u00a0 \u00a0 3. El correo recibido tendr\u00e1 la siguiente forma:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-20742da elementor-widget elementor-widget-image\" data-id=\"20742da\" data-element_type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"691\" height=\"184\" data-src=\"https:\/\/www.bluetab.net\/wp-content\/uploads\/2021\/10\/email.png\" class=\"attachment-large size-large wp-image-12258 lazyload\" alt=\"\" data-srcset=\"https:\/\/www.bluetab.net\/wp-content\/uploads\/2021\/10\/email.png 691w, https:\/\/www.bluetab.net\/wp-content\/uploads\/2021\/10\/email-300x80.png 300w\" data-sizes=\"(max-width: 691px) 100vw, 691px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 691px; --smush-placeholder-aspect-ratio: 691\/184;\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a7eef52 elementor-widget elementor-widget-text-editor\" data-id=\"a7eef52\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>\u00a0 \u00a0 4. Accedemos al enlace de <em>VERIFY EMAIL<\/em><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a13a2d0 elementor-widget elementor-widget-image\" data-id=\"a13a2d0\" data-element_type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"608\" height=\"222\" data-src=\"https:\/\/www.bluetab.net\/wp-content\/uploads\/2021\/10\/email-verification-end.png\" class=\"attachment-large size-large wp-image-12254 lazyload\" alt=\"\" data-srcset=\"https:\/\/www.bluetab.net\/wp-content\/uploads\/2021\/10\/email-verification-end.png 608w, https:\/\/www.bluetab.net\/wp-content\/uploads\/2021\/10\/email-verification-end-300x110.png 300w\" data-sizes=\"(max-width: 608px) 100vw, 608px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 608px; --smush-placeholder-aspect-ratio: 608\/222;\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-7ef8db0 elementor-widget elementor-widget-text-editor\" data-id=\"7ef8db0\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>\u00a0 \u00a0 5. Finalmente tendremos ya nuestro usuario confirmado en nuestro pool de usuarios de Cognito.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-8e9585b elementor-widget elementor-widget-image\" data-id=\"8e9585b\" data-element_type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"795\" height=\"106\" data-src=\"https:\/\/www.bluetab.net\/wp-content\/uploads\/2021\/10\/user-pool.png\" class=\"attachment-large size-large wp-image-12280 lazyload\" alt=\"\" data-srcset=\"https:\/\/www.bluetab.net\/wp-content\/uploads\/2021\/10\/user-pool.png 795w, https:\/\/www.bluetab.net\/wp-content\/uploads\/2021\/10\/user-pool-300x40.png 300w, https:\/\/www.bluetab.net\/wp-content\/uploads\/2021\/10\/user-pool-768x102.png 768w\" data-sizes=\"(max-width: 795px) 100vw, 795px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 795px; --smush-placeholder-aspect-ratio: 795\/106;\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-06eb759 elementor-widget elementor-widget-text-editor\" data-id=\"06eb759\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>\u00a0 \u00a0 6. Procedemos a logearnos en la interfaz de AWs empleada anteriormente y si los credenciales son correctos nos devolver\u00e1 a la url de callback configurada cuando hemos creado el pool de usuarios con Terraform junto a un code que emplearemos posteriormente para obtener el token.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b1437cf elementor-widget elementor-widget-image\" data-id=\"b1437cf\" data-element_type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"647\" height=\"35\" data-src=\"https:\/\/www.bluetab.net\/wp-content\/uploads\/2021\/10\/callback.png\" class=\"attachment-large size-large wp-image-12250 lazyload\" alt=\"\" data-srcset=\"https:\/\/www.bluetab.net\/wp-content\/uploads\/2021\/10\/callback.png 647w, https:\/\/www.bluetab.net\/wp-content\/uploads\/2021\/10\/callback-300x16.png 300w\" data-sizes=\"(max-width: 647px) 100vw, 647px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 647px; --smush-placeholder-aspect-ratio: 647\/35;\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-528f116 elementor-widget elementor-widget-text-editor\" data-id=\"528f116\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<ol start=\"7\"><li>Por \u00faltimo, para poder obtener el token debemos realizar una llamada al endpoint de Cognito\u00a0<em>\/oauth2\/token<\/em>\u00a0con los siguientes atributos en el body.<\/li><\/ol><ul><li>Metodo POST<\/li><li>Body<ul><li>Aplicacion x-www-form-urlencoded.<\/li><li>Grant_type: authorization_code.<\/li><li>Client_id: tu id de la aplicaci\u00f3n de Cognito.<\/li><li>Redirect_uri: url callback.<\/li><li>Code: c\u00f3digo obtenido en la url de callback despu\u00e9s de \u201c?code=\u201d<\/li><\/ul><\/li><\/ul><p>Obtendremos como respuesta el identity token (id_token) que contiene toda la informacion personal del usuario y es el que generalmente se emplear\u00e1 para la autorizaci\u00f3n y el access_token empleado principalmente para llamar a servicios externos sin incluir informacion personal del usuario. Dependiendo del caso de uso, si realmente la informaci\u00f3n aportada por el identity token no es necesaria, es recomendable emplear el access_token. Por ultimo el refresh token, se emplea principalmente para obtener un identity o access tokens nuevos.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e92efe3 elementor-widget elementor-widget-image\" data-id=\"e92efe3\" data-element_type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"1024\" height=\"409\" data-src=\"https:\/\/www.bluetab.net\/wp-content\/uploads\/2021\/10\/token-1024x409.png\" class=\"attachment-large size-large wp-image-12278 lazyload\" alt=\"\" data-srcset=\"https:\/\/www.bluetab.net\/wp-content\/uploads\/2021\/10\/token-1024x409.png 1024w, https:\/\/www.bluetab.net\/wp-content\/uploads\/2021\/10\/token-300x120.png 300w, https:\/\/www.bluetab.net\/wp-content\/uploads\/2021\/10\/token-768x307.png 768w, https:\/\/www.bluetab.net\/wp-content\/uploads\/2021\/10\/token-1536x613.png 1536w, https:\/\/www.bluetab.net\/wp-content\/uploads\/2021\/10\/token.png 1794w\" data-sizes=\"(max-width: 1024px) 100vw, 1024px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1024px; --smush-placeholder-aspect-ratio: 1024\/409;\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e3ab759 elementor-widget elementor-widget-text-editor\" data-id=\"e3ab759\" data-element_type=\"widget\" id=\"Microservicios\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h2 id=\"microservicios\"><strong>Microservicios<\/strong><\/h2><p>Los microservicios seran desplegados en Api Gateway y tendr\u00e1n como backend Lambda integrada como proxy y DynamoDB como bbdd. Todos estos servicios funcionan de forma completamente administrada siguiendo los objetivos serverless de esta pr\u00e1ctica.<\/p><p>Vamos a definir brevemente estos servicios y ver cual es su papel dentro de la arquitectura.<\/p><h3 id=\"aws-api-gateway-v2\"><strong><br \/>AWS Api Gateway v2<\/strong><\/h3><p>Mediante Api Gateway podremos desarrollar APIs de una forma sencilla, segura y escalable, ademas de ofrecernos la integraci\u00f3n con Lambda para poder operar sin aprovisionamiento. Solo funciona con HTTPs<\/p><p>Dispone de integraci\u00f3n proxy para exponer por completo el request como input al backend. En el caso concreto del workshop se emplear\u00e1 Lambda Proxy Integration para poder consumir los par\u00e1metros desde el handler de la funci\u00f3n v\u00eda el evento, para ello deberemos definir en la etapa de implementaci\u00f3n POST como tipo, independientemente de que definamos el metodo HTTP del endpoint como GET.<\/p><p>Api Gateway es compatible con CloudFront como de CDN de la API, adem\u00e1s es posible incorporar WAF como servicio de mitigaci\u00f3n de ataques DDoS.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5a96884 elementor-widget elementor-widget-image\" data-id=\"5a96884\" data-element_type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"451\" height=\"191\" data-src=\"https:\/\/www.bluetab.net\/wp-content\/uploads\/2021\/10\/api-gateway.png\" class=\"attachment-large size-large wp-image-12246 lazyload\" alt=\"\" data-srcset=\"https:\/\/www.bluetab.net\/wp-content\/uploads\/2021\/10\/api-gateway.png 451w, https:\/\/www.bluetab.net\/wp-content\/uploads\/2021\/10\/api-gateway-300x127.png 300w\" data-sizes=\"(max-width: 451px) 100vw, 451px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 451px; --smush-placeholder-aspect-ratio: 451\/191;\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a61428a elementor-widget elementor-widget-text-editor\" data-id=\"a61428a\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>AWS actualmente dispone de dos versiones de Api Gateway, nosotros desplegaremos la \u00faltima version, v2.<\/p><p>\u00bfQue diferencias podemos encontrar? Los principales cambios introducidos con la version 2, se basan en:<\/p><ul><li>Reducci\u00f3n de costes: 70%, 3.5$ vs 1$ por mill\u00f3n de peticiones.<\/li><li>Reducci\u00f3n de la latencia sobre el 50%.<\/li><li>Soporte a referencias cruzadas CORS.<\/li><li>JWT Authorizers a traves de OIDC y OAuth 2.0.<\/li><li>Disponible ruta y stages predeterminadas.<\/li><li>Integrado con SAM y CloudFormation.<\/li><\/ul><p>Para poder crear nuestra Api deberemos crear los siguientes recursos<\/p><ul><li>Api: indicando el nombre y su protocolo.<\/li><li>Un grupo de registros de Cloudwatch para la Api.<\/li><li>Un stage de implementaci\u00f3n donde indicaremos el nombre de la implementacion y los parametros de los logs.<\/li><\/ul>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5f752b4 elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"5f752b4\" data-element_type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-python'>resource &quot;aws_apigatewayv2_api&quot; &quot;api&quot; {\n  name          = var.api.api_name\n  protocol_type = &quot;HTTP&quot;\n}\n\nresource &quot;aws_cloudwatch_log_group&quot; &quot;api_gw&quot; {\n  name = &quot;\/aws\/api_gw\/${aws_apigatewayv2_api.api.name}&quot;\n  retention_in_days = 30\n}\n\nresource &quot;aws_apigatewayv2_stage&quot; &quot;stage&quot; {\n  api_id = aws_apigatewayv2_api.api.id\n\n  name        = var.api.stage_name\n  auto_deploy = true\n\n\n  access_log_settings {\n    destination_arn = aws_cloudwatch_log_group.api_gw.arn\n\n    format = jsonencode({\n      requestId               = &quot;$context.requestId&quot;\n      sourceIp                = &quot;$context.identity.sourceIp&quot;\n      requestTime             = &quot;$context.requestTime&quot;\n      protocol                = &quot;$context.protocol&quot;\n      httpMethod              = &quot;$context.httpMethod&quot;\n      resourcePath            = &quot;$context.resourcePath&quot;\n      routeKey                = &quot;$context.routeKey&quot;\n      status                  = &quot;$context.status&quot;\n      responseLength          = &quot;$context.responseLength&quot;\n      integrationErrorMessage = &quot;$context.integrationErrorMessage&quot;\n    }\n    )\n  }\n} <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/bluetab.org\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0ec2677 elementor-widget elementor-widget-text-editor\" data-id=\"0ec2677\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Una vez creada la Api, crearemos los dos endpoints que emplearemos en este workshop: GET,POST<\/p><p>Para ambos indicaremos:<\/p><ul><li>Tipo de autorizaci\u00f3n: JWT<\/li><li>Tipo de integraci\u00f3n AWS_PROXY, para recibir integramente en la funcion lambda la request<\/li><li>Metodo de integraci\u00f3n sera POST aun cuando el m\u00e9todo del endpoint se declare como GET, ya que\u00a0<em>Lambda solo se activa a traves de peticiones POST<\/em>.<\/li><li>Id del autorizador creado jwtAuth que tendr\u00e1 como audience el id de la aplicaci\u00f3n Cognito creada y su endpoint como issuer.<\/li><li>Se crear\u00e1 adem\u00e1s un permiso de ejecuci\u00f3n de la funci\u00f3n Lambda especificada para su ejecuci\u00f3n por parte de ApiGateway<\/li><\/ul><p>\u00a0<\/p><p><em>GET<\/em><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-7c7d212 elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"7c7d212\" data-element_type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-python'>#### GET\nresource &quot;aws_apigatewayv2_integration&quot; &quot;get_item_app_integration&quot; {\n  api_id           = aws_apigatewayv2_api.api.id\n  integration_type = &quot;AWS_PROXY&quot;\n  description               = &quot;Lambda GET example&quot;\n  integration_method        = &quot;POST&quot;\n  integration_uri           = aws_lambda_function.get_item_app.invoke_arn\n}\n\nresource &quot;aws_apigatewayv2_route&quot; &quot;get_item_app_route&quot; {\n  api_id = aws_apigatewayv2_api.api.id\n\n  route_key = &quot;GET \/user&quot;\n  target    = &quot;integrations\/${aws_apigatewayv2_integration.get_item_app_integration.id}&quot;\n  authorization_type = &quot;JWT&quot;\n  authorizer_id = aws_apigatewayv2_authorizer.jwtAuth.id\n}\n\nresource &quot;aws_lambda_permission&quot; &quot;get_item_app_execution&quot; {\n  statement_id  = &quot;AllowExecutionFromAPIGateway&quot;\n  action        = &quot;lambda:InvokeFunction&quot;\n  function_name = aws_lambda_function.get_item_app.function_name\n  principal     = &quot;apigateway.amazonaws.com&quot;\n  source_arn = &quot;${aws_apigatewayv2_api.api.execution_arn}\/*\/*&quot;\n} <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/bluetab.org\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1376c0d elementor-widget elementor-widget-text-editor\" data-id=\"1376c0d\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><em>POST<\/em><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-8fb10e6 elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"8fb10e6\" data-element_type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-python'>resource &quot;aws_apigatewayv2_integration&quot; &quot;create_item_app_integration&quot; {\n  api_id           = aws_apigatewayv2_api.api.id\n  integration_type = &quot;AWS_PROXY&quot;\n  description               = &quot;Lambda example&quot;\n  integration_method        = &quot;POST&quot;\n  integration_uri           = aws_lambda_function.create_item_app.invoke_arn\n}\n\nresource &quot;aws_apigatewayv2_route&quot; &quot;create_item_app_route&quot; {\n  api_id = aws_apigatewayv2_api.api.id\n\n  route_key = &quot;POST \/user&quot;\n  target    = &quot;integrations\/${aws_apigatewayv2_integration.create_item_app_integration.id}&quot;\n  authorization_type = &quot;JWT&quot;\n  authorizer_id = aws_apigatewayv2_authorizer.jwtAuth.id\n}\n\nresource &quot;aws_lambda_permission&quot; &quot;create_item_app_execution&quot; {\n  statement_id  = &quot;AllowExecutionFromAPIGateway&quot;\n  action        = &quot;lambda:InvokeFunction&quot;\n  function_name = aws_lambda_function.create_item_app.function_name\n  principal     = &quot;apigateway.amazonaws.com&quot;\n  source_arn = &quot;${aws_apigatewayv2_api.api.execution_arn}\/*\/*&quot;\n} <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/bluetab.org\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-7dbbbf5 elementor-widget elementor-widget-text-editor\" data-id=\"7dbbbf5\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h3 id=\"aws-lambda\"><strong>AWS Lambda<\/strong><\/h3><p>Para el desarrollo de la l\u00f3gica de nuestros microservicios emplearemos AWS Lambda, servicio de computaci\u00f3n completamente administrado con escalado autom\u00e1tico. Donde se definen unos recursos de memoria y CPU para realizar la ejecuci\u00f3n de cada funci\u00f3n. Soporta de forma nativa lenguajes como Java, NodeJS, Python, etc. Las funciones son albergadas en un paquete de implementaci\u00f3n del tipo zip alojadas en un bucket de S3 interno o creado por nosotros.<\/p><p>\u00a0<\/p><p>En primer lugar, crearemos el rol de ejecuci\u00f3n, donde adem\u00e1s definiremos que acciones se pueden ejecutar dentro de estas y sobre que servicios, en nuestro caso simplemente permitiremos acciones CRUD sobre la tabla DynamoDB especifica que crearemos posteriormente.<\/p><ul><li>Crearemos el rol de Lambda y daremos permisos al servicio de Lambda para asumirlo<\/li><li>Crearemos dos pol\u00edticas b\u00e1sicas que ser\u00e1n asignadas a este rol: ejecuci\u00f3n (permiso para cargar registros en CloudWatch) y una segunda pol\u00edtica custom donde estar\u00e1n definidas las acciones que podr\u00e1n realizarse sobre la tabla de DynamoDb empleada para el workshop.<\/li><\/ul>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f2b0cd8 elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"f2b0cd8\" data-element_type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-python'>resource &quot;aws_iam_role&quot; &quot;lambda_exec_dev&quot; {\n  name = &quot;serverless_lambda_dev&quot;\n\n  assume_role_policy = jsonencode({\n    Version = &quot;2012-10-17&quot;\n    Statement = [{\n      Action = &quot;sts:AssumeRole&quot;\n      Effect = &quot;Allow&quot;\n      Sid    = &quot;&quot;\n      Principal = {\n        Service = &quot;lambda.amazonaws.com&quot;\n      }\n    }\n    ]\n  })\n}\n\nresource &quot;aws_iam_role_policy_attachment&quot; &quot;lambda_policy_attachment_dev&quot; {\n  role       = aws_iam_role.lambda_exec_dev.name\n  policy_arn = &quot;arn:aws:iam::aws:policy\/service-role\/AWSLambdaBasicExecutionRole&quot;\n}\n\nresource &quot;aws_iam_role_policy_attachment&quot; &quot;lambda_dynamodb_policy_attachment_dev&quot; {\n  role       = aws_iam_role.lambda_exec_dev.name\n  policy_arn = aws_iam_policy.lambda_dynamodb_policy_dev.arn\n}\n\nresource &quot;aws_iam_policy&quot; &quot;lambda_dynamodb_policy_dev&quot; {\n  name        = &quot;lambda_dynamodb_policy_dev&quot;\n  description = &quot;Lambda DynamoDB access&quot;\n\n  policy = jsonencode({\n    Version = &quot;2012-10-17&quot;\n    Statement = [\n      {\n        Action = [\n          &quot;dynamodb:Query&quot;,\n          &quot;dynamodb:GetItem&quot;,\n          &quot;dynamodb:PutItem&quot;,\n          &quot;dynamodb:UpdateItem&quot;,\n          &quot;dynamodb:BatchWriteItem&quot;,\n          &quot;dynamodb:BatchGetItem&quot;,\n        ]\n        Effect   = &quot;Allow&quot;\n        Resource = [aws_dynamodb_table.app_table.arn]\n      },\n    ]\n  })\n  depends_on = [aws_dynamodb_table.app_table]\n} <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/bluetab.org\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-46dd642 elementor-widget elementor-widget-text-editor\" data-id=\"46dd642\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Las funciones ir\u00e1n recogidas en un zip con el codigo Python que ser\u00e1 subido a un bucket interno que crearemos expresamente para albergarlas. En cada funci\u00f3n indicaremos su handler, runtime, rol de ejecuci\u00f3n y el bucket\/objeto donde poder encontrar el paquete de funciones.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-13ebbf6 elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"13ebbf6\" data-element_type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-python'>data &quot;archive_file&quot; &quot;lambda_functions_package&quot; {\n  type = &quot;zip&quot;\n\n  source_dir  = &quot;${path.module}\/scripts\/&quot;\n  output_path = &quot;${path.module}\/scripts\/crud_lambdas.zip&quot;\n}\n\nresource &quot;aws_s3_bucket_object&quot; &quot;lambda_functions_package_object&quot; {\n  bucket = aws_s3_bucket.internal_dev.bucket\n  key    = &quot;crud_lambdas.zip&quot;\n  source = data.archive_file.lambda_functions_package.output_path\n  etag = filemd5(data.archive_file.lambda_functions_package.output_path)\n}\n\nresource &quot;aws_s3_bucket&quot; &quot;internal_dev&quot; {\n  bucket = var.bucket_name\n  acl    = &quot;private&quot;\n} <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/bluetab.org\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-564441d elementor-widget elementor-widget-text-editor\" data-id=\"564441d\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Para su creacion simplemente indicaremos el nombre de la funci\u00f3n Lambda, rol de ejecuci\u00f3n, runtime, la funci\u00f3n de ejecuc\u00edon, el bucket y el zip donde estan alojadas.<\/p><ul><li>La funci\u00f3n\u00a0<em>get_item_app<\/em>\u00a0nos devolvera el usuario buscado por id.<\/li><li>La funci\u00f3n\u00a0<em>create_item_app<\/em>\u00a0permitira guardar el usuario en bbdd.<\/li><\/ul>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a560225 elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"a560225\" data-element_type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-python'>resource &quot;aws_lambda_function&quot; &quot;get_item_app&quot; {\n  function_name = &quot;get_user&quot;\n  handler       = &quot;get_user.lambda_handler&quot;\n  runtime       = &quot;python3.6&quot;\n\n  s3_bucket = aws_s3_bucket.internal_dev.bucket\n  s3_key    = aws_s3_bucket_object.lambda_functions_package_object.key\n  source_code_hash = data.archive_file.lambda_functions_package.output_base64sha256\n  role = aws_iam_role.lambda_exec_dev.arn\n}\n\nresource &quot;aws_lambda_function&quot; &quot;create_item_app&quot; {\n  function_name = &quot;create_user&quot;\n  handler       = &quot;create_user.lambda_handler&quot;\n  runtime       = &quot;python3.6&quot;\n\n  s3_bucket = aws_s3_bucket.internal_dev.bucket\n  s3_key    = aws_s3_bucket_object.lambda_functions_package_object.key\n  source_code_hash = data.archive_file.lambda_functions_package.output_base64sha256\n  role = aws_iam_role.lambda_exec_dev.arn\n} <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/bluetab.org\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-91c1df6 elementor-widget elementor-widget-text-editor\" data-id=\"91c1df6\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Estas funciones Python emplear\u00e1n la librer\u00eda boto3 para poder realizar de una forma sencilla y r\u00e1pida el conector contra la tabla de DynamoDB, estar\u00e1n alojadas bajo el directorio de \/scrips.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a94f345 elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"a94f345\" data-element_type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-python'>dynamodb = boto3.resource(&#039;dynamodb&#039;)\ntable = dynamodb.Table(&#039;AppDummy&#039;) <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/bluetab.org\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f497db3 elementor-widget elementor-widget-text-editor\" data-id=\"f497db3\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>A partir de este conector mediante table.get_item() o table.create_item() podremos realizar nuestras operaciones GET y POST respectivamente. Si la acci\u00f3n se ejecuta correctamente lanzaremos un codigo 200 y devolveremos el objeto a\u00f1adido\/obtenido.<\/p><ul><li>En la funcion create_user obtendremos los atributos del body de la request que se encontrar\u00e1n en el propio evento al ser una funci\u00f3n integrada como AWS_PROXY.<\/li><\/ul>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-6ab09c7 elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"6ab09c7\" data-element_type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-python'>item = json.loads(event[&quot;body&quot;])\nuser = item[&quot;User&quot;]\n...\ntable = dynamodb.Table(&#039;AppDummy&#039;)\n    response = table.put_item(\n        Item=user\n    )\n... <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/bluetab.org\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1b5f4a4 elementor-widget elementor-widget-text-editor\" data-id=\"1b5f4a4\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<ul><li>En la funci\u00f3n get_user encontraremos el atributo de b\u00fasqueda\u00a0<em>UserId<\/em>\u00a0dentro del evento en \u201cqueryStringParameters\u201d.<\/li><\/ul>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-64b9f52 elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"64b9f52\" data-element_type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-python'>id = str(event[&quot;queryStringParameters&quot;][&#039;UserId&#039;])\n...\nresponse = table.get_item(\n        Key={\n            &#039;UserId&#039;: id\n        }\n    )\n... <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/bluetab.org\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-7b62bb6 elementor-widget elementor-widget-text-editor\" data-id=\"7b62bb6\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h3 id=\"aws-dynamodb\"><strong>AWS DynamoDB<\/strong><\/h3><p>Por \u00faltimo, crearemos una tabla b\u00e1sica para albergar los atributos de nuestros usuarios, tendr\u00e1 simplemente como PK el id de usuario en string para soportar alfanum\u00e9ricos.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1629f50 elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"1629f50\" data-element_type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-python'>resource &quot;aws_dynamodb_table&quot; &quot;app_table&quot; {\n  name           = &quot;AppDummy&quot;\n  billing_mode   = &quot;PAY_PER_REQUEST&quot;\n  hash_key       = &quot;UserId&quot;\n\n  attribute {\n    name = &quot;UserId&quot;\n    type = &quot;S&quot;\n  }\n} <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/bluetab.org\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-68fdf9a elementor-widget elementor-widget-text-editor\" data-id=\"68fdf9a\" data-element_type=\"widget\" id=\"despliegue\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h3 id=\"despliegue\"><strong>Despliegue<\/strong><\/h3><p>Mediante Terraform desplegaremos nuestra infraestructura, primero deberemos lanzar un\u00a0<em>init<\/em>\u00a0que descargar\u00e1 los plugins y inicializar\u00e1 nuestro directorio de trabajo con los archivos de configuraci\u00f3n de AWS, para posteriormente ejecutar un\u00a0<em>plan<\/em>, si el despliegue de recursos planificado por el\u00a0<em>plan<\/em>\u00a0concuerda con lo que buscamos finalmente ejecutaremos un\u00a0<em>apply<\/em>\u00a0para desplegar toda nuestra infra y realizar las pruebas.<\/p><p><em>En esta pr\u00e1ctica, nuestro estado permanecera en\u00a0<strong>local<\/strong>, no configuraremos AWS como backend para los estados de Terraform<\/em><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-790ed99 elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"790ed99\" data-element_type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-python'>terraform init\n\nterraform plan -var-file=&quot;env\/dev.tfvars&quot;\n\nterraform apply -var-file=&quot;env\/dev.tfvars&quot; <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/bluetab.org\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3332081 elementor-widget elementor-widget-text-editor\" data-id=\"3332081\" data-element_type=\"widget\" id=\"pruebas\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h3 id=\"pruebas\"><strong>Pruebas<\/strong><\/h3><p>Una vez desplegado nuestro proyecto, comprobaremos el correcto funcionamiento de los microservicios que hemos programado. Adem\u00e1s en ambos casos, deberemos a\u00f1adir el campo authorization en el header de la peticion HTTP con el prefijo Bearer y el access_token obtenido anteriormente para poder ser autorizados a consumir el microservicio.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-bb390d6 elementor-widget elementor-widget-image\" data-id=\"bb390d6\" data-element_type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"891\" height=\"128\" data-src=\"https:\/\/www.bluetab.net\/wp-content\/uploads\/2021\/10\/header-authorization.png\" class=\"attachment-large size-large wp-image-12262 lazyload\" alt=\"\" data-srcset=\"https:\/\/www.bluetab.net\/wp-content\/uploads\/2021\/10\/header-authorization.png 891w, https:\/\/www.bluetab.net\/wp-content\/uploads\/2021\/10\/header-authorization-300x43.png 300w, https:\/\/www.bluetab.net\/wp-content\/uploads\/2021\/10\/header-authorization-768x110.png 768w\" data-sizes=\"(max-width: 891px) 100vw, 891px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 891px; --smush-placeholder-aspect-ratio: 891\/128;\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-35fd11b elementor-widget elementor-widget-text-editor\" data-id=\"35fd11b\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><em>POST \/user<\/em><\/p><p>En primer lugar, probaremos la peticion HTTP POST \/user, deber\u00eda a\u00f1adir el usuario a la tabla de DynamoDB creada y enviando como respuesta un codigo 200 y el usuario a\u00f1adido a la tabla.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-eddf428 elementor-widget elementor-widget-image\" data-id=\"eddf428\" data-element_type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"1024\" height=\"404\" data-src=\"https:\/\/www.bluetab.net\/wp-content\/uploads\/2021\/10\/post-user-1024x404.png\" class=\"attachment-large size-large wp-image-12274 lazyload\" alt=\"\" data-srcset=\"https:\/\/www.bluetab.net\/wp-content\/uploads\/2021\/10\/post-user-1024x404.png 1024w, https:\/\/www.bluetab.net\/wp-content\/uploads\/2021\/10\/post-user-300x118.png 300w, https:\/\/www.bluetab.net\/wp-content\/uploads\/2021\/10\/post-user-768x303.png 768w, https:\/\/www.bluetab.net\/wp-content\/uploads\/2021\/10\/post-user.png 1318w\" data-sizes=\"(max-width: 1024px) 100vw, 1024px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1024px; --smush-placeholder-aspect-ratio: 1024\/404;\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-29b86df elementor-widget elementor-widget-text-editor\" data-id=\"29b86df\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><em>GET \/user<\/em><\/p><p>De la misma forma, consumiremos el microservicio que a partir del UserId nos devolver\u00e1 la informaci\u00f3n del usuario, recordando que al ser una petici\u00f3n GET la informaci\u00f3n relativa a la consulta ir\u00e1 en el Query Params (propia url)<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-97af423 elementor-widget elementor-widget-image\" data-id=\"97af423\" data-element_type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"1024\" height=\"409\" data-src=\"https:\/\/www.bluetab.net\/wp-content\/uploads\/2021\/10\/get-user-1024x409.png\" class=\"attachment-large size-large wp-image-12260 lazyload\" alt=\"\" data-srcset=\"https:\/\/www.bluetab.net\/wp-content\/uploads\/2021\/10\/get-user-1024x409.png 1024w, https:\/\/www.bluetab.net\/wp-content\/uploads\/2021\/10\/get-user-300x120.png 300w, https:\/\/www.bluetab.net\/wp-content\/uploads\/2021\/10\/get-user-768x307.png 768w, https:\/\/www.bluetab.net\/wp-content\/uploads\/2021\/10\/get-user.png 1315w\" data-sizes=\"(max-width: 1024px) 100vw, 1024px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1024px; --smush-placeholder-aspect-ratio: 1024\/409;\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-01852ba elementor-widget elementor-widget-heading\" data-id=\"01852ba\" data-element_type=\"widget\" id=\"conclusion\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Conclusi\u00f3n<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-acd7863 elementor-widget elementor-widget-text-editor\" data-id=\"acd7863\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>En esta pr\u00e1ctica hemos podido aprender a como desarrollar una API Rest segura y completamente administrada dentro del entorno de AWS, sirviendonos de la \u00faltima versi\u00f3n de Api Gateway que facilita la integraci\u00f3n nativa con autorizadores de JWT.<\/p><p>La integraci\u00f3n de Cognito con Api Gateway nos torga la capa de seguridad y administraci\u00f3n de los usuarios. Respectivamente con Lambda y DynamoDB disponemos de la capa de l\u00f3gica\/persistencia de nuestra API. La integraci\u00f3n nativa de todos estos servicios nos facilita el desarrollo de estas aplicaciones al disminuir la carga de trabajo dedicada tanto al desarrollo puro, como a la integracion de los distintos servicios involucrados y su administraci\u00f3n, adem\u00e1s gracias a Terraform disponemos de toda la infraestructura como c\u00f3digo facilitando su futura evoluci\u00f3n y disponibilizaci\u00f3n en otros entornos de una forma mucho m\u00e1s r\u00e1pida y comprensible.<\/p><p>En futuras entradas veremos como desarrollar otros escenarios t\u00edpicos que podemos encontrar en nuestro d\u00eda a d\u00eda dentro de AWS, con el fin de tener unas primeras herramientas para poder solventar futuros escenarios que se nos planteen.<\/p><p>Espero que la pr\u00e1ctica haya sido de vuestro agrado e inter\u00e9s, os espero en futuras entregas!<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-52858fe elementor-widget elementor-widget-text-editor\" data-id=\"52858fe\" data-element_type=\"widget\" id=\"enlaces\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h3 id=\"enlaces-de-inter%C3%A9s\"><strong>Enlaces de inter\u00e9s<\/strong><\/h3><ul><li><a href=\"https:\/\/docs.aws.amazon.com\/es_es\/cognito\/latest\/developerguide\/what-is-amazon-cognito.html\">Documentaci\u00f3n general de Cognito<\/a>.<\/li><li><a href=\"https:\/\/docs.aws.amazon.com\/es_es\/apigateway\/latest\/developerguide\/welcome.html\">Documentaci\u00f3n general de Api Gateway<\/a>.<\/li><li><a href=\"https:\/\/docs.aws.amazon.com\/es_es\/lambda\/latest\/dg\/welcome.html\">Documentaci\u00f3n general de Lambda<\/a>.<\/li><li><a href=\"https:\/\/docs.aws.amazon.com\/es_es\/amazondynamodb\/latest\/developerguide\/Introduction.html\">Documentaci\u00f3n general de DynamoDB<\/a>.<\/li><li><a href=\"https:\/\/jwt.io\/introduction\">Documentaci\u00f3n general de JWT<\/a>.<\/li><\/ul>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-65c3381 elementor-widget elementor-widget-spacer\" data-id=\"65c3381\" data-element_type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-f668113 nav-column elementor-hidden-phone\" data-id=\"f668113\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-0508221 nav-post elementor-widget elementor-widget-text-editor\" data-id=\"0508221\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h6><strong>Navegaci\u00f3n<\/strong><\/h6><p><a href=\"#introduccion\">Introducci\u00f3n<\/a><\/p><p><a href=\"#objetivos\">Requisitos<\/a><\/p><p><a href=\"#overview\">Overview<\/a><\/p><p><a href=\"#autenticacion\">Autenticaci\u00f3n y Autorizaci\u00f3n<\/a><\/p><p><a href=\"#microservicios\">Microservicios<\/a><\/p><p><a href=\"#despliegue\">Despliegue<\/a><\/p><p><a href=\"#pruebas\">Pruebas<\/a><\/p><p><a href=\"#conclusion\">Conclusi\u00f3n<\/a><\/p><p><a href=\"#enlaces\">Enlaces de inter\u00e9s<\/a><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-09395a3 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"09395a3\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-2ba3c08\" data-id=\"2ba3c08\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-f18d1b8 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"f18d1b8\" data-element_type=\"section\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-inner-column elementor-element elementor-element-b490454\" data-id=\"b490454\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-a76f07c elementor-widget elementor-widget-heading\" data-id=\"a76f07c\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h5 class=\"elementor-heading-title elementor-size-default\">\u00bfQuieres saber m\u00e1s de lo que ofrecemos y ver otros casos de \u00e9xito?<\/h5>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-7365ecc elementor-align-center elementor-widget elementor-widget-button\" data-id=\"7365ecc\" data-element_type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-button-wrapper\">\n\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-sm\" href=\"\/es\/\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">DESCUBRE BLUETAB<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-7a7e9b1 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"7a7e9b1\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-0225831\" data-id=\"0225831\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap\">\n\t\t\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-816937f\" data-id=\"816937f\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-756365e elementor-share-buttons--view-icon elementor-share-buttons--skin-minimal elementor-share-buttons--shape-circle elementor-grid-0 elementor-share-buttons--color-official elementor-widget elementor-widget-share-buttons\" data-id=\"756365e\" data-element_type=\"widget\" data-widget_type=\"share-buttons.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-grid\" role=\"list\">\n\t\t\t\t\t\t\t\t<div class=\"elementor-grid-item\" role=\"listitem\">\n\t\t\t\t\t\t<div class=\"elementor-share-btn elementor-share-btn_twitter\" role=\"button\" tabindex=\"0\" aria-label=\"Share on twitter\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-share-btn__icon\">\n\t\t\t\t\t\t\t\t<i class=\"fab fa-twitter\" aria-hidden=\"true\"><\/i>\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-grid-item\" role=\"listitem\">\n\t\t\t\t\t\t<div class=\"elementor-share-btn elementor-share-btn_linkedin\" role=\"button\" tabindex=\"0\" aria-label=\"Share on linkedin\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-share-btn__icon\">\n\t\t\t\t\t\t\t\t<i class=\"fab fa-linkedin\" aria-hidden=\"true\"><\/i>\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-92da4e0 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"92da4e0\" data-element_type=\"section\" id=\"autor\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-873c04e\" data-id=\"873c04e\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-2c534ae elementor-position-left elementor-vertical-align-middle elementor-widget elementor-widget-image-box\" data-id=\"2c534ae\" data-element_type=\"widget\" data-widget_type=\"image-box.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"elementor-image-box-wrapper\"><figure class=\"elementor-image-box-img\"><a href=\"https:\/\/www.linkedin.com\/in\/francisco-linaje-024499175\/\" target=\"_blank\" tabindex=\"-1\"><img decoding=\"async\" width=\"150\" height=\"150\" data-src=\"https:\/\/www.bluetab.net\/wp-content\/uploads\/2021\/10\/Francisco-150x150.jpg\" class=\"attachment-thumbnail size-thumbnail wp-image-12383 lazyload\" alt=\"\" data-srcset=\"https:\/\/bluetab.org\/wp-content\/uploads\/2021\/10\/Francisco-150x150.jpg 150w, https:\/\/bluetab.org\/wp-content\/uploads\/2021\/10\/Francisco-300x300.jpg 300w, https:\/\/bluetab.org\/wp-content\/uploads\/2021\/10\/Francisco-75x75.jpg 75w, https:\/\/bluetab.org\/wp-content\/uploads\/2021\/10\/Francisco.jpg 384w\" data-sizes=\"(max-width: 150px) 100vw, 150px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 150px; --smush-placeholder-aspect-ratio: 150\/150;\" \/><\/a><\/figure><div class=\"elementor-image-box-content\"><h4 class=\"elementor-image-box-title\"><a href=\"https:\/\/www.linkedin.com\/in\/francisco-linaje-024499175\/\" target=\"_blank\">Francisco Linaje<\/a><\/h4><p class=\"elementor-image-box-description\">AWS Solutions Architect<\/p><\/div><\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-8a3a205\" data-id=\"8a3a205\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap\">\n\t\t\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-e6097d2 elementor-section-full_width elementor-section-height-default elementor-section-height-default\" data-id=\"e6097d2\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-a66a650\" data-id=\"a66a650\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-38e61b8 elementor-widget elementor-widget-text-editor\" data-id=\"38e61b8\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><b>SOLUCIONES, <\/b>SOMOS EXPERTOS<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-9975abb elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"9975abb\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-e5edefb\" data-id=\"e5edefb\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-0628f91 elementor-cta--skin-cover elementor-cta--valign-middle elementor-animated-content elementor-bg-transform elementor-bg-transform-zoom-in elementor-widget elementor-widget-call-to-action\" data-id=\"0628f91\" data-element_type=\"widget\" data-widget_type=\"call-to-action.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<a class=\"elementor-cta\" href=\"\/es\/soluciones\/data-strategy\/\">\n\t\t\t\t\t<div class=\"elementor-cta__bg-wrapper\">\n\t\t\t\t<div class=\"elementor-cta__bg elementor-bg lazyload\" style=\"background-image:inherit;\" role=\"img\" aria-label=\"strategy-opt\" data-bg-image=\"url(https:\/\/www.bluetab.net\/wp-content\/uploads\/2020\/10\/strategy-opt.jpg)\"><\/div>\n\t\t\t\t<div class=\"elementor-cta__bg-overlay\"><\/div>\n\t\t\t<\/div>\n\t\t\t\t\t\t\t<div class=\"elementor-cta__content\">\n\t\t\t\t\n\t\t\t\t\t\t\t\t\t<h5 class=\"elementor-cta__title elementor-cta__content-item elementor-content-item elementor-animated-item--grow\">\n\t\t\t\t\t\tDATA STRATEGY\t\t\t\t\t<\/h5>\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-8724c63\" data-id=\"8724c63\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-bc8b25d elementor-cta--skin-cover elementor-cta--valign-middle elementor-animated-content elementor-bg-transform elementor-bg-transform-zoom-in elementor-widget elementor-widget-call-to-action\" data-id=\"bc8b25d\" data-element_type=\"widget\" data-widget_type=\"call-to-action.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<a class=\"elementor-cta\" href=\"\/es\/soluciones\/data-fabric\/\">\n\t\t\t\t\t<div class=\"elementor-cta__bg-wrapper\">\n\t\t\t\t<div class=\"elementor-cta__bg elementor-bg lazyload\" style=\"background-image:inherit;\" role=\"img\" aria-label=\"fabric-opt\" data-bg-image=\"url(https:\/\/www.bluetab.net\/wp-content\/uploads\/2020\/10\/fabric-opt.jpg)\"><\/div>\n\t\t\t\t<div class=\"elementor-cta__bg-overlay\"><\/div>\n\t\t\t<\/div>\n\t\t\t\t\t\t\t<div class=\"elementor-cta__content\">\n\t\t\t\t\n\t\t\t\t\t\t\t\t\t<h5 class=\"elementor-cta__title elementor-cta__content-item elementor-content-item elementor-animated-item--grow\">\n\t\t\t\t\t\tDATA FABRIC\t\t\t\t\t<\/h5>\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-ddc996d\" data-id=\"ddc996d\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-1d384cf elementor-cta--skin-cover elementor-cta--valign-middle elementor-animated-content elementor-bg-transform elementor-bg-transform-zoom-in elementor-widget elementor-widget-call-to-action\" data-id=\"1d384cf\" data-element_type=\"widget\" data-widget_type=\"call-to-action.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<a class=\"elementor-cta\" href=\"\/es\/soluciones\/augmented-analytics\/\">\n\t\t\t\t\t<div class=\"elementor-cta__bg-wrapper\">\n\t\t\t\t<div class=\"elementor-cta__bg elementor-bg lazyload\" style=\"background-image:inherit;\" role=\"img\" aria-label=\"AUGMENTED-ANALYTICS-opt\" data-bg-image=\"url(https:\/\/www.bluetab.net\/wp-content\/uploads\/2020\/10\/AUGMENTED-ANALYTICS-opt.jpg)\"><\/div>\n\t\t\t\t<div class=\"elementor-cta__bg-overlay\"><\/div>\n\t\t\t<\/div>\n\t\t\t\t\t\t\t<div class=\"elementor-cta__content\">\n\t\t\t\t\n\t\t\t\t\t\t\t\t\t<h5 class=\"elementor-cta__title elementor-cta__content-item elementor-content-item elementor-animated-item--grow\">\n\t\t\t\t\t\tAUGMENTED ANALYTICS\t\t\t\t\t<\/h5>\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-f61bae8\" data-id=\"f61bae8\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-f3fe106 elementor-widget elementor-widget-text-editor\" data-id=\"f3fe106\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Te puede interesar<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Serverless Microservices Francisco Linaje AWS Solutions Architect Share on twitter Share on linkedin En esta&nbsp;pr\u00e1ctica cloud&nbsp;veremos como construir microservicios dentro de AWS siguiendo el paradigma serverless. Este tipo de soluci\u00f3n permite disponer de sistemas completamente administrados por AWS donde nosotros no deberemos preocuparnos por disponibilizar los recursos o administrarlos, simplemente especificaremos dentro de su configuraci\u00f3n [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":17826,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"elementor_header_footer","format":"standard","meta":{"inline_featured_image":false,"_uag_custom_page_level_css":"","_genesis_hide_title":false,"_genesis_hide_breadcrumbs":false,"_genesis_hide_singular_image":false,"_genesis_hide_footer_widgets":false,"_genesis_custom_body_class":"","_genesis_custom_post_class":"","_genesis_layout":"content-sidebar","footnotes":""},"categories":[19,668,633],"tags":[],"class_list":{"0":"post-12394","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-blog","8":"category-practices-en","9":"category-tech-en","10":"entry"},"uagb_featured_image_src":{"full":["https:\/\/bluetab.org\/wp-content\/uploads\/2023\/10\/5.png",1200,600,false],"thumbnail":["https:\/\/bluetab.org\/wp-content\/uploads\/2023\/10\/5-150x150.png",150,150,true],"medium":["https:\/\/bluetab.org\/wp-content\/uploads\/2023\/10\/5-300x150.png",300,150,true],"medium_large":["https:\/\/bluetab.org\/wp-content\/uploads\/2023\/10\/5-768x384.png",768,384,true],"large":["https:\/\/bluetab.org\/wp-content\/uploads\/2023\/10\/5-1024x512.png",1024,512,true],"1536x1536":["https:\/\/bluetab.org\/wp-content\/uploads\/2023\/10\/5.png",1200,600,false],"2048x2048":["https:\/\/bluetab.org\/wp-content\/uploads\/2023\/10\/5.png",1200,600,false],"sidebar-featured":["https:\/\/bluetab.org\/wp-content\/uploads\/2023\/10\/5-75x75.png",75,75,true],"genesis-singular-images":["https:\/\/bluetab.org\/wp-content\/uploads\/2023\/10\/5-702x526.png",702,526,true]},"uagb_author_info":{"display_name":"Bluetab","author_link":"https:\/\/bluetab.org\/en\/author\/user\/"},"uagb_comment_info":0,"uagb_excerpt":"Serverless Microservices Francisco Linaje AWS Solutions Architect Share on twitter Share on linkedin En esta&nbsp;pr\u00e1ctica cloud&nbsp;veremos como construir microservicios dentro de AWS siguiendo el paradigma serverless. Este tipo de soluci\u00f3n permite disponer de sistemas completamente administrados por AWS donde nosotros no deberemos preocuparnos por disponibilizar los recursos o administrarlos, simplemente especificaremos dentro de su configuraci\u00f3n&hellip;","_links":{"self":[{"href":"https:\/\/bluetab.org\/en\/wp-json\/wp\/v2\/posts\/12394","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bluetab.org\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/bluetab.org\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/bluetab.org\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/bluetab.org\/en\/wp-json\/wp\/v2\/comments?post=12394"}],"version-history":[{"count":1,"href":"https:\/\/bluetab.org\/en\/wp-json\/wp\/v2\/posts\/12394\/revisions"}],"predecessor-version":[{"id":12395,"href":"https:\/\/bluetab.org\/en\/wp-json\/wp\/v2\/posts\/12394\/revisions\/12395"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/bluetab.org\/en\/wp-json\/wp\/v2\/media\/17826"}],"wp:attachment":[{"href":"https:\/\/bluetab.org\/en\/wp-json\/wp\/v2\/media?parent=12394"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/bluetab.org\/en\/wp-json\/wp\/v2\/categories?post=12394"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/bluetab.org\/en\/wp-json\/wp\/v2\/tags?post=12394"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}