<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Diana Castro</title>
    <description>The latest articles on DEV Community by Diana Castro (@dcastrocordero22).</description>
    <link>https://dev.to/dcastrocordero22</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1876418%2Fe1e99ea5-7ed6-4e95-9551-0ebcb5468100.jpg</url>
      <title>DEV Community: Diana Castro</title>
      <link>https://dev.to/dcastrocordero22</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dcastrocordero22"/>
    <language>en</language>
    <item>
      <title>Diario de una builder: El camino hacia la orquestación de dos mundos</title>
      <dc:creator>Diana Castro</dc:creator>
      <pubDate>Mon, 18 May 2026 00:38:32 +0000</pubDate>
      <link>https://dev.to/aws-builders/diario-de-una-builder-el-camino-hacia-la-orquestacion-de-dos-mundos-4fd0</link>
      <guid>https://dev.to/aws-builders/diario-de-una-builder-el-camino-hacia-la-orquestacion-de-dos-mundos-4fd0</guid>
      <description>&lt;h1&gt;
  
  
  Aprender una segunda nube sin empezar desde cero
&lt;/h1&gt;

&lt;p&gt;En tecnología hay una verdad incómoda, pero también liberadora: nunca terminamos de dominar completamente un tema. Lo que sabías ayer puede quedar obsoleto mañana y, en el mundo de las nubes públicas, donde los servicios evolucionan constantemente, es prácticamente imposible conocer cada detalle de cada herramienta.&lt;/p&gt;

&lt;p&gt;Más que aspirar a saberlo todo, el verdadero enfoque está en comprender los fundamentos y especializarse en ciertos dominios. Se trata de reconocer qué servicios existen, para qué fueron diseñados y en qué escenarios aportan valor. Así, cuando enfrentas un problema real, no partes desde cero: sabes qué buscar y dónde apoyarte.&lt;/p&gt;




&lt;h2&gt;
  
  
  El reto de aprender otra nube
&lt;/h2&gt;

&lt;p&gt;Más que dominar una nube en su totalidad, el enfoque real está en el aprendizaje continuo y en desarrollar criterio técnico para entender cómo funcionan los servicios y cuándo utilizarlos.&lt;/p&gt;

&lt;p&gt;Y por esas oportunidades que da la vida —que se agradecen enormemente— terminé frente a un nuevo desafío: aprender una segunda nube.&lt;/p&gt;

&lt;p&gt;Un reto que impone respeto.&lt;br&gt;&lt;br&gt;
Que incluso puede generar cierta incertidumbre.&lt;br&gt;&lt;br&gt;
Pero que también expande la forma en que pensamos la arquitectura.&lt;/p&gt;

&lt;p&gt;La pregunta entonces fue:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;¿Cómo abordar este reto sin empezar completamente desde cero?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;La respuesta estuvo en reutilizar el conocimiento base.&lt;/p&gt;

&lt;p&gt;En lugar de aprender desde una hoja en blanco, comencé a buscar patrones, equivalencias y analogías:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Este servicio se parece a este otro.&lt;/li&gt;
&lt;li&gt;Esta solución resuelve un problema similar en otra nube.&lt;/li&gt;
&lt;li&gt;Este concepto cambia de nombre, pero no necesariamente de propósito.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Y sí, ese enfoque funciona… hasta que deja de funcionar.&lt;/p&gt;


&lt;h2&gt;
  
  
  Cuando las equivalencias dejan de ser suficientes
&lt;/h2&gt;

&lt;p&gt;El primer impulso al aprender una segunda nube es buscar traducciones directas entre servicios. Algo natural. Necesitamos referencias conocidas para orientarnos.&lt;/p&gt;

&lt;p&gt;Pero eventualmente llegan las diferencias importantes.&lt;/p&gt;

&lt;p&gt;Descubres que:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Los &lt;code&gt;Region Pairs&lt;/code&gt; en Azure abordan Disaster Recovery de una forma distinta.&lt;/li&gt;
&lt;li&gt;El modelo de identidad no se mapea &lt;code&gt;1:1&lt;/code&gt; con AWS.&lt;/li&gt;
&lt;li&gt;Las suposiciones sobre failover automático pueden estar completamente invertidas.&lt;/li&gt;
&lt;li&gt;La organización de recursos responde a filosofías diferentes.&lt;/li&gt;
&lt;li&gt;Incluso la forma de operar y navegar la plataforma cambia.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Y ahí ocurre algo interesante: dejas de intentar traducir una nube hacia la otra y comienzas a entender cómo piensa cada proveedor.&lt;/p&gt;

&lt;p&gt;Ese suele ser el punto donde realmente empieza el aprendizaje.&lt;/p&gt;


&lt;h2&gt;
  
  
  Lo más valioso no es memorizar servicios
&lt;/h2&gt;

&lt;p&gt;Con el tiempo entendí algo importante:&lt;/p&gt;

&lt;p&gt;Multi-cloud no significa saber más nombres de servicios.&lt;/p&gt;

&lt;p&gt;Significa desarrollar la capacidad de:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;identificar patrones,&lt;/li&gt;
&lt;li&gt;entender modelos operativos distintos,&lt;/li&gt;
&lt;li&gt;cuestionar supuestos,&lt;/li&gt;
&lt;li&gt;y diseñar aprovechando las fortalezas de cada nube.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Porque al final, la arquitectura no se trata de memorizar catálogos.&lt;br&gt;&lt;br&gt;
Se trata de criterio técnico.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Pro Tip&lt;/strong&gt; &lt;br&gt;
Multi-cloud no es saber más servicios. &lt;br&gt;
Es aprender a pensar diferente y &lt;br&gt;
diseñar sobre las fortalezas de cada nube.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  El modelo de responsabilidad compartida
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;(AWS Shared Responsibility Model &amp;amp; Azure Shared Responsibility Model)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;El modelo de responsabilidad compartida es conceptualmente el mismo en AWS y Azure: el proveedor asegura la infraestructura de la nube, mientras que el cliente es responsable de la configuración, los datos y el acceso.&lt;/p&gt;

&lt;p&gt;Sin embargo, aunque el principio es equivalente, su implementación varía según el nivel de abstracción del servicio y la filosofía de cada proveedor.&lt;/p&gt;

&lt;p&gt;A simple vista puede parecer un concepto sencillo… hasta que llegas a los detalles.&lt;/p&gt;

&lt;p&gt;Los valores por defecto, las configuraciones iniciales y la forma en que cada nube aplica sus controles no son idénticos. Y, como suele ocurrir en tecnología, el diablo está en los detalles.&lt;/p&gt;

&lt;p&gt;Podemos pensar en la clásica analogía de la casa:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;El proveedor construye la estructura.&lt;/li&gt;
&lt;li&gt;Garantiza que la infraestructura sea segura.&lt;/li&gt;
&lt;li&gt;Pero tú decides quién entra, qué permisos tiene y cómo proteges lo que guardas dentro.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;El problema es que no todas las casas vienen configuradas igual.&lt;/p&gt;

&lt;p&gt;Algunas plataformas habilitan más controles desde el inicio.&lt;br&gt;&lt;br&gt;
Otras requieren que el cliente los defina explícitamente.&lt;/p&gt;

&lt;p&gt;Y ahí es donde se vuelve evidente que, aunque el modelo sea el mismo en teoría, la implementación cambia significativamente en la práctica.&lt;/p&gt;

&lt;p&gt;Porque en multi-cloud no basta con entender &lt;em&gt;qué&lt;/em&gt; eres responsable de proteger.&lt;/p&gt;

&lt;p&gt;También necesitas entender:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;cómo cada proveedor interpreta esa responsabilidad,&lt;/li&gt;
&lt;li&gt;qué controles vienen habilitados por defecto,&lt;/li&gt;
&lt;li&gt;qué configuraciones requieren intervención manual,&lt;/li&gt;
&lt;li&gt;y qué supuestos de seguridad estás heredando sin darte cuenta.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ese suele ser uno de los primeros momentos donde descubres que aprender una segunda nube no es memorizar servicios… sino ajustar la manera en que piensas la seguridad.&lt;/p&gt;
&lt;h2&gt;
  
  
  Estructura de la nube
&lt;/h2&gt;

&lt;p&gt;Sería un error intentar definir equivalencias entre servicios sin comprender primero cómo está organizada cada nube. Antes de hablar de servicios, redes o seguridad, necesitamos entender la base sobre la que todo está construido.&lt;/p&gt;

&lt;p&gt;Porque aunque AWS y Azure comparten muchos conceptos, la forma en que estructuran su infraestructura refleja filosofías bastante distintas.&lt;/p&gt;

&lt;p&gt;Este recorrido no busca ser exhaustivo.&lt;br&gt;&lt;br&gt;
La idea es construir un mapa mental rápido que ayude a entender dónde empiezan las similitudes… y dónde aparecen las diferencias importantes.&lt;/p&gt;


&lt;h3&gt;
  
  
  Organización global
&lt;/h3&gt;

&lt;p&gt;A nivel global, Azure y AWS adoptan estrategias diferentes para organizar y aislar su infraestructura.&lt;/p&gt;

&lt;p&gt;En Azure, la organización global se basa en &lt;strong&gt;Geographies&lt;/strong&gt;, que agrupan múltiples regiones dentro de un mismo límite orientado principalmente a:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;cumplimiento normativo,&lt;/li&gt;
&lt;li&gt;residencia de datos,&lt;/li&gt;
&lt;li&gt;y latencia.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Estas geografías forman parte de un entorno altamente interconectado donde los servicios, la identidad y la gobernanza se gestionan de forma relativamente unificada.&lt;/p&gt;

&lt;p&gt;AWS, en cambio, estructura su organización global mediante &lt;strong&gt;Partitions&lt;/strong&gt;, que representan límites de aislamiento mucho más marcados tanto a nivel técnico como regulatorio.&lt;/p&gt;

&lt;p&gt;Cada partición funciona prácticamente como un entorno independiente:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;servicios separados,&lt;/li&gt;
&lt;li&gt;endpoints distintos,&lt;/li&gt;
&lt;li&gt;controles propios,&lt;/li&gt;
&lt;li&gt;e incluso aislamiento de IAM.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ese enfoque hace que AWS priorice mucho más el desacoplamiento entre entornos globales.&lt;/p&gt;


&lt;h4&gt;
  
  
  Regiones y Zonas de Disponibilidad
&lt;/h4&gt;

&lt;p&gt;En este nivel, la organización entre AWS y Azure se vuelve mucho más comparable, aunque siguen existiendo diferencias importantes.&lt;/p&gt;

&lt;p&gt;Ambos proveedores operan con regiones distribuidas globalmente, cada una compuesta por múltiples &lt;strong&gt;Availability Zones (AZs)&lt;/strong&gt; diseñadas para ofrecer alta disponibilidad y resiliencia.&lt;/p&gt;

&lt;p&gt;Sin embargo, la implementación cambia bastante.&lt;/p&gt;

&lt;p&gt;Una de las diferencias más relevantes es que Azure trabaja con el concepto de &lt;strong&gt;Region Pairs&lt;/strong&gt;, donde cada región tiene una contraparte definida para escenarios de recuperación ante desastres.&lt;/p&gt;

&lt;p&gt;Esto permite que Microsoft:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;coordine actualizaciones,&lt;/li&gt;
&lt;li&gt;priorice recuperación,&lt;/li&gt;
&lt;li&gt;y mantenga estrategias de continuidad más estructuradas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En AWS no existe un equivalente automático.&lt;/p&gt;

&lt;p&gt;Las estrategias multi-región deben diseñarse explícitamente por el arquitecto.&lt;br&gt;&lt;br&gt;
Eso entrega más flexibilidad, pero también más responsabilidad.&lt;/p&gt;

&lt;p&gt;A nivel de AZs también existen diferencias relevantes.&lt;/p&gt;

&lt;p&gt;AWS mantiene una cobertura bastante consistente: la mayoría de regiones cuentan con entre 2 y 6 zonas de disponibilidad.&lt;/p&gt;

&lt;p&gt;En Azure, aunque muchas regiones modernas sí disponen de múltiples AZs, no todas las regiones ofrecen soporte completo de Availability Zones, algo que puede afectar decisiones de arquitectura dependiendo de la ubicación elegida.&lt;/p&gt;


&lt;h3&gt;
  
  
  Datacenters y extensiones de baja latencia
&lt;/h3&gt;

&lt;p&gt;En el nivel más bajo de infraestructura, ambos proveedores operan sobre datacenters físicos.&lt;/p&gt;

&lt;p&gt;Tanto en Azure como en AWS, estos datacenters forman parte de una abstracción superior: las Availability Zones, que agrupan múltiples instalaciones físicas para reducir puntos únicos de fallo.&lt;/p&gt;

&lt;p&gt;En Azure, aunque el datacenter no se expone directamente como recurso, existen conceptos importantes como: &lt;strong&gt;Fault Domains&lt;/strong&gt;, &lt;strong&gt;Update Domains&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Estos permiten distribuir máquinas virtuales minimizando el impacto de fallos físicos o mantenimientos programados.&lt;/p&gt;

&lt;p&gt;AWS no expone exactamente la misma granularidad.&lt;/p&gt;

&lt;p&gt;En su lugar, utiliza mecanismos como:&lt;strong&gt;Placement Groups&lt;/strong&gt;, distribución entre AZs y diseño de resiliencia a nivel regional.&lt;/p&gt;


&lt;h3&gt;
  
  
  Local Zones y edge computing
&lt;/h3&gt;

&lt;p&gt;Más allá del datacenter tradicional, ambos proveedores han extendido su infraestructura hacia ubicaciones más cercanas al usuario final para reducir latencia.&lt;/p&gt;

&lt;p&gt;En AWS, esto se materializa mediante &lt;strong&gt;Local Zones&lt;/strong&gt;, que extienden una región hacia áreas metropolitanas específicas permitiendo ejecutar cargas con latencias extremadamente bajas sin desplegar una región completa.&lt;/p&gt;

&lt;p&gt;Azure ofrece iniciativas similares como: &lt;strong&gt;Azure Local Zones&lt;/strong&gt;, &lt;strong&gt;Azure Stack Edge&lt;/strong&gt;. Aunque actualmente su disponibilidad es más limitada y el enfoque suele combinar baja latencia con integración híbrida.&lt;/p&gt;


&lt;h3&gt;
  
  
  Resumen comparativo
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Concepto&lt;/th&gt;
&lt;th&gt;Azure&lt;/th&gt;
&lt;th&gt;AWS&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Nivel 1: Global&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Geography&lt;/strong&gt; (&lt;code&gt;US&lt;/code&gt;, &lt;code&gt;Europe&lt;/code&gt;, &lt;code&gt;Asia Pacific&lt;/code&gt;)  &lt;br&gt;&lt;br&gt;• Agrupa múltiples regiones  &lt;br&gt;• Define residencia de datos  &lt;br&gt;• Boundary de compliance  &lt;br&gt;• Entorno unificado&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Partition&lt;/strong&gt; (&lt;code&gt;aws&lt;/code&gt;, &lt;code&gt;aws-cn&lt;/code&gt;, &lt;code&gt;aws-us-gov&lt;/code&gt;)  &lt;br&gt;&lt;br&gt;• Agrupa múltiples regiones  &lt;br&gt;• Aislamiento completo de IAM, servicios y endpoints  &lt;br&gt;• Boundary legal y regulatorio  &lt;br&gt;• Entornos independientes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Nivel 2: Regional&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Region&lt;/strong&gt; (&lt;code&gt;East US&lt;/code&gt;, &lt;code&gt;West Europe&lt;/code&gt;)  &lt;br&gt;&lt;br&gt;• Múltiples regiones globales  &lt;br&gt;• Cada región puede tener múltiples AZs  &lt;br&gt;• Region Pairs definidos  &lt;br&gt;• Updates coordinados  &lt;br&gt;• Priorización de recuperación&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Region&lt;/strong&gt; (&lt;code&gt;us-east-1&lt;/code&gt;, &lt;code&gt;eu-west-1&lt;/code&gt;)  &lt;br&gt;&lt;br&gt;• Múltiples regiones globales  &lt;br&gt;• Cada región tiene múltiples AZs  &lt;br&gt;• No existe emparejamiento automático  &lt;br&gt;• Estrategia multi-región definida por el arquitecto&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Nivel 3: Availability Zones&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Availability Zone (AZ)&lt;/strong&gt;  &lt;br&gt;&lt;br&gt;• 3 o más AZs en regiones compatibles  &lt;br&gt;• Datacenters físicamente separados  &lt;br&gt;• Baja latencia entre AZs  &lt;br&gt;• No todas las regiones tienen AZs&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Availability Zone (AZ)&lt;/strong&gt;  &lt;br&gt;&lt;br&gt;• La mayoría de regiones tienen múltiples AZs  &lt;br&gt;• Datacenters físicamente separados  &lt;br&gt;• Baja latencia entre AZs  &lt;br&gt;• Cobertura más consistente&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Nivel 4: Datacenter&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Datacenter (no expuesto al usuario)&lt;/strong&gt;  &lt;br&gt;&lt;br&gt;• Múltiples datacenters por AZ  &lt;br&gt;• Fault Domains  &lt;br&gt;• Update Domains  &lt;br&gt;• Abstracción gestionada por plataforma&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Datacenter (no expuesto al usuario)&lt;/strong&gt;  &lt;br&gt;&lt;br&gt;• Múltiples datacenters por AZ  &lt;br&gt;• Placement Groups  &lt;br&gt;• Distribución gestionada por arquitectura  &lt;br&gt;• Sin equivalente directo a Update Domains&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Extensiones locales&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Azure Local Zones / Azure Stack Edge&lt;/strong&gt;  &lt;br&gt;&lt;br&gt;• Baja latencia  &lt;br&gt;• Escenarios híbridos  &lt;br&gt;• Disponibilidad más limitada&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Local Zones / Wavelength Zones&lt;/strong&gt;  &lt;br&gt;&lt;br&gt;• Extensión metropolitana de regiones  &lt;br&gt;• Latencia ultra baja  &lt;br&gt;• Integración 5G y edge computing&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Pro Tip&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Las similitudes entre AWS y Azure facilitan el aprendizaje, pero las diferencias en su implementación son las que realmente definen una buena arquitectura.&lt;br&gt;&lt;br&gt;
Diseñar correctamente implica adaptar patrones, no traducirlos literalmente.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  Cómo se organizan las nubes
&lt;/h3&gt;

&lt;p&gt;Uno de mis primeros choques mentales en el proceso multi nube fue entender que AWS y Azure no organizan sus recursos de la misma manera. Parece un detalle administrativo sin demasiada importancia… hasta que empiezan las conversaciones sobre ambientes, permisos, facturación, gobernanza o separación de cargas. Ahí uno entiende rápidamente que la estructura organizacional de cada nube impacta muchísimo más de lo que imaginaba al inicio.&lt;/p&gt;

&lt;p&gt;De hecho, probablemente este ha sido uno de los temas más difíciles tanto de entender como de explicar cuando converso con colegas que vienen principalmente de trabajar con una sola nube.&lt;/p&gt;

&lt;p&gt;En AWS, el modelo mental gira alrededor de la cuenta. Desde mi punto de vista, ahí es donde normalmente se establece la primera gran separación organizacional. Por ejemplo, si alguien plantea:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“quiero separar ambientes”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;La respuesta natural suele ser crear cuentas distintas para producción, desarrollo, seguridad o logging, algo muy alineado con las buenas prácticas de AWS.&lt;/p&gt;

&lt;p&gt;Sobre esas cuentas se construyen estructuras organizacionales mediante Amazon Web Services Organizations, que permiten agruparlas con fines administrativos y de control. A partir de ahí aparecen conceptos como Organizational Units (OU), Service Control Policies (SCP) e identidades centralizadas que ayudan a establecer reglas comunes entre múltiples cuentas.&lt;/p&gt;

&lt;p&gt;En Azure, el enfoque se siente mucho más jerárquico e integrado desde el inicio. El modelo normalmente se entiende así:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Tenant → Subscription → Resource Group → Resource
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cada nivel cumple un propósito distinto relacionado con organización, facturación, permisos y administración. La suscripción no representa el mismo nivel de separación operativa que una cuenta AWS; muchas veces funciona más como un contenedor administrativo dentro de una jerarquía mayor controlada por el tenant.&lt;/p&gt;

&lt;p&gt;Desde mi perspectiva, AWS prioriza más explícitamente la separación mediante cuentas, mientras Azure aborda la organización desde una jerarquía profundamente integrada al modelo operativo de la plataforma. Y ojo, eso no significa que AWS no tenga jerarquías o estructuras organizacionales; simplemente la cuenta suele convertirse en el elemento principal alrededor del cual se diseñan muchas decisiones arquitectónicas.&lt;/p&gt;

&lt;p&gt;Veamos con más detalle cada elemento desde la perspectiva de cada proveedor.&lt;/p&gt;




&lt;h3&gt;
  
  
  Enfoque de Azure
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Tenant
&lt;/h4&gt;

&lt;p&gt;Es el nivel más alto. Representa la organización completa en Azure y está asociado a una instancia de Microsoft Entra ID (anteriormente Azure Active Directory). Cuando una empresa contrata Azure, se crea un tenant. Todo lo demás vive dentro de él.&lt;/p&gt;




&lt;h4&gt;
  
  
  Management Group
&lt;/h4&gt;

&lt;p&gt;Es opcional, pero muy útil en organizaciones grandes. Permite agrupar suscripciones para aplicar políticas y permisos de forma centralizada.&lt;/p&gt;

&lt;p&gt;Por ejemplo, puedes tener un Management Group para todas las suscripciones de producción y otro para desarrollo, aplicando reglas distintas sin tener que configurar cada suscripción individualmente. También podrías tener un Management Group que agrupe todas las suscripciones de la organización únicamente para gobierno y cumplimiento.&lt;/p&gt;




&lt;h4&gt;
  
  
  Subscription
&lt;/h4&gt;

&lt;p&gt;Es el contenedor administrativo y financiero principal. Todo recurso que se crea en Azure vive dentro de una suscripción. También es donde se aplican cuotas y donde se consolida la facturación.&lt;/p&gt;

&lt;p&gt;Muchas organizaciones usan suscripciones separadas para producción, desarrollo o unidades de negocio, más por administración y control financiero que por separación técnica entre entornos.&lt;/p&gt;

&lt;p&gt;Un detalle importante —y fuente frecuente de confusión— es que, aunque la suscripción sea un contenedor administrativo, no puedes mezclar recursos de distintas suscripciones dentro del mismo Resource Group.&lt;/p&gt;




&lt;h4&gt;
  
  
  Resource Group
&lt;/h4&gt;

&lt;p&gt;Es un contenedor lógico dentro de una suscripción que agrupa recursos relacionados con una carga de trabajo: App Services, bases de datos, Cosmos DB, redes, etc.&lt;/p&gt;

&lt;p&gt;Mientras los recursos pertenezcan al mismo scope administrativo, pueden agruparse dentro de un Resource Group. Además de organizar recursos, permite aplicar permisos mediante RBAC y gestionar el ciclo de vida completo de una solución: si eliminas el Resource Group, eliminas todo lo que contiene.&lt;/p&gt;

&lt;p&gt;Personalmente, este es uno de los elementos que más me ayudó durante mi proceso de adopción de Azure.&lt;/p&gt;




&lt;h4&gt;
  
  
  Resource
&lt;/h4&gt;

&lt;p&gt;Es el recurso concreto: una VM, un Storage Account, un NAT Gateway o una base de datos. Representa la unidad mínima de infraestructura o servicio dentro de Azure.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fshyr9m6gyc5r5tjcc6n6.jpg" alt=" " width="800" height="343"&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Enfoque AWS
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Root Account
&lt;/h4&gt;

&lt;p&gt;Es la cuenta inicial que se crea cuando una organización comienza a utilizar AWS. Tiene acceso total e irrestricto a todos los recursos y servicios.&lt;/p&gt;

&lt;p&gt;La recomendación general es no usarla para trabajo diario, protegerla con MFA y reservarla únicamente para tareas administrativas muy específicas.&lt;/p&gt;




&lt;h4&gt;
  
  
  AWS Organizations
&lt;/h4&gt;

&lt;p&gt;Es la estructura que permite gobernar múltiples cuentas AWS desde un punto centralizado. Se habilita desde la Root Account, que pasa a convertirse en la Management Account de la organización.&lt;/p&gt;

&lt;p&gt;Desde ahí pueden crearse cuentas hijas, agruparlas y aplicar políticas comunes.&lt;/p&gt;




&lt;h4&gt;
  
  
  Organizational Unit (OU)
&lt;/h4&gt;

&lt;p&gt;Es un contenedor dentro de AWS Organizations que agrupa cuentas con un propósito común.&lt;/p&gt;

&lt;p&gt;Por ejemplo, puedes tener una OU para producción, otra para desarrollo y otra para seguridad, incluyendo los niveles de anidación que necesites.&lt;/p&gt;

&lt;p&gt;Las políticas aplicadas a una OU se heredan a todas las cuentas contenidas dentro de ella, permitiendo gobernar a escala sin configurar cada cuenta individualmente.&lt;/p&gt;




&lt;h4&gt;
  
  
  Service Control Policy (SCP)
&lt;/h4&gt;

&lt;p&gt;Es un mecanismo de control aplicado sobre OUs o cuentas.&lt;/p&gt;

&lt;p&gt;Define el máximo nivel de acciones permitidas dentro de una cuenta. Aunque un usuario tenga permisos amplios mediante IAM, si una SCP restringe una acción, la restricción prevalece.&lt;/p&gt;

&lt;p&gt;Las SCP no otorgan permisos por sí mismas; únicamente establecen límites.&lt;/p&gt;




&lt;h4&gt;
  
  
  Cuenta AWS
&lt;/h4&gt;

&lt;p&gt;Es probablemente la unidad organizacional más importante dentro del modelo AWS.&lt;/p&gt;

&lt;p&gt;Cada cuenta posee sus propios recursos, redes, facturación y límites de servicio. El acceso entre cuentas no ocurre automáticamente; normalmente requiere configuraciones explícitas mediante IAM, networking o servicios compartidos.&lt;/p&gt;

&lt;p&gt;Es el equivalente conceptual más cercano a una Subscription de Azure, aunque con una separación operativa mucho más marcada desde el diseño de la plataforma.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F048kaqtvkcyoomk34sow.jpg" alt=" " width="800" height="349"&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Equivalencias conceptuales
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Nivel Azure&lt;/th&gt;
&lt;th&gt;Equivalente conceptual AWS&lt;/th&gt;
&lt;th&gt;Nota clave&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Tenant&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;AWS Organizations / Root Context&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;En Azure todo vive dentro de un tenant asociado a Entra ID; en AWS el contexto organizacional suele construirse alrededor de Organizations y la cuenta raíz&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Management Group&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Organizational Unit (OU)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Ambos permiten agrupar contenedores hijos para aplicar políticas y gobernanza centralizada&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Subscription&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Cuenta AWS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Ambos funcionan como contenedores administrativos y financieros, aunque la cuenta AWS suele representar una separación operativa más marcada&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Resource Group&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;No existe equivalente directo&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AWS utiliza tags, stacks y convenciones organizacionales para agrupar recursos, pero no existe un contenedor con el mismo peso operativo y ciclo de vida que un Resource Group&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Resource&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Resource&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;La unidad mínima consumible de infraestructura o servicio en ambas nubes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;p&gt;Y esto nos lleva al tema de facturación, que también refleja bastante la filosofía de organización de cada nube.&lt;/p&gt;

&lt;p&gt;En Azure, la suscripción tiene un peso administrativo y financiero muy importante; muchas estrategias de gobernanza, límites y control de costos se construyen alrededor de ella.&lt;/p&gt;

&lt;p&gt;En AWS, aunque la cuenta sigue siendo un elemento financiero clave, la granularidad del análisis de costos suele apoyarse muchísimo más en estrategias de tagging y consolidación mediante AWS Organizations.&lt;/p&gt;

&lt;p&gt;Mi impresión personal es que Azure incentiva más una segmentación jerárquica desde la propia estructura organizacional, mientras AWS favorece una separación basada en cuentas complementada con modelos detallados de etiquetado para gobierno financiero y operacional.&lt;/p&gt;

&lt;h3&gt;
  
  
  Veamos un ejemplo práctico
&lt;/h3&gt;

&lt;p&gt;Imaginemos una organización dedicada a investigación y desarrollo que está iniciando su adopción cloud y necesita construir una estructura ordenada, segura y escalable tanto en AWS como en Azure.&lt;/p&gt;

&lt;p&gt;La organización quiere separar claramente sus ambientes de:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Desarrollo&lt;/li&gt;
&lt;li&gt;Pruebas&lt;/li&gt;
&lt;li&gt;Preproducción&lt;/li&gt;
&lt;li&gt;Producción&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Además, busca implementar controles bien definidos para:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;permisos y accesos&lt;/li&gt;
&lt;li&gt;facturación y control de costos&lt;/li&gt;
&lt;li&gt;gobernanza&lt;/li&gt;
&lt;li&gt;cumplimiento&lt;/li&gt;
&lt;li&gt;networking compartido&lt;/li&gt;
&lt;li&gt;servicios de seguridad centralizados&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A simple vista, el objetivo parece idéntico en ambas nubes: organizar recursos, separar ambientes y aplicar políticas. Sin embargo, cuando empezamos a diseñar la estructura, rápidamente aparecen diferencias importantes en la filosofía organizacional de cada proveedor.&lt;/p&gt;

&lt;p&gt;En AWS, el diseño suele inclinarse hacia una separación por cuentas, donde cada ambiente vive en una cuenta independiente administrada mediante AWS Organizations y Organizational Units (OU).&lt;/p&gt;

&lt;p&gt;En Azure, el enfoque normalmente se construye alrededor de una jerarquía organizacional basada en:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Tenant → Management Groups → Subscriptions → Resource Groups
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;donde la gobernanza y la administración se integran profundamente dentro de la estructura jerárquica de la plataforma.&lt;/p&gt;

&lt;p&gt;El siguiente diagrama muestra cómo podría modelarse este mismo escenario en ambas nubes y ayuda a visualizar por qué, aunque los objetivos sean similares, la forma de pensar y organizar la infraestructura cambia considerablemente entre AWS y Azure.}&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjmy9r6yy6zpninrnctvp.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjmy9r6yy6zpninrnctvp.jpg" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Identidad: donde todo inicia
&lt;/h2&gt;

&lt;p&gt;Puedes replicar infraestructura entre nubes, pero si no entiendes cómo funciona la identidad, no puedes gobernarlas. Y esta es, quizá, una de las particularidades más complejas cuando estás transitando entre dos mundos.&lt;/p&gt;

&lt;p&gt;En lo personal, este tema me costó un poco. Ambos entornos resuelven la misma necesidad de formas similares, pero —y aquí está el punto clave— similar no es lo mismo.&lt;/p&gt;

&lt;p&gt;Mi mayor confusión venía de esto:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;AWS te da control fino desde el inicio, mientras que Azure te ofrece una capa de abstracción inicial y luego te permite profundizar.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Analicémoslo con más detalle.&lt;/p&gt;




&lt;h3&gt;
  
  
  AWS: identidad y permisos en un mismo sistema
&lt;/h3&gt;

&lt;p&gt;En AWS, la identidad y los permisos se definen dentro de un mismo sistema: &lt;strong&gt;AWS Identity and Access Management (IAM)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Aquí tienes control granular a través de políticas, donde defines exactamente qué puede hacer cada identidad sobre cada recurso.&lt;/p&gt;

&lt;p&gt;Yo lo veo así:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Usuarios / Grupos / Roles
Policies (JSON)
Permisos a servicios y recursos
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Las asignaciones son altamente granulares.&lt;/p&gt;

&lt;p&gt;Ese control fino permite aplicar el principio de mínimo privilegio desde el inicio, aunque puede resultar más complejo y, en ocasiones, un poco árido al principio.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffhd0ai95jh2290gx2o5t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffhd0ai95jh2290gx2o5t.png" alt=" " width="452" height="421"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Azure: identidad y autorización como capas separadas
&lt;/h3&gt;

&lt;p&gt;En Azure, en cambio, el modelo se separa en dos capas bien definidas.&lt;/p&gt;

&lt;p&gt;Por un lado está la identidad, gestionada en &lt;strong&gt;Microsoft Entra ID&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Usuarios
Grupos
Aplicaciones / Service Principals
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aquí es donde defines quién eres.&lt;/p&gt;




&lt;p&gt;Por otro lado está la autorización, gestionada mediante &lt;strong&gt;Azure Role-Based Access Control (RBAC)&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Roles: Owner, Contributor, Reader (y muchos más)

Asignaciones a nivel de:
- Subscription
- Resource Group
- Recurso específico
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aquí es donde defines qué puede hacer esa identidad.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftbrninn1wzkpbqr1zjm3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftbrninn1wzkpbqr1zjm3.png" alt=" " width="456" height="469"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  La diferencia importante
&lt;/h3&gt;

&lt;p&gt;Esta separación es clave para entender Azure.&lt;/p&gt;

&lt;p&gt;Mientras en AWS todo vive en un mismo sistema, en Azure debes pensar en dos dimensiones:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;identidad&lt;/li&gt;
&lt;li&gt;permisos&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Y aunque ambos modelos terminan resolviendo el mismo problema, la forma en que llegas ahí cambia bastante entre plataformas.&lt;/p&gt;




&lt;h2&gt;
  
  
  Cómo se comunican los recursos - Networking
&lt;/h2&gt;

&lt;p&gt;Y aquí es donde realmente empiezan las diferencias filosóficas fuertes entre ambas nubes. Y siendo muy honesta, el networking no es mi fuerte. AWS y Azure se parecen bastante superficialmente, pero me parece que el diseño mental cambia un poco, por lo que les compartiré mi “Piedra Roseta” para tratar de hacer más fácil el proceso de adaptación a otra nube y algunas reflexiones sobre los elementos de networking más destacables.&lt;/p&gt;




&lt;h3&gt;
  
  
  VPC vs VNet
&lt;/h3&gt;

&lt;p&gt;Conceptualmente, ambos servicios cumplen el mismo objetivo: crear redes privadas lógicas dentro de la nube para aislar y conectar recursos de forma segura.&lt;/p&gt;

&lt;p&gt;Tanto AWS como Azure permiten:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;definir CIDR,&lt;/li&gt;
&lt;li&gt;segmentar mediante subnets,&lt;/li&gt;
&lt;li&gt;controlar tráfico,&lt;/li&gt;
&lt;li&gt;conectar entornos on-premises,&lt;/li&gt;
&lt;li&gt;e incluso otras nubes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hasta aquí, pareciera que hablamos exactamente de lo mismo. Pero nuevamente, el modelo puede parecer similar mientras la filosofía detrás del diseño cambia bastante.&lt;/p&gt;

&lt;p&gt;En AWS, la VPC se siente muy explícita en el aislamiento. El arquitecto define de forma muy consciente cómo se segmenta la red, cómo se enruta el tráfico y qué componentes permiten la salida o entrada hacia Internet. Soy de software, eso siempre me ha costado.&lt;/p&gt;

&lt;p&gt;Muchos elementos deben declararse explícitamente:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Internet Gateways&lt;/li&gt;
&lt;li&gt;Route Tables&lt;/li&gt;
&lt;li&gt;NAT Gateways&lt;/li&gt;
&lt;li&gt;asociaciones de subnets&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Desde el inicio hay mucho control y consciencia de lo que es permitido y no, y por supuesto muchos dolores de cabeza cuando no le puedes llegar a un recurso.&lt;/p&gt;

&lt;p&gt;En Azure, la VNet se percibe más integrada al ecosistema general de la suscripción y la región. El modelo suele sentirse más abstraído y conectado al diseño operativo de Azure.&lt;/p&gt;

&lt;p&gt;Aunque también existen tablas de ruteo, gateways y segmentación, varios comportamientos vienen más integrados dentro del modelo de la plataforma.&lt;/p&gt;

&lt;p&gt;Uno de los detalles más importantes es la relación entre subnets y zonas de disponibilidad.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;En AWS, una subnet pertenece a una Availability Zone específica.&lt;/li&gt;
&lt;li&gt;En Azure, las subnets viven a nivel regional y los recursos son los que posteriormente se distribuyen entre zonas cuando el servicio lo soporta.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Es un pequeño detalle que cambia bastante la forma de pensar en términos de resiliencia y diseño de red.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Al momento de escribir este artículo una región solo tenía una AZ.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  NSG vs Security Groups ¿qué tan parecidos?
&lt;/h3&gt;

&lt;p&gt;Al inicio, los Network Security Groups (NSG) de Azure y los Security Groups de AWS parecen prácticamente lo mismo, pero no hay que dejarse engañar. Al principio es solo ese falso sentimiento de:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“esto lo conozco”.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ambos permiten controlar tráfico de entrada y salida hacia recursos dentro de la red. Sin embargo, conforme se profundiza, aparecen diferencias importantes en filosofía y funcionamiento.&lt;/p&gt;

&lt;p&gt;En AWS, los Security Groups son &lt;strong&gt;stateful&lt;/strong&gt; y se enfocan principalmente en proteger workloads o interfaces de red específicas como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;EC2&lt;/li&gt;
&lt;li&gt;RDS&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Funcionan únicamente mediante reglas &lt;strong&gt;ALLOW&lt;/strong&gt;; si el tráfico no está explícitamente permitido, se deniega implícitamente.&lt;/p&gt;

&lt;p&gt;No existen reglas &lt;strong&gt;DENY&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;AWS además separa otro componente llamado &lt;strong&gt;Network ACL (NACL)&lt;/strong&gt;, que funciona a nivel subnet.&lt;/p&gt;

&lt;p&gt;Los NACL son:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;stateless,&lt;/li&gt;
&lt;li&gt;permiten reglas ALLOW,&lt;/li&gt;
&lt;li&gt;permiten reglas DENY.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esto crea una separación bastante clara entre controles a nivel subnet y controles a nivel workload.&lt;/p&gt;

&lt;p&gt;En Azure, los NSG consolidan parte de ambos conceptos.&lt;/p&gt;

&lt;p&gt;También son &lt;strong&gt;stateful&lt;/strong&gt;, pero pueden aplicarse tanto a:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;subnets,&lt;/li&gt;
&lt;li&gt;como directamente a NICs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A diferencia de los Security Groups de AWS, los NSG sí soportan reglas &lt;strong&gt;DENY&lt;/strong&gt; explícitas.&lt;/p&gt;

&lt;p&gt;Ese pequeño detalle cambia bastante el enfoque mental.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AWS separa más explícitamente las capas de seguridad de red.&lt;/li&gt;
&lt;li&gt;Azure tiende a integrar más funcionalidades dentro de un mismo componente.&lt;/li&gt;
&lt;/ul&gt;




&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Pro Tip&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Mientras en AWS se trabajan capas de control separadas — NACL para subnet y Security Groups a nivel de servicios — Azure consolida el modelo en NSG.&lt;br&gt;&lt;br&gt;
Esto permite entrever la diferencia filosófica de que AWS tiende a separar componentes mientras que Azure consolida funcionalidades.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  Tal y como les prometí: mi “Piedra Rosetta”
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Azure VNet&lt;/th&gt;
&lt;th&gt;AWS VPC&lt;/th&gt;
&lt;th&gt;Diferencias Clave&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Red virtual privada regional&lt;/td&gt;
&lt;td&gt;Red virtual privada regional&lt;/td&gt;
&lt;td&gt;Azure integra la VNet más visiblemente dentro del modelo de suscripción y Resource Groups, mientras AWS trata la VPC como un boundary de aislamiento más explícito y desacoplado&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Subnets regionales&lt;/td&gt;
&lt;td&gt;Subnets asociadas a una AZ específica&lt;/td&gt;
&lt;td&gt;En Azure las subnets pertenecen a la VNet regional; en AWS cada subnet vive dentro de una Availability Zone específica&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NSG aplicable a subnet o NIC&lt;/td&gt;
&lt;td&gt;Security Groups aplicados a interfaces/instancias&lt;/td&gt;
&lt;td&gt;Azure permite aplicar controles tanto a nivel subnet como NIC y permite Allows y Deny; en AWS los Security Groups se enfocan principalmente en interfaces y workloads, solo permiten Allows y el concepto NACL no existe aislado en Azure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;User Defined Routes (UDR)&lt;/td&gt;
&lt;td&gt;Route Tables&lt;/td&gt;
&lt;td&gt;Azure maneja el routing de forma más integrada dentro de la plataforma; en AWS las asociaciones entre subnets y Route Tables suelen ser más explícitas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VPN Gateway&lt;/td&gt;
&lt;td&gt;Site to Site VPN&lt;/td&gt;
&lt;td&gt;Ambos servicios permiten conectar redes on-premises con la nube mediante túneles IPsec, soportando escenarios híbridos y routing dinámico con BGP. Sin embargo, Azure expone de forma más explícita conceptos tradicionales de networking como tipos de VPN (route-based y policy-based), SKUs, configuraciones active-active y opciones avanzadas desde el proceso inicial de despliegue. En AWS, aunque estas capacidades también existen, el servicio administrado abstrae más parte de la complejidad operativa y el flujo suele sentirse más guiado desde la experiencia de implementación&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ExpressRoute&lt;/td&gt;
&lt;td&gt;Direct Connect&lt;/td&gt;
&lt;td&gt;Tanto Azure ExpressRoute como AWS Direct Connect suelen requerir la participación de carriers o partners especializados para establecer la conectividad física. Ambos servicios buscan reducir la dependencia de Internet pública y ofrecer conexiones más estables y predecibles. Sin embargo, históricamente ExpressRoute ha tenido una orientación más integrada hacia el ecosistema Microsoft mediante distintos modelos de peering que permiten conectividad privada no solo hacia VNets, sino también hacia servicios Microsoft y plataformas SaaS asociadas. Direct Connect, por su parte, suele percibirse más enfocado en conectividad dedicada hacia VPCs, redes y workloads específicos dentro de AWS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Service Endpoints / Private Endpoints&lt;/td&gt;
&lt;td&gt;VPC Endpoints&lt;/td&gt;
&lt;td&gt;Azure diferencia dos enfoques explícitos: Service Endpoints restringen el acceso al servicio a VNets autorizadas sin crear interfaces de red adicionales, mientras que Private Endpoints asignan una IP privada dentro de la VNet y permiten resolución mediante DNS privado, posibilitando además deshabilitar opcionalmente el acceso público al servicio. AWS agrupa estos patrones bajo el concepto de VPC Endpoints, diferenciando internamente entre Gateway Endpoints — integrados mediante route tables y limitados principalmente a S3 y DynamoDB — e Interface Endpoints, que crean una ENI con IP privada y permiten conectividad privada hacia una amplia variedad de servicios AWS y servicios compatibles con PrivateLink, incluso en escenarios híbridos mediante VPN o Direct Connect&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NAT Gateway&lt;/td&gt;
&lt;td&gt;NAT Gateway&lt;/td&gt;
&lt;td&gt;Ambas nubes usan NAT Gateway para que recursos en subnets privadas accedan a internet sin exponer su IP directamente. En Azure basta con asociarlo a la subnet sin tocar route tables. En AWS el proceso es más explícito: requiere un Internet Gateway, una subnet pública donde reside el NAT Gateway, y una entrada manual en la route table de cada subnet privada — lo que da más control pero también más superficie de error, especialmente en arquitecturas multi-zona&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Public IP&lt;/td&gt;
&lt;td&gt;Elastic IP&lt;/td&gt;
&lt;td&gt;Azure trata la IP pública como un recurso independiente que puede asociarse a componentes como NICs, Load Balancers o NAT Gateways. Aunque la IP existe como recurso separado, operativamente suele crearse y administrarse en conjunto con el servicio asociado. Para conservarla basta con utilizar asignación estática y desasociarla sin eliminar el recurso, permitiendo reutilizarla posteriormente. AWS el modelo mental es algo distinto: utiliza Elastic IPs como mecanismo principal para direcciones públicas persistentes. Estas se reservan explícitamente dentro de la cuenta y pueden asociarse o moverse entre instancias y servicios de manera independiente. Ambas nubes cobran por IPs públicas estáticas no asociadas; la diferencia es que AWS hace de la reasignación explícita parte natural del modelo operativo, mientras que Azure suele integrar más la administración de la IP al ciclo de vida del recurso que la consume&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Interactuando con la nube
&lt;/h2&gt;

&lt;p&gt;No podía cerrar esta primera parte sin hablar de algo que también cambia muchísimo entre proveedores: la forma en que interactuamos con la nube día a día.&lt;/p&gt;

&lt;p&gt;Ambas plataformas cuentan con:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;consola web,&lt;/li&gt;
&lt;li&gt;APIs,&lt;/li&gt;
&lt;li&gt;SDKs,&lt;/li&gt;
&lt;li&gt;Infrastructure as Code,&lt;/li&gt;
&lt;li&gt;y CLI.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sin embargo, nuevamente la filosofía detrás del diseño se siente bastante distinta.&lt;/p&gt;

&lt;p&gt;A nivel de consola, en Azure Resource Manager (ARM) funciona como una capa unificada de administración para despliegues, permisos, políticas y organización de recursos. Esa integración hace que muchas operaciones se perciban más centralizadas y coherentes con la estructura jerárquica previamente resaltada.&lt;/p&gt;

&lt;p&gt;En AWS, la experiencia suele sentirse más orientada a servicios individuales.&lt;/p&gt;

&lt;p&gt;Aunque existen mecanismos unificadores como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Organizations,&lt;/li&gt;
&lt;li&gt;CloudFormation,&lt;/li&gt;
&lt;li&gt;o Control Tower,&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;la interacción diaria muchas veces implica navegar entre servicios relativamente desacoplados entre sí.&lt;/p&gt;

&lt;p&gt;Eso ofrece muchísimo control y flexibilidad, pero también puede requerir entender mejor cómo interactúan múltiples componentes para operar con fluidez.&lt;/p&gt;

&lt;p&gt;No considero que un enfoque sea “mejor” que el otro; más bien destacan la diferencia de filosofía entre ambas nubes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reflexiones finales
&lt;/h2&gt;

&lt;p&gt;Este es apenas un primer acercamiento al reto de convertirse en un arquitecto multi nube.&lt;/p&gt;

&lt;p&gt;En un momento donde cada vez más organizaciones dejan atrás la idea de depender de un único proveedor, necesitamos desarrollar la capacidad de comprender las fortalezas, limitaciones y filosofía operativa de cada plataforma.&lt;/p&gt;

&lt;p&gt;Ser multi nube no significa solamente aprender servicios equivalentes entre AWS y Azure. También implica entender cómo piensa cada ecosistema, cómo organiza sus recursos, cómo gobierna su infraestructura y cómo toma decisiones operativas.&lt;/p&gt;

&lt;p&gt;Al final, el verdadero reto es saber qué pieza ajustar en cada ambiente para construir soluciones que sean:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;sostenibles,&lt;/li&gt;
&lt;li&gt;eficientes,&lt;/li&gt;
&lt;li&gt;y financieramente responsables.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Yo sigo aprendiendo en ese proceso y más adelante quiero compartirles también mis experiencias y estrategias alrededor de IA en ambos mundos cloud.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>azure</category>
      <category>cloudcomputing</category>
    </item>
    <item>
      <title>Sabías que un porcentaje significativo de modelos no falla por el algoritmo, sino por la calidad de los datos En este artículo abordo el proceso de Feature Engineering: cómo seleccionar limpiar transformar datos crudos en Features</title>
      <dc:creator>Diana Castro</dc:creator>
      <pubDate>Wed, 18 Feb 2026 15:06:00 +0000</pubDate>
      <link>https://dev.to/dcastrocordero22/sabias-que-un-porcentaje-significativo-de-modelos-no-falla-por-el-algoritmo-sino-por-la-calidad-de-592f</link>
      <guid>https://dev.to/dcastrocordero22/sabias-que-un-porcentaje-significativo-de-modelos-no-falla-por-el-algoritmo-sino-por-la-calidad-de-592f</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/aws-builders/diario-de-una-builder-feature-engineering-4pg8" class="crayons-story__hidden-navigation-link"&gt;Diario de una builder: Feature Engineering&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;
          &lt;a class="crayons-logo crayons-logo--l" href="/aws-builders"&gt;
            &lt;img alt="AWS Community Builders  logo" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F2794%2F88da75b6-aadd-4ea1-8083-ae2dfca8be94.png" class="crayons-logo__image"&gt;
          &lt;/a&gt;

          &lt;a href="/dcastrocordero22" class="crayons-avatar  crayons-avatar--s absolute -right-2 -bottom-2 border-solid border-2 border-base-inverted  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1876418%2Fe1e99ea5-7ed6-4e95-9551-0ebcb5468100.jpg" alt="dcastrocordero22 profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/dcastrocordero22" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Diana Castro
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Diana Castro
                &lt;a href="/++"&gt;&lt;img alt="Subscriber" class="subscription-icon" src="https://assets.dev.to/assets/subscription-icon-805dfa7ac7dd660f07ed8d654877270825b07a92a03841aa99a1093bd00431b2.png"&gt;&lt;/a&gt;
              
              &lt;div id="story-author-preview-content-3257124" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/dcastrocordero22" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1876418%2Fe1e99ea5-7ed6-4e95-9551-0ebcb5468100.jpg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Diana Castro&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

            &lt;span&gt;
              &lt;span class="crayons-story__tertiary fw-normal"&gt; for &lt;/span&gt;&lt;a href="/aws-builders" class="crayons-story__secondary fw-medium"&gt;AWS Community Builders &lt;/a&gt;
            &lt;/span&gt;
          &lt;/div&gt;
          &lt;a href="https://dev.to/aws-builders/diario-de-una-builder-feature-engineering-4pg8" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Feb 15&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/aws-builders/diario-de-una-builder-feature-engineering-4pg8" id="article-link-3257124"&gt;
          Diario de una builder: Feature Engineering
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/aws"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;aws&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/machinelearning"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;machinelearning&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/aws-builders/diario-de-una-builder-feature-engineering-4pg8" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;1&lt;span class="hidden s:inline"&gt; reaction&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/aws-builders/diario-de-una-builder-feature-engineering-4pg8#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            20 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>ai</category>
      <category>aws</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>Diario de una builder: Feature Engineering</title>
      <dc:creator>Diana Castro</dc:creator>
      <pubDate>Sun, 15 Feb 2026 02:58:04 +0000</pubDate>
      <link>https://dev.to/aws-builders/diario-de-una-builder-feature-engineering-4pg8</link>
      <guid>https://dev.to/aws-builders/diario-de-una-builder-feature-engineering-4pg8</guid>
      <description>&lt;h2&gt;
  
  
  Feature Engineering: El siguiente paso después de preparar los datos
&lt;/h2&gt;

&lt;p&gt;Existen muchas etapas que debemos recorrer antes de iniciar el entrenamiento de un modelo de Machine Learning. En las entregas pasadas de esta saga hemos trabajado en la exploración de los datos: identificamos &lt;em&gt;outliers&lt;/em&gt;, detectamos columnas sin sentido, valores duplicados y comprendimos, en cierta medida, la distribución de los datos.&lt;/p&gt;

&lt;p&gt;Esta es una etapa inicial y fundamental dentro del trabajo de cualquier científico de datos.&lt;/p&gt;

&lt;p&gt;En nuestro caso, los datos provienen de un origen bastante controlado, ya que se trata de un ejercicio meramente didáctico. No obstante, en escenarios reales los orígenes de datos pueden ser muy variados: tablas, archivos PDF, bases de datos transaccionales, logs, entre otros. Por esta razón, la preparación de los datos suele ser una tarea laboriosa y altamente iterativa.&lt;/p&gt;

&lt;p&gt;Este es solo el inicio del camino. Una vez que contamos con los datos crudos debidamente preparados, podemos avanzar al siguiente paso: el proceso de selección y construcción de &lt;em&gt;features&lt;/em&gt;, conocido como &lt;strong&gt;Feature Engineering&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;En esta etapa, el objetivo es ir un paso más allá y enriquecer el dataset, transformándolo en un conjunto de datos más representativo, consistente y adecuado para su uso en modelos de Machine Learning.&lt;/p&gt;

&lt;p&gt;Para lograrlo, no basta con aplicar técnicas de forma mecánica. Es fundamental comprender la teoría que respalda el Feature Engineering, ya que las decisiones que tomamos en esta fase impactan directamente en:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;La calidad del modelo
&lt;/li&gt;
&lt;li&gt;Su capacidad de generalización
&lt;/li&gt;
&lt;li&gt;La reutilización futura de los datos
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🔁 Un proceso altamente iterativo
&lt;/h3&gt;

&lt;p&gt;Como verán, estos procesos son altamente iterativos. Y aunque pueda parecer que ya hemos “limpiado nuestro set de datos”, la realidad es que se requieren más iteraciones para convertirlo en un conjunto verdaderamente adecuado para que un modelo logre aprender de forma precisa.&lt;/p&gt;

&lt;p&gt;Y algo muy importante: debemos presentar los &lt;em&gt;features&lt;/em&gt; de la manera más apropiada posible.&lt;/p&gt;

&lt;p&gt;Es por esto que en las siguientes secciones hablaremos de Feature Engineering y continuaremos preparando el dataset. Al final, no tendremos simplemente datos curados: los habremos transformado en &lt;em&gt;features&lt;/em&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 Feature Engineering – Comprendiendo lo que implica
&lt;/h2&gt;

&lt;p&gt;El &lt;em&gt;Feature Engineering&lt;/em&gt; no es un término elegante ni una práctica cosmética dentro de un pipeline de Machine Learning; es una de las fases con mayor impacto técnico en el desempeño final del modelo.&lt;/p&gt;

&lt;p&gt;En términos prácticos, la capacidad predictiva de un algoritmo está fuertemente condicionada por la calidad, relevancia y representatividad de las variables con las que aprende.&lt;/p&gt;

&lt;p&gt;Al igual que la etapa de preparación de datos —donde exploramos distribuciones, detectamos &lt;em&gt;outliers&lt;/em&gt;, tratamos valores nulos y eliminamos inconsistencias— el Feature Engineering es inherentemente iterativo. No es un paso lineal que se ejecuta una sola vez; implica ciclos continuos de:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hipótesis
&lt;/li&gt;
&lt;li&gt;Transformación
&lt;/li&gt;
&lt;li&gt;Validación
&lt;/li&gt;
&lt;li&gt;Ajuste
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  📚 Conceptos base
&lt;/h3&gt;

&lt;p&gt;En aprendizaje supervisado:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Feature&lt;/strong&gt;: cada variable o atributo que se entrega al modelo como entrada durante el entrenamiento.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Label (o variable objetivo)&lt;/strong&gt;: la variable que deseamos predecir.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Las &lt;em&gt;features&lt;/em&gt; constituyen el &lt;strong&gt;espacio de representación del problema&lt;/strong&gt;. Es sobre ellas que el modelo identifica patrones, estima relaciones y construye su función de predicción.&lt;/p&gt;




&lt;h3&gt;
  
  
  🎴 Aplicado a nuestro ejemplo práctico
&lt;/h3&gt;

&lt;p&gt;En nuestro caso:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tipo&lt;/th&gt;
&lt;th&gt;Variable&lt;/th&gt;
&lt;th&gt;Descripción&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Feature&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Rareza&lt;/td&gt;
&lt;td&gt;Nivel de rareza asociado a la carta&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Feature&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Costo máximo&lt;/td&gt;
&lt;td&gt;Valor máximo del rango de costo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Feature&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Costo mínimo&lt;/td&gt;
&lt;td&gt;Valor mínimo del rango de costo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Label&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Costo de la carta&lt;/td&gt;
&lt;td&gt;Variable numérica que deseamos predecir&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;🔎 &lt;strong&gt;Punto clave:&lt;/strong&gt; El modelo no aprende directamente del “concepto” de una carta, sino de cómo representamos matemáticamente sus atributos.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fehk25ue3p1bvxwi4t62y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fehk25ue3p1bvxwi4t62y.png" alt=" " width="800" height="418"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🔬 ¿Qué abarca el Feature Engineering?
&lt;/h3&gt;

&lt;p&gt;Desde una perspectiva técnica, el &lt;em&gt;Feature Engineering&lt;/em&gt; incluye principalmente:&lt;/p&gt;

&lt;h4&gt;
  
  
  1️⃣ Selección de variables relevantes
&lt;/h4&gt;

&lt;p&gt;Eliminación de ruido y reducción de dimensionalidad para conservar únicamente aquellas variables con verdadera capacidad explicativa.&lt;/p&gt;




&lt;h4&gt;
  
  
  2️⃣ Transformación de variables existentes
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Escalamiento (&lt;em&gt;normalización o estandarización&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;Codificación de variables categóricas (&lt;em&gt;One-Hot Encoding&lt;/em&gt;, &lt;em&gt;Target Encoding&lt;/em&gt;, etc.).&lt;/li&gt;
&lt;li&gt;Transformaciones matemáticas (logarítmica, polinómica, interacción entre variables).&lt;/li&gt;
&lt;/ul&gt;




&lt;h4&gt;
  
  
  3️⃣ Creación de nuevas features (&lt;em&gt;Feature Construction&lt;/em&gt;)
&lt;/h4&gt;

&lt;p&gt;Generación de variables derivadas que capturen mejor la señal del problema, por ejemplo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Variables agregadas.&lt;/li&gt;
&lt;li&gt;Indicadores binarios derivados de umbrales.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;El objetivo es mejorar las entradas para que el modelo capture la estructura real del problema y no lo carguemos simplemente con ruido.&lt;/p&gt;




&lt;h3&gt;
  
  
  🎯 ¿Qué ganamos con una correcta aplicación?
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1️⃣ Reducción de costos computacionales
&lt;/h4&gt;

&lt;p&gt;Un conjunto de &lt;em&gt;features&lt;/em&gt; optimizado reduce dimensionalidad innecesaria, lo que implica:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Menor tiempo de entrenamiento.&lt;/li&gt;
&lt;li&gt;Menor consumo de memoria.&lt;/li&gt;
&lt;li&gt;Menor costo de cómputo (especialmente relevante en entornos &lt;em&gt;cloud&lt;/em&gt;).&lt;/li&gt;
&lt;/ul&gt;




&lt;h4&gt;
  
  
  2️⃣ Mejora del rendimiento del modelo
&lt;/h4&gt;

&lt;p&gt;Seguramente han escuchado la frase: &lt;em&gt;garbage in, garbage out&lt;/em&gt;.&lt;br&gt;&lt;br&gt;
En Machine Learning, esto es especialmente relevante.&lt;/p&gt;

&lt;p&gt;Features bien diseñadas ayudan a:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mejorar la relación señal–ruido.&lt;/li&gt;
&lt;li&gt;Reducir el &lt;em&gt;overfitting&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Mejorar la capacidad de generalización.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Pro Tip:&lt;/strong&gt; En muchos escenarios prácticos, una mejora en la calidad de las &lt;em&gt;features&lt;/em&gt; tiene mayor impacto que cambiar de algoritmo.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🧩 ¿Cuál es la naturaleza del problema?
&lt;/h2&gt;

&lt;p&gt;Las transformaciones y estrategias dependen directamente de la naturaleza del problema. Algunos tipos comunes son:&lt;/p&gt;

&lt;h3&gt;
  
  
  📈 Problema de regresión
&lt;/h3&gt;

&lt;p&gt;Cuando el objetivo es predecir un valor numérico continuo (por ejemplo, el valor de un auto, un inmueble o una carta).&lt;/p&gt;

&lt;p&gt;El modelo estima una función:&lt;br&gt;
                       f(X) → y donde y ∈ ℝ&lt;/p&gt;

&lt;h3&gt;
  
  
  🏷️ Problema de clasificación
&lt;/h3&gt;

&lt;p&gt;Cuando el objetivo es predecir una categoría discreta (por ejemplo, fraude vs. no fraude, correo auténtico vs. spam).&lt;/p&gt;

&lt;p&gt;Aquí el modelo aprende &lt;strong&gt;fronteras de decisión&lt;/strong&gt; en el espacio de &lt;em&gt;features&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Puede tratarse de:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clasificación binaria
&lt;/li&gt;
&lt;li&gt;Clasificación multiclase
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En ambos casos, el objetivo es la categorización.&lt;/p&gt;

&lt;p&gt;Cada tipo de problema impone distintos criterios de evaluación, distintas transformaciones y distintas consideraciones estadísticas.&lt;/p&gt;

&lt;h3&gt;
  
  
  🏁 En síntesis
&lt;/h3&gt;

&lt;p&gt;El &lt;em&gt;Feature Engineering&lt;/em&gt; es el puente entre los datos crudos y la capacidad de realizar predicciones reales y efectivas.&lt;/p&gt;

&lt;p&gt;De nada sirve un modelo sofisticado si está alimentado con malas &lt;em&gt;features&lt;/em&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔄 Feature Transformation
&lt;/h2&gt;

&lt;p&gt;Las técnicas de transformación que apliquemos dependen directamente del tipo de dato con el que estemos trabajando y del objetivo del modelo. No intento desarrollar una tesis exhaustiva sobre el tema, sino establecer criterios técnicos que nos permitan tomar decisiones informadas al momento de convertir un dataset en un conjunto de &lt;em&gt;features&lt;/em&gt; útiles.&lt;/p&gt;

&lt;p&gt;En &lt;em&gt;Feature Transformation&lt;/em&gt; no existen recetas de cocina. La elección correcta depende de múltiples factores:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;La naturaleza del problema (regresión o clasificación).&lt;/li&gt;
&lt;li&gt;La distribución de los datos.&lt;/li&gt;
&lt;li&gt;El volumen de información disponible.&lt;/li&gt;
&lt;li&gt;El algoritmo que utilizaremos.&lt;/li&gt;
&lt;li&gt;Restricciones operativas como costo o latencia.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La transformación no es un proceso automático. En una ocasión formé parte de un equipo que recibió un dataset con el histórico de ventas de los últimos 14 años. A primera vista parecía un volumen considerable; sin embargo, al analizar la frecuencia real de transacciones por año, el tamaño efectivo de muestra era limitado.&lt;/p&gt;

&lt;p&gt;Esto impactaba directamente las decisiones de transformación y modelado, ya que ciertas técnicas requieren suficiente densidad estadística para aportar valor real.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧮 Transformaciones por tipo de variable
&lt;/h2&gt;

&lt;h3&gt;
  
  
  📊 Datos numéricos o cuantitativos
&lt;/h3&gt;

&lt;p&gt;Pueden ser discretos o continuos y suelen requerir tratamiento cuando presentan:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Diferencias significativas de escala.&lt;/li&gt;
&lt;li&gt;Distribuciones altamente asimétricas.&lt;/li&gt;
&lt;li&gt;Presencia de &lt;em&gt;outliers&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Valores faltantes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Técnicas comunes:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Imputación (media, mediana, modelos predictivos).&lt;/li&gt;
&lt;li&gt;Escalado (&lt;em&gt;Min-Max&lt;/em&gt; o estandarización &lt;em&gt;Z-score&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;Transformaciones logarítmicas o de potencia para reducir sesgo.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🏷️ Datos categóricos o cualitativos
&lt;/h3&gt;

&lt;p&gt;Representan atributos no numéricos y requieren conversión a formato numérico antes del entrenamiento.&lt;/p&gt;

&lt;p&gt;Se clasifican en:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Nominales&lt;/strong&gt;: no poseen orden inherente (por ejemplo, tipo de carta o categoría).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ordinales&lt;/strong&gt;: existe un orden lógico entre categorías (por ejemplo, nivel de rareza).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Técnicas utilizadas:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;One-Hot Encoding&lt;/em&gt; para variables nominales.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Ordinal Encoding&lt;/em&gt; cuando el orden tiene significado real.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Target Encoding&lt;/em&gt;, con especial cuidado para evitar &lt;strong&gt;data leakage&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Una mala codificación puede introducir relaciones artificiales o sesgos en el modelo, por lo que esta decisión debe ser cuidadosamente evaluada.&lt;/p&gt;




&lt;h3&gt;
  
  
  🧾 Datos de texto e imágenes
&lt;/h3&gt;

&lt;p&gt;No pueden ser utilizados directamente por la mayoría de los algoritmos tradicionales y requieren transformaciones más sofisticadas.&lt;/p&gt;

&lt;h4&gt;
  
  
  En texto:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Bag of Words&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;TF-IDF&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Embeddings&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  En imágenes:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Extracción de vectores de características.&lt;/li&gt;
&lt;li&gt;Representaciones generadas por redes convolucionales.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En ambos escenarios, el objetivo es transformar datos no estructurados en representaciones numéricas que capturen información semántica relevante.&lt;/p&gt;

&lt;p&gt;Existen numerosas técnicas adicionales. Me centraré principalmente en aquellas que utilicé en el esquema práctico del artículo y compartiré un listado de las más relevantes según el tipo de dato trabajado.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚙️ Técnicas aplicadas y justificación técnica
&lt;/h2&gt;

&lt;p&gt;El dataset base presenta una combinación de variables numéricas y categóricas, además de valores extremos que, tras el análisis exploratorio, no correspondían a ruido sino a comportamientos inherentes al dominio del problema.&lt;/p&gt;

&lt;p&gt;Este punto es crítico: &lt;strong&gt;no todo outlier debe eliminarse&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
En algunos casos representa señal relevante, y removerlo podría introducir sesgo o pérdida de información.&lt;/p&gt;

&lt;p&gt;A continuación, detallo las transformaciones aplicadas según el tipo de dato, junto con su justificación.&lt;/p&gt;




&lt;h3&gt;
  
  
  🏷️ Técnicas aplicadas a datos categóricos
&lt;/h3&gt;

&lt;h4&gt;
  
  
  🔹 One-Hot Encoding
&lt;/h4&gt;

&lt;p&gt;El &lt;em&gt;One-Hot Encoding&lt;/em&gt; se utiliza cuando trabajamos con variables categóricas nominales, es decir, aquellas donde no existe un orden inherente entre sus categorías.&lt;/p&gt;

&lt;p&gt;Asignar valores numéricos directos (por ejemplo, 1, 2, 3) a este tipo de variable introduce un orden artificial que el modelo puede interpretar como relación de magnitud, generando sesgos en el aprendizaje.&lt;/p&gt;

&lt;p&gt;La técnica consiste en:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Crear una columna binaria por cada categoría posible.&lt;/li&gt;
&lt;li&gt;Asignar valor &lt;strong&gt;1&lt;/strong&gt; cuando la categoría está presente.&lt;/li&gt;
&lt;li&gt;Asignar valor &lt;strong&gt;0&lt;/strong&gt; cuando no lo está.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;🧪 Ejemplo práctico&lt;/p&gt;

&lt;p&gt;Supongamos el atributo &lt;code&gt;type_1&lt;/code&gt; de un Pokémon, cuyos valores posibles son:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Fire&lt;/code&gt;, &lt;code&gt;Water&lt;/code&gt;, &lt;code&gt;Grass&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Después de aplicar &lt;em&gt;One-Hot Encoding&lt;/em&gt;, la representación se transforma de la siguiente manera:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pokémon&lt;/th&gt;
&lt;th&gt;type_1_Fire&lt;/th&gt;
&lt;th&gt;type_1_Water&lt;/th&gt;
&lt;th&gt;type_1_Grass&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Personaje 1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Personaje 2&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Personaje 3&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;Nota: Los personajes de Pokémon se utilizan con fines exclusivamente didácticos.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;✅ Resultado de la transformación&lt;/p&gt;

&lt;p&gt;Con esta técnica:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No se introduce un orden implícito entre categorías.&lt;/li&gt;
&lt;li&gt;Cada categoría es tratada como una dimensión independiente.&lt;/li&gt;
&lt;li&gt;Se evita que el modelo asuma relaciones inexistentes (por ejemplo, que &lt;em&gt;Fire&lt;/em&gt; sea “mayor” que &lt;em&gt;Water&lt;/em&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Si en lugar de esto se hubieran asignado valores secuenciales (1, 2, 3), un modelo lineal podría interpretar diferencias de magnitud entre categorías, lo cual no refleja la naturaleza real del dato.&lt;/p&gt;




&lt;h3&gt;
  
  
  ⚠️ Consideración sobre cardinalidad
&lt;/h3&gt;

&lt;p&gt;En este ejemplo, el atributo presenta baja cardinalidad, es decir, un número reducido de categorías posibles. En estos escenarios, &lt;em&gt;One-Hot Encoding&lt;/em&gt; es una técnica apropiada y computacionalmente manejable.&lt;/p&gt;

&lt;p&gt;Sin embargo, cuando trabajamos con variables de alta cardinalidad (por ejemplo, cientos o miles de categorías únicas), esta técnica puede:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Incrementar excesivamente la dimensionalidad.&lt;/li&gt;
&lt;li&gt;Aumentar el riesgo de &lt;em&gt;overfitting&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Elevar el costo computacional.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Este tipo de escenarios requiere estrategias alternativas.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔢 Ordinal Encoding
&lt;/h3&gt;

&lt;p&gt;Aunque esta técnica no fue aplicada en el dataset del caso práctico —porque no existían variables categóricas con orden inherente— es importante mencionarla, ya que forma parte del conjunto fundamental de herramientas en &lt;em&gt;Feature Transformation&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;El &lt;em&gt;Ordinal Encoding&lt;/em&gt; se utiliza cuando trabajamos con variables categóricas ordinales, es decir, cuando el orden entre las categorías tiene significado semántico y forma parte de la naturaleza del dato.&lt;/p&gt;

&lt;p&gt;A diferencia de las variables nominales, en este escenario asignar valores numéricos no introduce un sesgo artificial, siempre que el orden refleje correctamente la jerarquía real del atributo.&lt;/p&gt;

&lt;p&gt;🧪 Ejemplo práctico&lt;/p&gt;

&lt;p&gt;Un ejemplo clásico es el nivel de riesgo crediticio dentro del dominio financiero. Las categorías presentan un orden natural explícito definido por el negocio.&lt;/p&gt;

&lt;p&gt;Por ejemplo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Low Risk = 1
&lt;/li&gt;
&lt;li&gt;Medium Risk = 2
&lt;/li&gt;
&lt;li&gt;High Risk = 3
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mediante &lt;em&gt;Ordinal Encoding&lt;/em&gt;, cada categoría se transforma en un valor numérico que preserva la jerarquía del riesgo. De esta forma, el modelo puede interpretar correctamente que un cliente clasificado como &lt;em&gt;High Risk&lt;/em&gt; representa mayor riesgo que uno &lt;em&gt;Medium Risk&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Es importante notar que el objetivo no es modelar una distancia exacta entre categorías, sino capturar la relación de orden.&lt;/p&gt;

&lt;p&gt;⚠️ Consideraciones técnicas importantes&lt;/p&gt;

&lt;p&gt;Al aplicar &lt;em&gt;Ordinal Encoding&lt;/em&gt;, se debe validar cuidadosamente que:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;El orden asignado refleje fielmente la estructura del dominio.&lt;/li&gt;
&lt;li&gt;La codificación no introduzca interpretaciones erróneas de distancia si el modelo es sensible a magnitudes (por ejemplo, modelos lineales).&lt;/li&gt;
&lt;li&gt;No se asuma que la diferencia entre 1 y 2 es equivalente a la diferencia entre 2 y 3, salvo que la representación real del problema lo respalde.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En síntesis, el &lt;em&gt;Ordinal Encoding&lt;/em&gt; es una técnica adecuada cuando el orden es parte intrínseca del dato.&lt;br&gt;&lt;br&gt;
De haber existido y sido relevante la evolución del personaje (primera, segunda o tercera evolución), esta técnica habría sido apropiada.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Pro Tip:&lt;/strong&gt; La clave no está en convertir categorías en números, sino en respetar la semántica real del problema.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  📊 Técnicas para datos numéricos
&lt;/h2&gt;

&lt;p&gt;Las variables numéricas suelen concentrar gran parte de la señal predictiva, pero también son las que más fácilmente pueden introducir sesgos si no se transforman adecuadamente.&lt;/p&gt;

&lt;p&gt;A continuación, presento un resumen de las técnicas más relevantes y posteriormente profundizaremos en las utilizadas en el caso práctico.&lt;/p&gt;

&lt;h3&gt;
  
  
  📋 Resumen de técnicas
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Técnica&lt;/th&gt;
&lt;th&gt;¿Qué hace?&lt;/th&gt;
&lt;th&gt;¿Cuándo aplicar?&lt;/th&gt;
&lt;th&gt;Fórmula&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Imputation&lt;/td&gt;
&lt;td&gt;Sustituye valores nulos o ausentes&lt;/td&gt;
&lt;td&gt;Datos con valores faltantes&lt;/td&gt;
&lt;td&gt;Media, mediana, moda o valor constante&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Log / Log1p&lt;/td&gt;
&lt;td&gt;Reduce asimetría y comprime valores extremos&lt;/td&gt;
&lt;td&gt;Variables &lt;em&gt;long-tail&lt;/em&gt;, precios, conteos&lt;/td&gt;
&lt;td&gt;log1p(x) = ln(1 + x)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Standardization&lt;/td&gt;
&lt;td&gt;Centra y escala por desviación estándar&lt;/td&gt;
&lt;td&gt;Modelos sensibles a escala (regresión, PCA)&lt;/td&gt;
&lt;td&gt;(x − μ) / σ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Min-Max Scaling&lt;/td&gt;
&lt;td&gt;Escala a un rango fijo (ej. 0–1)&lt;/td&gt;
&lt;td&gt;Cuando se requiere preservar proporciones&lt;/td&gt;
&lt;td&gt;(x − min) / (max − min)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Robust Scaling&lt;/td&gt;
&lt;td&gt;Usa estadísticos robustos frente a outliers&lt;/td&gt;
&lt;td&gt;Datos con valores extremos frecuentes&lt;/td&gt;
&lt;td&gt;(x − mediana) / IQR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Clipping / Capping&lt;/td&gt;
&lt;td&gt;Limita valores extremos a umbrales definidos&lt;/td&gt;
&lt;td&gt;Control de outliers por reglas de negocio&lt;/td&gt;
&lt;td&gt;x = min(max(x, l), u)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Binning&lt;/td&gt;
&lt;td&gt;Convierte variables continuas en intervalos&lt;/td&gt;
&lt;td&gt;Capturar relaciones no lineales&lt;/td&gt;
&lt;td&gt;Discretización por rangos&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  🧮 Imputation (Imputación de valores faltantes)
&lt;/h3&gt;

&lt;p&gt;La imputación es una de las primeras transformaciones que deben abordarse en cualquier pipeline de &lt;em&gt;Feature Engineering&lt;/em&gt;. Muchos algoritmos de Machine Learning no manejan valores nulos de forma nativa; ignorarlos o eliminar registros indiscriminadamente puede reducir el tamaño efectivo de la muestra y alterar la distribución original de los datos.&lt;/p&gt;

&lt;p&gt;La elección del método debe basarse en la distribución de la variable y en el contexto del dominio.&lt;/p&gt;

&lt;p&gt;🧪 Ejemplo: impacto de media vs mediana&lt;/p&gt;

&lt;p&gt;Supongamos una variable que representa el valor de venta (en miles):&lt;/p&gt;

&lt;p&gt;[10, 12, 11, 13, 12, 200]&lt;/p&gt;

&lt;p&gt;Aquí existe un valor extremo (200).&lt;/p&gt;

&lt;h4&gt;
  
  
  Cálculo de la media
&lt;/h4&gt;

&lt;p&gt;Media = (10 + 12 + 11 + 13 + 12 + 200) / 6&lt;br&gt;&lt;br&gt;
Media = 258 / 6 = 43&lt;/p&gt;

&lt;h4&gt;
  
  
  Cálculo de la mediana
&lt;/h4&gt;

&lt;p&gt;Ordenando los valores:&lt;/p&gt;

&lt;p&gt;[10, 11, 12, 12, 13, 200]&lt;/p&gt;

&lt;p&gt;La mediana es el promedio de los valores centrales (12 y 12):&lt;/p&gt;

&lt;p&gt;Mediana = 12&lt;/p&gt;

&lt;p&gt;🔎 Observación técnica&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;La media (43) se ve fuertemente desplazada por el outlier.&lt;/li&gt;
&lt;li&gt;La mediana (12) representa mejor el comportamiento típico del conjunto.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Si imputáramos valores faltantes usando la media, estaríamos introduciendo un valor artificialmente alto respecto a la mayoría de los datos. En cambio, la mediana preserva mejor la tendencia central cuando la distribución es asimétrica o presenta valores extremos.&lt;/p&gt;




&lt;h3&gt;
  
  
  📌 Técnicas de imputación más utilizadas
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Imputación por la media&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Adecuada cuando la distribución es aproximadamente normal y no existen outliers significativos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Imputación por la mediana&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Más robusta ante asimetrías y valores extremos. Es una de las más utilizadas en datasets reales.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Imputación por la moda&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Más común en variables categóricas o discretizadas.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Imputación con valor constante&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Útil cuando el valor faltante tiene significado propio (por ejemplo, “sin historial”).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Imputación basada en modelos (KNN, regresión)&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Utiliza la relación entre variables para estimar valores faltantes de forma más informada. Es más compleja, pero potencialmente más precisa.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;⚠️ Consideración crítica&lt;/p&gt;

&lt;p&gt;La imputación no es una simple operación matemática; introduce supuestos estadísticos sobre la distribución de los datos. Cada método modifica la varianza, la media o incluso la estructura de correlación entre variables.&lt;/p&gt;

&lt;p&gt;Por ello, la decisión debe alinearse con:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;La naturaleza estadística de la variable.&lt;/li&gt;
&lt;li&gt;El volumen de datos disponibles.&lt;/li&gt;
&lt;li&gt;El impacto que puede tener en el modelo final.&lt;/li&gt;
&lt;li&gt;El contexto del negocio.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Una imputación mal elegida puede distorsionar la señal original más que los valores faltantes que intenta corregir.&lt;/p&gt;




&lt;h3&gt;
  
  
  📉 Transformaciones logarítmicas (log / log1p)
&lt;/h3&gt;

&lt;p&gt;Las transformaciones logarítmicas son ampliamente utilizadas en &lt;em&gt;Feature Engineering&lt;/em&gt; para reducir la asimetría (&lt;em&gt;skewness&lt;/em&gt;) de variables numéricas y comprimir valores extremos.&lt;/p&gt;

&lt;p&gt;Resultan especialmente útiles cuando una pequeña fracción de observaciones concentra valores significativamente más altos que el resto, situación común en precios, conteos, ingresos o métricas de uso.&lt;/p&gt;

&lt;p&gt;En el análisis del dataset de cartas Pokémon, esta técnica fue aplicada durante la estandarización de los precios. La distribución presentaba un comportamiento &lt;em&gt;long-tail&lt;/em&gt;: la mayoría de las cartas tenía precios bajos o moderados, mientras que unas pocas alcanzaban valores considerablemente altos.&lt;/p&gt;

&lt;p&gt;Sin una transformación adecuada, estos valores extremos podrían dominar el entrenamiento y distorsionar el ajuste del modelo, especialmente en algoritmos sensibles a magnitudes.&lt;/p&gt;




&lt;h3&gt;
  
  
  🔎 ¿Qué es log1p?
&lt;/h3&gt;

&lt;p&gt;La transformación &lt;em&gt;log1p&lt;/em&gt; se define como:&lt;/p&gt;

&lt;p&gt;log1p(x) = ln(1 + x)&lt;/p&gt;

&lt;p&gt;Se prefiere sobre la transformación tradicional &lt;code&gt;ln(x)&lt;/code&gt; por varias razones técnicas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Permite manejar valores iguales a cero sin generar errores matemáticos.&lt;/li&gt;
&lt;li&gt;Ofrece mayor estabilidad numérica en rangos pequeños.&lt;/li&gt;
&lt;li&gt;Es adecuada para distribuciones &lt;em&gt;long-tail&lt;/em&gt; típicas en precios, ingresos o conteos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mientras que &lt;code&gt;ln(0)&lt;/code&gt; es indefinido, &lt;code&gt;ln(1 + 0) = 0&lt;/code&gt;, lo que evita problemas durante el preprocesamiento.&lt;/p&gt;

&lt;p&gt;🧪 Ejemplo práctico&lt;/p&gt;

&lt;p&gt;Supongamos los siguientes precios:&lt;/p&gt;

&lt;p&gt;x = [0, 5, 20, 100, 1000]&lt;/p&gt;

&lt;p&gt;Al aplicar la transformación:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Valor original (x)&lt;/th&gt;
&lt;th&gt;log1p(x) = ln(1 + x)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0.000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;1.792&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;3.045&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;4.615&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1000&lt;/td&gt;
&lt;td&gt;6.909&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;📊 Interpretación del resultado&lt;/p&gt;

&lt;p&gt;Observaciones clave:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;El valor 0 no genera errores.&lt;/li&gt;
&lt;li&gt;Las distancias entre valores altos se comprimen significativamente.&lt;/li&gt;
&lt;li&gt;El orden relativo se mantiene (1000 sigue siendo mayor que 100).&lt;/li&gt;
&lt;li&gt;La distribución resultante es más balanceada y menos sesgada.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Por ejemplo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Diferencia original entre 100 y 1000 → 900
&lt;/li&gt;
&lt;li&gt;Diferencia después de log1p → aproximadamente 2.29
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esto reduce la dominancia de valores extremos sin perder información ordinal.&lt;/p&gt;

&lt;p&gt;🎯 Casos de uso típicos&lt;/p&gt;

&lt;p&gt;Las transformaciones logarítmicas son especialmente útiles en:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Costos y precios.&lt;/li&gt;
&lt;li&gt;Volúmenes de transacciones.&lt;/li&gt;
&lt;li&gt;Frecuencia de eventos.&lt;/li&gt;
&lt;li&gt;Métricas financieras o de uso acumulativo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En términos prácticos, aplicar &lt;code&gt;log1p&lt;/code&gt; no elimina la señal de valores altos; la reescala para que el modelo pueda aprender patrones más estables.&lt;/p&gt;

&lt;p&gt;Es una transformación matemática simple, pero con impacto significativo en estabilidad y capacidad de generalización.&lt;/p&gt;

&lt;h1&gt;
  
  
  🛠️ Camino al dataset &lt;em&gt;model-ready&lt;/em&gt;
&lt;/h1&gt;

&lt;p&gt;Seré muy honesta: aplicar transformaciones dentro de la herramienta es, en sí mismo, un proceso operativo sencillo. Basta con seleccionar la transformación, elegir la técnica adecuada y definir los parámetros correspondientes. Desde el punto de vista técnico, el flujo es claro y accesible.&lt;/p&gt;

&lt;p&gt;Lo verdaderamente complejo no es la herramienta, sino el manejo del dataset.&lt;/p&gt;

&lt;p&gt;Cuando trabajamos con datos reales, aparecen inevitablemente los desafíos propios de entornos productivos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Valores inconsistentes.&lt;/li&gt;
&lt;li&gt;Registros mal tipados.&lt;/li&gt;
&lt;li&gt;Categorías mal formateadas.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Outliers&lt;/em&gt; que no son ruido, sino comportamiento legítimo del negocio.&lt;/li&gt;
&lt;li&gt;Casos excepcionales que no resultan evidentes en una primera revisión.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Es durante la construcción del flujo cuando se hace evidente que existen factores no considerados inicialmente. Esto obliga a iterar: revisar, ajustar, deshacer transformaciones, validar nuevamente y reconstruir el pipeline.&lt;/p&gt;

&lt;p&gt;Este proceso iterativo no es señal de error, sino parte natural del ciclo de ingeniería de datos.&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Pro Tip:&lt;/strong&gt; Antes de aplicar cualquier transformación estructural —como un &lt;em&gt;One-Hot Encoding&lt;/em&gt;— es indispensable revisar los datos exhaustivamente.&lt;br&gt;&lt;br&gt;
Herramientas como &lt;em&gt;Data Wrangler&lt;/em&gt; incorporan capacidades de análisis visual que permiten observar distribuciones, detectar anomalías y validar supuestos antes de modificar el espacio de &lt;em&gt;features&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;En mi caso particular, identifiqué un único valor numérico dentro de una variable categórica que había pasado desapercibido. Ese solo registro fue suficiente para provocar un error durante la aplicación del &lt;em&gt;One-Hot Encoding&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Este tipo de situaciones refuerza una lección fundamental: &lt;strong&gt;la calidad del encoding depende directamente de la limpieza previa del dato.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🧩 Tratamiento de la variable &lt;code&gt;extrarity&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;En el dataset, &lt;code&gt;extrarity&lt;/code&gt; es una variable categórica relevante para el modelo. Sin embargo, presenta un &lt;strong&gt;10,32 % de valores nulos&lt;/strong&gt;, lo que obliga a intervenirla antes de aplicar cualquier técnica de codificación.&lt;/p&gt;

&lt;p&gt;Dado que su cardinalidad es baja, el &lt;em&gt;One-Hot Encoding&lt;/em&gt; es una técnica adecuada y no genera una expansión excesiva del espacio de características.&lt;/p&gt;




&lt;h3&gt;
  
  
  1️⃣ Tratamiento de valores nulos
&lt;/h3&gt;

&lt;p&gt;El primer paso consistió en crear una categoría explícita para los valores faltantes, asignando el valor:  &lt;strong&gt;unknown&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Esta decisión técnica permite:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Evitar la pérdida de registros.&lt;/li&gt;
&lt;li&gt;Preservar el tamaño de muestra.&lt;/li&gt;
&lt;li&gt;Hacer explícita la ausencia de información.&lt;/li&gt;
&lt;li&gt;Permitir que el modelo determine si la falta de dato tiene valor predictivo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Es importante entender que un valor faltante no siempre es irrelevante; en ciertos contextos, la ausencia de información puede estar correlacionada con el comportamiento objetivo.&lt;/p&gt;

&lt;p&gt;Para implementarlo, se agregó una transformación visual en &lt;em&gt;Data Wrangler&lt;/em&gt; destinada al manejo de valores nulos, especificando el reemplazo por la categoría definida.&lt;/p&gt;

&lt;p&gt;Con esto, se garantiza consistencia antes de aplicar el &lt;em&gt;One-Hot Encoding&lt;/em&gt; en etapas posteriores del pipeline.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fes4h8h6kejr16qd4wf0l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fes4h8h6kejr16qd4wf0l.png" alt=" " width="598" height="684"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🔄 Aplicación de One-Hot Encoding
&lt;/h2&gt;

&lt;p&gt;Una vez tratados los valores faltantes en &lt;code&gt;extrarity&lt;/code&gt;, la variable queda lista para aplicar &lt;em&gt;One-Hot Encoding&lt;/em&gt; sin riesgo de errores derivados de nulos o inconsistencias tipológicas.&lt;/p&gt;

&lt;p&gt;En esta etapa es fundamental definir correctamente el formato de salida (&lt;em&gt;output style&lt;/em&gt;), ya que esta decisión impacta la interpretabilidad, la reutilización y la integración del dataset en etapas posteriores del pipeline.&lt;/p&gt;

&lt;p&gt;📦 Selección del formato de salida&lt;/p&gt;

&lt;p&gt;En este caso, se seleccionó el &lt;strong&gt;formato columnar&lt;/strong&gt;, por las siguientes razones:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;El formato vectorial suele emplearse en escenarios de &lt;em&gt;deep learning&lt;/em&gt; o en pipelines cerrados donde la interpretabilidad no es prioritaria y el consumo lo realiza directamente un modelo.&lt;/li&gt;
&lt;li&gt;El formato columnar es preferido cuando las &lt;em&gt;features&lt;/em&gt; deben ser:

&lt;ul&gt;
&lt;li&gt;Interpretables.&lt;/li&gt;
&lt;li&gt;Reutilizables.&lt;/li&gt;
&lt;li&gt;Persistidas en un &lt;em&gt;Feature Store&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Inspeccionadas por equipos de datos o negocio.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;En términos prácticos, “salida en columnas” significa que cada categoría se convierte en una columna independiente, manteniendo un prefijo asociado al nombre original de la variable.&lt;/p&gt;

&lt;p&gt;Por ejemplo, si la variable es &lt;code&gt;extrarity&lt;/code&gt;, las nuevas columnas podrían materializarse como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;extrarity_common&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;extrarity_rare&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;extrarity_ultra_rare&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;extrarity_unknown&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🧭 Buenas prácticas
&lt;/h3&gt;

&lt;p&gt;Conservar el prefijo del nombre original de la variable no es un detalle menor. Esta práctica:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Facilita la trazabilidad de las &lt;em&gt;features&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Mejora la legibilidad del dataset transformado.&lt;/li&gt;
&lt;li&gt;Reduce ambigüedad cuando existen múltiples variables categóricas.&lt;/li&gt;
&lt;li&gt;Simplifica el mantenimiento y la reutilización en otros modelos o proyectos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En entornos productivos, donde múltiples pipelines conviven, la nomenclatura consistente es parte de la gobernanza de datos.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Pro Tip:&lt;/strong&gt; Es prácticamente inevitable realizar ajustes durante la construcción del pipeline.&lt;br&gt;&lt;br&gt;
En &lt;em&gt;Data Wrangler&lt;/em&gt; no es posible insertar directamente un nodo intermedio en la vista visual sin que se genere una nueva rama del flujo.&lt;br&gt;
La forma correcta de aplicar una corrección consiste en:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ir a la vista &lt;strong&gt;Data&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Localizar el listado de transformaciones aplicadas.&lt;/li&gt;
&lt;li&gt;Crear el nuevo paso intermedio.&lt;/li&gt;
&lt;li&gt;Reordenarlo arrastrándolo hasta la posición adecuada dentro del flujo.
Este enfoque permite mantener un pipeline limpio, reproducible y coherente, evitando bifurcaciones innecesarias que puedan dificultar la trazabilidad del proceso de transformación.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0mi933h90ppwzo0hjqgf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0mi933h90ppwzo0hjqgf.png" alt=" " width="586" height="892"&gt;&lt;/a&gt;&lt;br&gt;
Veamos ahora como se ven las columnas &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo0nh0bsal4uy9v8yp25b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo0nh0bsal4uy9v8yp25b.png" alt=" " width="800" height="233"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8t02h1drfabw04rymim3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8t02h1drfabw04rymim3.png" alt=" " width="598" height="850"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fincz04hg8nrepdvg3y3j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fincz04hg8nrepdvg3y3j.png" alt=" " width="586" height="528"&gt;&lt;/a&gt;&lt;br&gt;
El nuevo flujo es este como pueden ver no hay errores&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhlj65q8fpw3e2pj7rhf9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhlj65q8fpw3e2pj7rhf9.png" alt=" " width="800" height="424"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🔐 La importancia de la llave primaria antes de registrar en el Feature Store
&lt;/h2&gt;

&lt;p&gt;Después de aplicar las transformaciones sobre las variables categóricas y numéricas, el siguiente paso fue registrar el dataset en el Feature Store para definir explícitamente qué columnas correspondían a features y cuáles no.&lt;/p&gt;

&lt;p&gt;Fue en ese momento cuando surgió un problema crítico: el dataset no contaba con una llave única por registro.&lt;/p&gt;

&lt;p&gt;Un Feature Store requiere identificar cada entidad de forma inequívoca. Si no es posible distinguir cada fila de manera única, no se puede:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Versionar correctamente los datos.&lt;/li&gt;
&lt;li&gt;Actualizar registros sin ambigüedad.&lt;/li&gt;
&lt;li&gt;Garantizar integridad en entrenamiento e inferencia.&lt;/li&gt;
&lt;li&gt;Evitar sobrescrituras accidentales.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En otras palabras, sin clave primaria, el pipeline pierde trazabilidad y consistencia.&lt;/p&gt;

&lt;p&gt;🔎 Identificación del problema&lt;/p&gt;

&lt;p&gt;Al revisar el dataset en detalle, se evidenció que no existía una columna que identificara de forma única cada carta. Esto implicaba que, aunque las features estuvieran correctamente transformadas, el registro en el Feature Store sería inconsistente.&lt;/p&gt;

&lt;p&gt;Era necesario crear una llave compuesta, pero no podía ser arbitraria. La clave debía construirse a partir de atributos que, combinados, garantizaran unicidad real dentro del dominio.&lt;/p&gt;

&lt;p&gt;🧩 Construcción de la llave compuesta&lt;/p&gt;

&lt;p&gt;Al recorrer el dataset, cada carta contenía:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;product_id&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;extNumber&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Si bien &lt;code&gt;product_id&lt;/code&gt; por sí solo no era único, la combinación con &lt;code&gt;extNumber&lt;/code&gt; —que representa una numeración del tipo &lt;code&gt;###/###&lt;/code&gt;— sí permitía diferenciar cada carta de forma inequívoca.&lt;/p&gt;

&lt;p&gt;Se creó entonces una nueva columna llave compuesta:&lt;br&gt;
card_id = product_id + "_" + extNumber&lt;/p&gt;

&lt;p&gt;Esta columna:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No es una feature.&lt;/li&gt;
&lt;li&gt;No participa en el entrenamiento del modelo.&lt;/li&gt;
&lt;li&gt;No aporta señal predictiva.&lt;/li&gt;
&lt;li&gt;Su propósito es exclusivamente identificador.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sin embargo, es fundamental para la arquitectura del sistema.&lt;/p&gt;

&lt;h3&gt;
  
  
  🧹 Eliminación de duplicados
&lt;/h3&gt;

&lt;p&gt;La validación de la nueva llave reveló registros duplicados en el dataset. Esto confirmaba que el problema no era solo la ausencia de clave primaria, sino también la presencia de filas repetidas.&lt;/p&gt;

&lt;p&gt;Por lo tanto, fue necesario:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Validar la unicidad de la nueva llave.&lt;/li&gt;
&lt;li&gt;Eliminar registros duplicados.&lt;/li&gt;
&lt;li&gt;Confirmar que cada fila representara una entidad única.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Solo después de garantizar integridad y unicidad, el dataset quedó en condiciones adecuadas para su registro en el Feature Store.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Pro Tip:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Antes de optimizar features, debemos garantizar identidad e integridad de la entidad.&lt;br&gt;&lt;br&gt;
Un modelo puede estar estadísticamente bien construido, pero si la estructura de identificación es incorrecta, todo el trabajo previo pierde validez operacional.&lt;br&gt;&lt;br&gt;
En este caso, &lt;code&gt;card_id&lt;/code&gt; no es una feature, pero es el pilar que permite que todas las features tengan contexto y consistencia dentro del sistema.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;📦 Exportación a S3&lt;/p&gt;

&lt;p&gt;Aunque Data Wrangler permite continuar el flujo directamente en Canvas, en este laboratorio se optó por exportar el dataset a Amazon S3 para mantener control explícito sobre los datos y preparar las features para su registro en el Feature Store.&lt;/p&gt;

&lt;p&gt;Se seleccionó el formato &lt;strong&gt;Parquet&lt;/strong&gt;, adecuado para:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Almacenamiento columnar eficiente.&lt;/li&gt;
&lt;li&gt;Compresión optimizada.&lt;/li&gt;
&lt;li&gt;Compatibilidad con procesos analíticos y entrenamiento.&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  🏗 Feature Store como cierre arquitectónico del pipeline
&lt;/h1&gt;

&lt;p&gt;Una vez que las variables fueron limpiadas, imputadas, transformadas y validadas, surge una pregunta fundamental desde una perspectiva de producción:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;¿Cómo garantizamos que estas mismas transformaciones se mantengan consistentes en futuros reentrenamientos y en escenarios de inferencia?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Aquí es donde el uso de un Feature Store deja de ser opcional y se convierte en una decisión arquitectónica.&lt;/p&gt;

&lt;h2&gt;
  
  
  📚 ¿Qué es un Feature Store?
&lt;/h2&gt;

&lt;p&gt;Un Feature Store es un componente dentro de la arquitectura de Machine Learning cuyo propósito es:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Centralizar features ya transformadas.&lt;/li&gt;
&lt;li&gt;Versionarlas y gobernarlas.&lt;/li&gt;
&lt;li&gt;Servirlas de forma consistente para entrenamiento e inferencia.&lt;/li&gt;
&lt;li&gt;Separar la ingeniería de features del código del modelo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En entornos AWS, este rol lo cumple &lt;strong&gt;Amazon SageMaker Feature Store&lt;/strong&gt;, que permite administrar features como activos de primera clase dentro del ciclo de vida del modelo.&lt;/p&gt;

&lt;p&gt;El beneficio principal es eliminar riesgos clásicos como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Data leakage&lt;/em&gt; por transformaciones inconsistentes.&lt;/li&gt;
&lt;li&gt;Desalineación entre entrenamiento y producción.&lt;/li&gt;
&lt;li&gt;Reprocesamiento manual repetitivo.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🗂 Feature Group: la unidad lógica
&lt;/h2&gt;

&lt;p&gt;Dentro del Feature Store existe un concepto clave: el &lt;strong&gt;Feature Group&lt;/strong&gt;, que es la unidad lógica donde se almacenan las features asociadas a una entidad.&lt;/p&gt;

&lt;p&gt;Si el Feature Store es el repositorio central, el Feature Group es la “tabla estructurada” que contiene:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;El identificador único de la entidad (&lt;em&gt;Record Identifier&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;El timestamp del evento (&lt;em&gt;Event Time&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;El conjunto de features relacionadas.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Pro Tip:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Un Feature Group funciona conceptualmente como una tabla versionada con control temporal.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Al crearlo, se deben definir explícitamente:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Record Identifier Name&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
En este caso: &lt;code&gt;card_id&lt;/code&gt;&lt;br&gt;&lt;br&gt;
→ Identifica de forma única cada carta.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Event Time Feature Name&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
→ Permite versionar las features en el tiempo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Feature Definitions&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
→ Nombre y tipo de dato exacto de cada columna.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;El esquema actúa como un contrato. Si el dataset no coincide exactamente con esa definición, el servicio devolverá un error de validación.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔄 Separación entre features estáticas y dinámicas (mejor práctica)
&lt;/h2&gt;

&lt;p&gt;Una decisión arquitectónica relevante fue separar las features según su naturaleza temporal.&lt;/p&gt;

&lt;h4&gt;
  
  
  1️⃣ Feature Group Estático
&lt;/h4&gt;

&lt;p&gt;Contiene atributos que no cambian en el tiempo, por ejemplo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rareza (&lt;code&gt;rarity&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Características físicas de la carta&lt;/li&gt;
&lt;li&gt;Identificadores estructurales&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Estas features se registran una sola vez por entidad.&lt;/p&gt;

&lt;h3&gt;
  
  
  2️⃣ Feature Group Dinámico
&lt;/h3&gt;

&lt;p&gt;Contiene variables que evolucionan en el tiempo, como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Precios históricos&lt;/li&gt;
&lt;li&gt;Métricas agregadas temporales&lt;/li&gt;
&lt;li&gt;Indicadores de mercado&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Estas features requieren versionamiento temporal.&lt;/p&gt;

&lt;p&gt;Esta separación sigue una buena práctica en sistemas ML productivos: desacoplar identidad estructural de señales dependientes del tiempo.&lt;/p&gt;

&lt;p&gt;🆔 Identificación única: &lt;code&gt;card_id&lt;/code&gt; + &lt;code&gt;timestamp&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Para que el Feature Store funcione correctamente, cada registro debe tener:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Record Identifier (Primary Key)&lt;/strong&gt; → &lt;code&gt;card_id&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Event Time&lt;/strong&gt; → &lt;code&gt;timestamp&lt;/code&gt; que indica cuándo esa versión del feature fue válida&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;En el Feature Store, &lt;code&gt;record_identifier_name&lt;/code&gt; y &lt;code&gt;event_time_feature_name&lt;/code&gt; son obligatorios en cada Feature Group.&lt;/p&gt;

&lt;p&gt;⚠ Consideraciones críticas al crear Feature Groups&lt;/p&gt;

&lt;p&gt;Al crear los Feature Groups es obligatorio definir:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nombre exacto de cada columna.&lt;/li&gt;
&lt;li&gt;Tipo de dato correcto.&lt;/li&gt;
&lt;li&gt;Campo identificador.&lt;/li&gt;
&lt;li&gt;Campo temporal.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Si existe cualquier discrepancia entre el esquema declarado y el dataset cargado, el servicio devolverá un error de validación.&lt;/p&gt;

&lt;h3&gt;
  
  
  🚀 Carga (ingestión) de datos
&lt;/h3&gt;

&lt;p&gt;El siguiente paso natural es poblar los Feature Groups mediante cargas en Python, normalmente desde SageMaker Studio.&lt;/p&gt;

&lt;p&gt;El flujo típico consiste en:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Crear el Feature Group.&lt;/li&gt;
&lt;li&gt;Esperar a que el estado sea &lt;code&gt;Created&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Ejecutar la ingestión mediante &lt;code&gt;ingest()&lt;/code&gt; o &lt;code&gt;PutRecord&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Validar almacenamiento en:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Online Store&lt;/strong&gt; (para inferencia en tiempo real).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Offline Store en S3&lt;/strong&gt; (para entrenamiento).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  🎯 Conclusión
&lt;/h1&gt;

&lt;p&gt;En proyectos de Machine Learning, el desempeño del modelo suele acaparar la atención. Sin embargo, la verdadera complejidad reside en la calidad estructural de los datos y en la arquitectura que garantiza su consistencia a lo largo del tiempo.&lt;/p&gt;

&lt;p&gt;A lo largo de este trabajo se abordaron transformaciones estadísticas necesarias —imputación robusta, reducción de asimetrías y estabilización de varianza— pero el aprendizaje más relevante surgió al enfrentar problemas de identidad, unicidad y versionamiento.&lt;/p&gt;

&lt;p&gt;La creación de una llave compuesta (&lt;code&gt;card_id&lt;/code&gt;), la eliminación de duplicados y la validación de integridad no fueron ajustes menores: fueron decisiones que aseguraron trazabilidad y coherencia sistémica.&lt;/p&gt;

&lt;p&gt;La adopción de &lt;strong&gt;Amazon SageMaker Feature Store&lt;/strong&gt; permitió estructurar las features como activos gobernados, separando atributos estáticos de dinámicos y modelando explícitamente la dimensión temporal mediante &lt;code&gt;event_time&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Este ejercicio reafirma principios fundamentales:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sin identidad única no existe sistema confiable.&lt;/li&gt;
&lt;li&gt;Sin modelado temporal no existe control sobre la evolución del dato.&lt;/li&gt;
&lt;li&gt;Sin contratos de esquema no existe gobernanza.&lt;/li&gt;
&lt;li&gt;Y sin gobernanza, no existe producción sostenible.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;El resultado no es únicamente un conjunto de features preparadas, sino una arquitectura preparada para escalar, evolucionar y sostener modelos en entornos reales.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>aws</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>Diario de una builder: Preparándonos para AWS Machine Learning desde cero – Otro camino para llegar a Roma</title>
      <dc:creator>Diana Castro</dc:creator>
      <pubDate>Mon, 29 Dec 2025 00:37:27 +0000</pubDate>
      <link>https://dev.to/aws-builders/diario-de-una-builder-preparandonos-para-aws-machine-learning-desde-cero-otro-camino-para-llegar-2iek</link>
      <guid>https://dev.to/aws-builders/diario-de-una-builder-preparandonos-para-aws-machine-learning-desde-cero-otro-camino-para-llegar-2iek</guid>
      <description>&lt;p&gt;Tal y como mencionaba en el artículo &lt;strong&gt;Preparando datos&lt;/strong&gt;, lo más importante es ser consciente de qué herramienta utilizar en cada escenario. Todo depende del caso de uso, la experticia del equipo, el tiempo disponible y el nivel de complejidad; al final, siempre se trata de &lt;em&gt;trade-offs&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Con el objetivo de tener un panorama lo más completo posible, en este laboratorio exploraremos &lt;strong&gt;otro camino para llegar a Roma&lt;/strong&gt;. En esta ocasión utilizaremos &lt;strong&gt;AWS Glue de principio a fin&lt;/strong&gt; para preparar nuestro ya conocido dataset de tarjetas. El enfoque será distinto: esta vez me centraré en el &lt;strong&gt;proceso&lt;/strong&gt;, ya que el análisis del dataset lo abordamos previamente en el artículo mencionado.&lt;/p&gt;

&lt;p&gt;La intención es recorrer el &lt;strong&gt;flujo completo&lt;/strong&gt;, desde que un nuevo archivo es escrito en &lt;strong&gt;Amazon S3&lt;/strong&gt; hasta que los datos quedan disponibles para su consumo analítico. Para ello, construiremos un &lt;strong&gt;pipeline&lt;/strong&gt; que se dispare automáticamente ante la llegada de nuevos datos, ejecute las transformaciones necesarias y actualice los metadatos en el catálogo.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧩 Componentes del laboratorio
&lt;/h2&gt;

&lt;p&gt;Para este laboratorio utilizaremos los siguientes componentes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;🪣 &lt;strong&gt;Amazon S3&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Como almacenamiento de los datasets para fines académicos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;⏱️ &lt;strong&gt;Amazon EventBridge&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Encargado de disparar el proceso de transformación ante la llegada de un nuevo archivo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;🔁 &lt;strong&gt;AWS Glue Workflow&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Responsable de la orquestación y de definir la secuencia de pasos necesarios para una limpieza, transformación y entrega exitosa.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;🛠️ &lt;strong&gt;AWS Glue Job&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Donde se realizan las limpiezas y transformaciones básicas de los datos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;🗂️ &lt;strong&gt;AWS Glue Crawler&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Encargado de poblar y actualizar el &lt;strong&gt;Data Catalog&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ⚙️ Algunas decisiones técnicas
&lt;/h2&gt;

&lt;p&gt;Ahora que conocemos las herramientas que nos apoyarán, el siguiente diagrama define de forma conceptual la &lt;strong&gt;arquitectura&lt;/strong&gt; que soporta el flujo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff5os06x53jj9wqs7c7bv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff5os06x53jj9wqs7c7bv.png" alt=" " width="612" height="672"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En este caso de uso no conocemos de antemano el momento en el que ingresarán nuevos archivos para ser procesados. No existe una periodicidad definida: los archivos se cargarán conforme se disponga de nuevos datos. No hay un proceso que deposite información cada 24 horas ni una fuente que genere archivos de forma continua.&lt;/p&gt;

&lt;p&gt;Bajo estas condiciones, una &lt;strong&gt;arquitectura orientada a eventos&lt;/strong&gt; es la opción más adecuada. Con este enfoque, el procesamiento ocurre únicamente cuando es necesario, evitando ejecuciones innecesarias y consumo de recursos en vano. &lt;em&gt;Archivo nuevo, ejecución nueva&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Para lograr este desacople, &lt;strong&gt;Amazon EventBridge&lt;/strong&gt; actúa como la capa intermedia del flujo. Esto nos permite aislar la ingesta del procesamiento y nos da flexibilidad ante cambios futuros. Hoy el evento dispara un &lt;strong&gt;Glue Workflow&lt;/strong&gt;; mañana podría activar otros destinos o incluso múltiples flujos en paralelo, sin necesidad de rediseñar la arquitectura.&lt;/p&gt;

&lt;p&gt;Los &lt;strong&gt;pipelines event-driven&lt;/strong&gt; son ampliamente utilizados porque:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⚡ Se integran de forma natural con arquitecturas &lt;em&gt;serverless&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;🧩 Reducen la complejidad operativa.&lt;/li&gt;
&lt;li&gt;⏳ Evitan dependencias temporales artificiales.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En nuestro caso, los datos se procesan cuando llegan. Si no llega nada, no hay ejecuciones ni consumo de recursos asociados.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔁 Orquestación con Glue Workflow
&lt;/h2&gt;

&lt;p&gt;Otro elemento clave del flujo es &lt;strong&gt;AWS Glue Workflow&lt;/strong&gt;. Su función no es transformar datos, sino &lt;strong&gt;orquestar el proceso&lt;/strong&gt;: definir qué operaciones se ejecutan y en qué orden. Conceptualmente, cumple un rol similar al que podría desempeñar &lt;strong&gt;AWS Step Functions&lt;/strong&gt; en otros escenarios.&lt;/p&gt;

&lt;p&gt;El Workflow nos permite coordinar los distintos componentes del pipeline y asegurar que cada paso se ejecute solo cuando el anterior ha finalizado correctamente, aportando control y claridad al proceso completo.&lt;/p&gt;




&lt;h2&gt;
  
  
  🗂️ Separación por capas: raw y curated
&lt;/h2&gt;

&lt;p&gt;Uno de los principios que seguimos en este laboratorio es la &lt;strong&gt;separación por capas&lt;/strong&gt;, comenzando por &lt;em&gt;raw&lt;/em&gt; y avanzando hacia &lt;em&gt;curated&lt;/em&gt;. Esta distinción no es meramente organizativa; responde a necesidades de &lt;strong&gt;trazabilidad, control y calidad del dato&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  📥 Capa raw
&lt;/h3&gt;

&lt;p&gt;La capa &lt;em&gt;raw&lt;/em&gt; representa el punto de entrada del dato. Aquí se almacenan los archivos tal y como llegan desde la fuente, sin aplicar transformaciones ni validaciones complejas.&lt;/p&gt;

&lt;p&gt;Sus principales características son:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📄 Los datos se preservan en su forma original.&lt;/li&gt;
&lt;li&gt;🔒 No se modifica el contenido; únicamente se almacena.&lt;/li&gt;
&lt;li&gt;♻️ Sirve como respaldo para reprocesamientos, auditorías o correcciones futuras.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En este laboratorio, &lt;strong&gt;Amazon S3&lt;/strong&gt; actúa como la capa &lt;em&gt;raw&lt;/em&gt;, recibiendo el dataset de tarjetas cada vez que un nuevo archivo es cargado.&lt;/p&gt;

&lt;h3&gt;
  
  
  📊 Capa curated
&lt;/h3&gt;

&lt;p&gt;La capa &lt;em&gt;curated&lt;/em&gt; contiene los datos limpios, transformados y listos para consumo. En esta etapa se aplican las reglas necesarias para que el dataset pueda ser utilizado de forma confiable por procesos analíticos.&lt;/p&gt;

&lt;p&gt;En esta capa:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🧮 Se normalizan columnas y tipos de datos.&lt;/li&gt;
&lt;li&gt;🧹 Se corrigen inconsistencias básicas.&lt;/li&gt;
&lt;li&gt;📐 Se definen esquemas más estables y predecibles.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esta separación permite mantener una arquitectura ordenada, auditable y preparada para evolucionar a medida que el pipeline crece en complejidad.&lt;/p&gt;




&lt;p&gt;Para serles honesta, comencé abordando el &lt;strong&gt;core del problema&lt;/strong&gt;: la definición básica de Amazon S3 y el Glue Job encargado de las transformaciones. Sin embargo, al construir el flujo de manera evolutiva, algunos “detalles” quedaron fuera del radar y terminaron complicando el proceso más de lo necesario.&lt;/p&gt;

&lt;p&gt;Hubo un punto en el que cada pieza parecía estar correctamente configurada: el evento se disparaba, el trigger funcionaba, incluso validé el flujo utilizando &lt;strong&gt;CloudWatch&lt;/strong&gt; como destino y, aun así, el pipeline no lograba ejecutarse de principio a fin. Después de darle varias vueltas al problema, caí en cuenta de lo más obvio: &lt;strong&gt;los permisos&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Sí, fue uno de esos momentos frustrantes en los que todo está bien… excepto lo fundamental. Precisamente por esa experiencia, y para evitar que el laboratorio se vuelva innecesariamente complejo, en las siguientes secciones abordaré todas las consideraciones de configuración desde el inicio, incluyendo &lt;strong&gt;roles y permisos&lt;/strong&gt;, con el objetivo de que el recorrido sea lo más &lt;em&gt;smooth&lt;/em&gt; posible y el pipeline funcione correctamente desde el primer intento.&lt;/p&gt;




&lt;h2&gt;
  
  
  🪣 S3: definamos el almacenamiento
&lt;/h2&gt;

&lt;p&gt;Como en la mayoría de los pipelines de datos, el punto de inicio será nuestro bucket de &lt;strong&gt;Amazon S3&lt;/strong&gt;. En este laboratorio, una de las primeras consideraciones es la organización del almacenamiento, para lo cual definiremos dos directorios (o prefijos):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/raw&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/curated&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tal y como lo explicamos previamente, los datos de origen se mantienen separados en la capa &lt;em&gt;raw&lt;/em&gt;. Aquí es donde esperaremos la llegada de nuevos archivos de precios, sin aplicar ningún tipo de transformación.&lt;/p&gt;

&lt;p&gt;Por su parte, en la capa &lt;em&gt;curated&lt;/em&gt; depositaremos los datos ya procesados: limpios, con los tipos de datos adecuados y listos para su consumo analítico.&lt;/p&gt;

&lt;h3&gt;
  
  
  ⚠️ Consideración importante: integración con EventBridge
&lt;/h3&gt;

&lt;p&gt;Dado que utilizaremos &lt;strong&gt;Amazon EventBridge&lt;/strong&gt; para disparar el pipeline, es fundamental &lt;strong&gt;activar las notificaciones de EventBridge en el bucket&lt;/strong&gt;. Sin este paso, los eventos de creación de objetos no podrán ser capturados y el flujo no se iniciará.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk1e20145l6jzd72bbco8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk1e20145l6jzd72bbco8.png" alt=" " width="800" height="176"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🔐 Permisos a nivel de bucket
&lt;/h2&gt;

&lt;p&gt;Aunque aún no hemos definido todos los componentes del pipeline, es importante &lt;strong&gt;anticipar los permisos necesarios desde el inicio&lt;/strong&gt;. A nivel de &lt;em&gt;bucket policy&lt;/em&gt;, debemos permitir lo siguiente:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;📡 &lt;strong&gt;Amazon EventBridge&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Debe tener la capacidad de listar objetos y realizar operaciones de lectura (&lt;code&gt;ListBucket&lt;/code&gt; y &lt;code&gt;GetObject&lt;/code&gt;) para poder reaccionar a los eventos de S3.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;🛠️ &lt;strong&gt;AWS Glue&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Debe ser capaz no solo de leer, sino también de &lt;strong&gt;escribir y eliminar objetos&lt;/strong&gt; en la capa &lt;em&gt;curated&lt;/em&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En este laboratorio, al tratarse de un &lt;strong&gt;ejercicio académico&lt;/strong&gt;, el &lt;strong&gt;Glue Job&lt;/strong&gt; reescribirá el mismo archivo de salida cuando se ejecute nuevamente. Esto implica que primero se realiza un borrado del objeto existente y luego un &lt;code&gt;PutObject&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Pro tip&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
En un escenario productivo, lo recomendable sería generar archivos nuevos, por ejemplo incorporando un &lt;em&gt;timestamp&lt;/em&gt; en el nombre. Sin embargo, para este ejercicio simplificamos el flujo y priorizamos la claridad del proceso.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A continuación, se muestra un ejemplo de la política asociada al bucket:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2012-10-17"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Statement"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Sid"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"AllowEventBridgeToReadS3Events"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Effect"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Allow"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Principal"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"Service"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"events.amazonaws.com"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"s3:GetObject"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"s3:ListBucket"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"arn:aws:s3:::poctarjetasprecios"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"arn:aws:s3:::poctarjetasprecios/*"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Sid"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"AllowGlueWriteToCurated"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Effect"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Allow"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Principal"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"AWS"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"arn:aws:iam::072962861776:role/service-role/AWSGlueServiceRole-Pokemon"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"s3:PutObject"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"s3:DeleteObject"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"s3:AbortMultipartUpload"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"arn:aws:s3:::poctarjetasprecios/curated/*"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En la siguiente sección entraremos de lleno en &lt;strong&gt;AWS Glue&lt;/strong&gt;, comenzando por la definición del &lt;strong&gt;Job&lt;/strong&gt; y las consideraciones clave para evitar errores comunes durante la ejecución del pipeline.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧪 AWS Glue: Jobs, Crawlers y Workflow Orchestration
&lt;/h2&gt;

&lt;p&gt;Recordemos que &lt;strong&gt;AWS Glue&lt;/strong&gt; es un servicio de integración de datos totalmente gestionado que facilita la &lt;strong&gt;descubierta, preparación y catalogación de datos&lt;/strong&gt; para casos de uso de analítica, &lt;em&gt;machine learning&lt;/em&gt; y &lt;em&gt;data engineering&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;En este laboratorio utilizaremos Glue de forma integral:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;🛠️ &lt;strong&gt;Glue Jobs&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Para realizar las transformaciones y limpiezas de los datos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;🗂️ &lt;strong&gt;Glue Crawlers&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Para poblar y actualizar el &lt;strong&gt;Glue Data Catalog&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;🔁 &lt;strong&gt;Glue Workflow Orchestration&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Para coordinar la ejecución de todo el proceso.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tal y como discutimos en el artículo anterior, el dataset utilizado nos servirá más adelante para entrenar un modelo que permita &lt;strong&gt;estimar el valor de mercado de una tarjeta&lt;/strong&gt;. Los detalles completos del dataset pueden consultarse en ese artículo; sin embargo, a continuación haré una breve reseña de sus características más relevantes desde la perspectiva de transformación.&lt;/p&gt;

&lt;p&gt;Las variables más importantes de una carta incluyen su &lt;strong&gt;rareza, tipo, hits y precios&lt;/strong&gt;. En este dataset, los campos de precio se encuentran representados como &lt;em&gt;strings&lt;/em&gt;, y la variable &lt;strong&gt;&lt;code&gt;marketprice&lt;/code&gt;&lt;/strong&gt; —que será la que deseamos predecir— presenta una cantidad significativa de valores nulos.&lt;/p&gt;

&lt;p&gt;Por lo tanto, antes de poder utilizar los datos, es necesario:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔄 Realizar cambios de tipo de datos en las columnas de precio.&lt;/li&gt;
&lt;li&gt;🧹 Eliminar las filas cuyo valor de &lt;code&gt;marketprice&lt;/code&gt; sea nulo.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ⚠️ Diferencias importantes con Data Wrangler
&lt;/h2&gt;

&lt;p&gt;Un punto importante a destacar es la diferencia con el enfoque utilizado previamente con &lt;strong&gt;Data Wrangler&lt;/strong&gt;. Con &lt;strong&gt;AWS Glue&lt;/strong&gt;, las transformaciones y limpiezas deben implementarse mediante &lt;strong&gt;scripts&lt;/strong&gt;, lo que implica un mayor control, pero también una mayor responsabilidad sobre el proceso.&lt;/p&gt;

&lt;p&gt;Los cambios de tipo de datos &lt;strong&gt;no pueden realizarse de forma directa&lt;/strong&gt;. Antes de aplicar el &lt;em&gt;type casting&lt;/em&gt;, es necesario limpiar los valores, eliminando cualquier carácter que no corresponda al tipo esperado, como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;💲 símbolos de moneda (&lt;code&gt;$&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;␣ espacios en blanco&lt;/li&gt;
&lt;li&gt;🔣 otros caracteres no numéricos&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Una vez realizada esta limpieza, es posible convertir las columnas al tipo de dato adecuado. Finalmente, se procede a eliminar columnas que no aportan valor para el análisis o el entrenamiento del modelo, dejando un dataset más limpio y enfocado.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧱 Construyendo el Job paso a paso
&lt;/h2&gt;

&lt;p&gt;En este laboratorio iniciaremos la creación de un &lt;strong&gt;AWS Glue Job&lt;/strong&gt; utilizando el &lt;strong&gt;editor de scripts&lt;/strong&gt;, con el objetivo de comprender la &lt;strong&gt;estructura mínima necesaria&lt;/strong&gt; para ejecutar un Job de forma exitosa antes de avanzar hacia transformaciones más complejas.&lt;/p&gt;

&lt;h3&gt;
  
  
  🆕 Creación del Job
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;En la consola de &lt;strong&gt;AWS Glue&lt;/strong&gt;, nos dirigimos al menú &lt;strong&gt;ETL Jobs&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Seleccionamos &lt;strong&gt;Create Job&lt;/strong&gt; y elegimos la opción &lt;strong&gt;Script Editor&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo6rlygelwpop8m1lgbke.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo6rlygelwpop8m1lgbke.png" alt=" " width="790" height="101"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  ⚙️ Selección del Engine
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Como &lt;strong&gt;Engine&lt;/strong&gt;, seleccionamos &lt;strong&gt;Spark&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esto nos permite trabajar con un Job basado en &lt;strong&gt;Apache Spark&lt;/strong&gt; y acceder directamente al editor de código para definir la lógica del procesamiento.&lt;/p&gt;

&lt;p&gt;Una vez dentro del editor:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🧽 Eliminamos todo el código generado automáticamente.&lt;/li&gt;
&lt;li&gt;🧩 Construimos el script paso a paso, comenzando con el ejemplo más básico para validar la ejecución del Job.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ✅ Primer script: validación de ejecución
&lt;/h2&gt;

&lt;p&gt;Para esta primera prueba no es necesario importar librerías adicionales ni utilizar el contexto de Glue. Utilizamos únicamente el siguiente código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Glue Job ejecutado correctamente&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este script cumple un propósito claro: &lt;strong&gt;verificar que el Job puede ejecutarse correctamente&lt;/strong&gt;, que el &lt;strong&gt;rol IAM&lt;/strong&gt; está bien configurado y que la &lt;strong&gt;infraestructura de ejecución&lt;/strong&gt; se aprovisiona sin errores.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚙️ Configuración de Job Details
&lt;/h2&gt;

&lt;p&gt;En la sección &lt;strong&gt;Job Details&lt;/strong&gt; definimos los siguientes parámetros:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;🏷️ &lt;strong&gt;Name&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Nombre identificador del Job dentro de AWS Glue.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;📝 &lt;strong&gt;Description&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Descripción breve del propósito del Job, útil para fines de documentación y mantenimiento.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;🔐 &lt;strong&gt;IAM Role&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Rol que utilizará el Job para ejecutarse.&lt;br&gt;&lt;br&gt;
Este rol debe contar al menos con la política &lt;strong&gt;&lt;code&gt;AWSGlueServiceRole&lt;/code&gt;&lt;/strong&gt;, además de los permisos necesarios para acceder a los recursos que el Job vaya a utilizar (por ejemplo, Amazon S3).  &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ Sin un rol válido, el Job no puede ejecutarse.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;🧱 &lt;strong&gt;Worker Type&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Para efectos de este laboratorio seleccionamos &lt;strong&gt;G.1X&lt;/strong&gt;, que corresponde al tipo de &lt;em&gt;worker&lt;/em&gt; con las especificaciones más bajas disponibles para &lt;strong&gt;Spark Jobs&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
Un &lt;em&gt;worker&lt;/em&gt; es la unidad de capacidad de cómputo que el servicio utiliza para ejecutar un Job. Cada uno provee recursos de &lt;strong&gt;CPU, memoria y almacenamiento temporal&lt;/strong&gt;, y es sobre estos recursos donde se ejecutan las tareas de &lt;strong&gt;Apache Spark&lt;/strong&gt; asociadas al Job.&lt;br&gt;&lt;br&gt;
El número y tipo de workers determinan la &lt;strong&gt;capacidad de procesamiento&lt;/strong&gt;, el &lt;strong&gt;tiempo de ejecución&lt;/strong&gt; y el &lt;strong&gt;costo&lt;/strong&gt; del Job.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;🔢 &lt;strong&gt;Requested number of workers&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Por defecto, AWS Glue asigna &lt;strong&gt;10 workers&lt;/strong&gt;, lo cual incrementa innecesariamente los costos en pruebas simples.&lt;br&gt;&lt;br&gt;
Para minimizar costos, configuramos el &lt;strong&gt;valor mínimo permitido&lt;/strong&gt;, que en este caso es &lt;strong&gt;2 workers&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;🐍 &lt;strong&gt;Language&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Seleccionamos &lt;strong&gt;Python&lt;/strong&gt; como lenguaje del Job.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Una vez definidos estos detalles, &lt;strong&gt;salvamos y ejecutamos&lt;/strong&gt; el Job. Podemos ver el detalle de la ejecución en &lt;strong&gt;OutputLogs&lt;/strong&gt;, como se muestra en la siguiente imagen.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1449dwfb83wx9d9cmbdh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1449dwfb83wx9d9cmbdh.png" alt=" " width="655" height="209"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Pro Tip&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
En el caso de los &lt;strong&gt;AWS Glue Jobs&lt;/strong&gt;, los costos están asociados directamente a la &lt;strong&gt;ejecución del Job&lt;/strong&gt;. Asegúrate de que los Jobs se encuentren en estado &lt;strong&gt;Completed&lt;/strong&gt; una vez finalizados.&lt;br&gt;&lt;br&gt;
Para un laboratorio de este tipo, utiliza el &lt;strong&gt;worker más pequeño disponible&lt;/strong&gt; y una cantidad máxima de &lt;strong&gt;2 workers&lt;/strong&gt; para minimizar costos.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🛠️ Continuemos con el Job real
&lt;/h2&gt;

&lt;p&gt;Ahora que ya hemos validado la ejecución de nuestro primer &lt;strong&gt;AWS Glue Job&lt;/strong&gt;, es momento de avanzar hacia el &lt;strong&gt;Job real&lt;/strong&gt;, es decir, el código que implementa las transformaciones necesarias sobre el dataset.&lt;/p&gt;

&lt;p&gt;En esta etapa pasamos de un Job de &lt;strong&gt;verificación&lt;/strong&gt; a un Job &lt;strong&gt;funcional&lt;/strong&gt;, cuyo objetivo es leer los datos desde la capa &lt;em&gt;raw&lt;/em&gt;, limpiarlos, transformarlos y escribir el resultado en la capa &lt;em&gt;curated&lt;/em&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🎯 Objetivo del Job
&lt;/h2&gt;

&lt;p&gt;El Job realizará las siguientes acciones, en orden:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Importar las librerías necesarias&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Incluiremos los módulos requeridos para trabajar con &lt;strong&gt;Spark&lt;/strong&gt; y &lt;strong&gt;AWS Glue&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Inicializar una sesión de Spark&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Esta sesión será la base sobre la cual se ejecutarán todas las operaciones de lectura, transformación y escritura de datos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Definir la ruta de entrada en Amazon S3&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Declararemos como variable el &lt;em&gt;path&lt;/em&gt; donde se encuentra el archivo a transformar, correspondiente a la capa &lt;em&gt;raw&lt;/em&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cargar los datos en un DataFrame&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Leeremos el archivo desde S3 y cargaremos su contenido en un &lt;strong&gt;DataFrame de Spark&lt;/strong&gt; (puedes pensarlo como una tabla en memoria).&lt;br&gt;&lt;br&gt;
Indicaremos que la primera fila del archivo contiene los &lt;em&gt;headers&lt;/em&gt; de las columnas.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Antes de aplicar cualquier transformación de tipo de dato, realizaremos una &lt;strong&gt;limpieza previa&lt;/strong&gt;. Las columnas de precio contienen caracteres no numéricos, por lo que primero eliminaremos símbolos y valores indeseados mediante una función de limpieza, y solo después aplicaremos el &lt;em&gt;type casting&lt;/em&gt; correspondiente.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Filtrar registros con valores nulos&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Eliminaremos las filas cuyo valor en la columna &lt;strong&gt;&lt;code&gt;marketprice&lt;/code&gt;&lt;/strong&gt; sea nulo, ya que no aportan valor para el análisis ni para el entrenamiento posterior del modelo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Escribir el resultado en la capa curated&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Finalmente, persistiremos el DataFrame transformado en &lt;strong&gt;Amazon S3&lt;/strong&gt;, dentro del prefijo correspondiente a la capa &lt;em&gt;curated&lt;/em&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Pro Tip&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Antes de aplicar transformaciones y escribir los datos de salida, es una buena práctica ejecutar un &lt;strong&gt;&lt;code&gt;df.show()&lt;/code&gt;&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
Esto nos permite visualizar los datos y validar los tipos asociados a cada columna. En este punto, y dado que estamos leyendo un archivo &lt;strong&gt;CSV&lt;/strong&gt;, observarás que todas las columnas se interpretan inicialmente como &lt;em&gt;strings&lt;/em&gt;, lo cual refuerza la necesidad de realizar las transformaciones de tipo de dato de forma explícita.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;A continuación, revisaremos el &lt;strong&gt;código final del Job&lt;/strong&gt;. Incluiré comentarios en cada sección para que el flujo sea más sencillo de seguir y puedas identificar claramente el propósito de cada bloque.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Importamos las librerías mínimas
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pyspark.sql&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;SparkSession&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pyspark.sql.functions&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;regexp_replace&lt;/span&gt;

&lt;span class="c1"&gt;# Abrimos la sesión de Spark
&lt;/span&gt;&lt;span class="n"&gt;spark&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SparkSession&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getOrCreate&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# En esta variable dejamos la ruta del archivo que esperamos cargar
&lt;/span&gt;&lt;span class="n"&gt;ruta_s3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;s3://poctarjetasprecios/raw/BaseSetProductsAndPrices.csv&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="c1"&gt;# Cargamos el DataFrame indicando que la primera fila contiene los headers
&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;spark&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;option&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;header&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;true&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;csv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ruta_s3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# En este vector definimos las columnas a limpiar y convertir
# En este paso solo se define el plan de ejecución; Spark aún no aplica las transformaciones
&lt;/span&gt;&lt;span class="n"&gt;price_columns&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;lowPrice&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;midPrice&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;highPrice&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;marketPrice&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;directLowPrice&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;price_columns&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;withColumn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nf"&gt;regexp_replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;col&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;[^0-9.]&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;cast&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;double&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Filtramos únicamente los registros con marketPrice no nulo
&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;col&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;marketPrice&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;isNotNull&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

&lt;span class="c1"&gt;# Definimos la ruta de salida en la capa curated
&lt;/span&gt;&lt;span class="n"&gt;ruta_curated&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;s3://poctarjetasprecios/curated/product_prices2/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="c1"&gt;# Ahora sí, Spark ejecuta el plan definido y
&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;overwrite&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;parquet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ruta_curated&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto ya transforma nuestro archivo.&lt;br&gt;&lt;br&gt;
Ahora necesitamos el &lt;strong&gt;Crawler&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  🗂️ Creación del Glue Crawler
&lt;/h2&gt;

&lt;p&gt;Posteriormente, procedí a crear el &lt;strong&gt;Glue Crawler&lt;/strong&gt;, configurando los siguientes parámetros clave:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;🏷️ &lt;strong&gt;Nombre del crawler&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Identificador claro y descriptivo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;🪣 &lt;strong&gt;Fuente de datos (Data Source)&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Amazon S3&lt;/strong&gt;, apuntando específicamente al prefijo donde se encuentra el dataset &lt;em&gt;curated&lt;/em&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;🧾 &lt;strong&gt;Prefijo para el nombre de la tabla&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Definido para mantener consistencia y evitar confusiones en el catálogo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;⏱️ &lt;strong&gt;Frecuencia de ejecución&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Configurado para ejecutarse &lt;strong&gt;bajo demanda&lt;/strong&gt;, con el objetivo de evitar ejecuciones innecesarias y posibles impactos en la facturación.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;🔐 &lt;strong&gt;Rol de IAM&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
El rol asociado al crawler debe contar, como mínimo, con permisos de &lt;strong&gt;lectura sobre el bucket de S3&lt;/strong&gt; donde residen los datos, además de permisos para &lt;strong&gt;escribir metadatos en el Glue Data Catalog&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔁 Orquestación del flujo con AWS Glue Workflow
&lt;/h2&gt;

&lt;p&gt;Una vez validado el &lt;strong&gt;Glue Job de transformación&lt;/strong&gt;, el siguiente paso fue &lt;strong&gt;orquestar el flujo completo&lt;/strong&gt; utilizando &lt;strong&gt;AWS Glue Workflow&lt;/strong&gt;. El objetivo no es solo ejecutar tareas de forma aislada, sino definir explícitamente el &lt;strong&gt;orden y la dependencia entre ellas&lt;/strong&gt;, algo fundamental en cualquier proceso de preparación de datos.&lt;/p&gt;

&lt;p&gt;El workflow implementado sigue una lógica simple pero correcta:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Inicio del flujo&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
El workflow se dispara de forma controlada (manual o posteriormente mediante eventos), actuando como punto de entrada del proceso.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Ejecución del Glue Job&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
El Glue Job se encarga de leer los datos desde la zona &lt;em&gt;raw&lt;/em&gt; en Amazon S3, realizar transformaciones mínimas y escribir el resultado en la zona &lt;em&gt;curated&lt;/em&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Trigger condicional&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Se utiliza un &lt;strong&gt;trigger condicional&lt;/strong&gt; para garantizar que el siguiente paso solo se ejecute si el Glue Job finaliza correctamente.&lt;br&gt;&lt;br&gt;
Esta validación es importante para evitar catalogar datos incompletos o inconsistentes en caso de fallos durante la transformación.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Ejecución del Glue Crawler&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Finalmente, el Glue Crawler escanea los datos ya procesados en la capa &lt;em&gt;curated&lt;/em&gt; y actualiza el &lt;strong&gt;Glue Data Catalog&lt;/strong&gt;. De esta forma, los datos quedan disponibles para su consumo posterior mediante servicios como &lt;strong&gt;Amazon Athena&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  🧩 Separación de responsabilidades
&lt;/h3&gt;

&lt;p&gt;Este enfoque permite &lt;strong&gt;desacoplar responsabilidades&lt;/strong&gt; de forma clara:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🛠️ El &lt;strong&gt;Job&lt;/strong&gt; se enfoca en la transformación.&lt;/li&gt;
&lt;li&gt;🗂️ El &lt;strong&gt;Crawler&lt;/strong&gt; se enfoca en el descubrimiento y la catalogación.&lt;/li&gt;
&lt;li&gt;🔁 El &lt;strong&gt;Workflow&lt;/strong&gt; define la secuencia y las dependencias entre ambos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr04evazlhfw0rb989cq0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr04evazlhfw0rb989cq0.png" alt=" " width="762" height="197"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Pro Tip&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Ejecuta el workflow de manera separada antes de integrarlo con el pipeline. De esta forma podrás validar que este componente se ejecuta correctamente de manera aislada.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Último paso: automatización con Amazon EventBridge
&lt;/h2&gt;

&lt;p&gt;El paso final del laboratorio consiste en utilizar &lt;strong&gt;Amazon EventBridge&lt;/strong&gt; para disparar automáticamente el flujo cada vez que un nuevo archivo es cargado en &lt;strong&gt;Amazon S3&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
En teoría, esta es la parte más sencilla; en la práctica, fue la que más tiempo me tomó resolver.&lt;/p&gt;

&lt;p&gt;Y vale la pena decirlo abiertamente: el problema no fue técnico, sino de orden. Pasé por alto dos aspectos básicos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Los permisos necesarios para que &lt;strong&gt;AWS Glue&lt;/strong&gt; pudiera ser invocado.&lt;/li&gt;
&lt;li&gt;La habilitación de &lt;strong&gt;notificaciones de eventos desde S3&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esta experiencia deja una lección importante: antes de asumir que el problema es complejo, conviene revisar siempre lo más evidente, especialmente permisos e integraciones entre servicios.&lt;/p&gt;

&lt;p&gt;Dado que estos prerrequisitos ya habían sido configurados al inicio del laboratorio, el último paso se redujo a crear una &lt;strong&gt;regla en Amazon EventBridge&lt;/strong&gt; con la siguiente lógica:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Origen del evento:&lt;/strong&gt; Amazon S3
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tipo de evento:&lt;/strong&gt; Creación de objetos (&lt;em&gt;Object Created&lt;/em&gt;)
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Destino:&lt;/strong&gt; AWS Glue Workflow
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Con esta configuración, cada vez que un archivo nuevo ingresa al bucket (o prefijo) definido, el workflow se ejecuta automáticamente, iniciando el proceso de transformación y catalogación de datos.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8mlrkp3dgltvyem5si7q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8mlrkp3dgltvyem5si7q.png" alt=" " width="777" height="322"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Destinos del evento
&lt;/h2&gt;

&lt;p&gt;Amazon EventBridge permite configurar hasta &lt;strong&gt;cinco destinos por regla&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
En este caso, además del &lt;strong&gt;Glue Workflow&lt;/strong&gt;, se habilitó &lt;strong&gt;Amazon CloudWatch&lt;/strong&gt; únicamente con fines de observabilidad y validación del evento, aunque no es estrictamente necesario para el funcionamiento del flujo.&lt;/p&gt;

&lt;p&gt;A partir de este punto, el proceso queda &lt;strong&gt;completamente automatizado&lt;/strong&gt;:&lt;br&gt;&lt;br&gt;
cada nuevo archivo que llega a S3 desencadena todas las acciones esperadas sin intervención manual, cerrando así el ciclo completo de &lt;strong&gt;ingesta, transformación y catalogación&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1i3ajlkaqli903lu1f5h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1i3ajlkaqli903lu1f5h.png" alt=" " width="752" height="122"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusiones
&lt;/h2&gt;

&lt;p&gt;Una vez finalizado este laboratorio, se logra implementar una &lt;strong&gt;automatización de extremo a extremo&lt;/strong&gt; para la preparación de un conjunto de datos, integrando varios servicios administrados de AWS y entendiendo el rol específico que cada uno cumple dentro del pipeline.&lt;/p&gt;

&lt;p&gt;El uso de &lt;strong&gt;AWS Glue Jobs&lt;/strong&gt; resulta especialmente adecuado cuando se trabaja con datasets de tamaño considerable, donde el procesamiento distribuido de &lt;strong&gt;Spark&lt;/strong&gt; permite escalar transformaciones de forma eficiente.&lt;br&gt;&lt;br&gt;
Por su parte, &lt;strong&gt;AWS Glue Workflow&lt;/strong&gt; simplifica la orquestación del proceso, permitiendo definir dependencias claras entre tareas sin necesidad de introducir herramientas adicionales de orquestación.&lt;/p&gt;

&lt;p&gt;Como en toda arquitectura de datos, todo se trata de &lt;em&gt;trade-offs&lt;/em&gt;. Elegir Glue implica aceptar ciertos tiempos de arranque y costos asociados a la infraestructura gestionada, a cambio de reducir la complejidad operativa y el mantenimiento.&lt;/p&gt;

&lt;p&gt;Durante el desarrollo del laboratorio, hay varios puntos clave que conviene tener siempre presentes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Spark no ejecuta las transformaciones inmediatamente.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Las operaciones se evalúan de forma perezosa (&lt;em&gt;lazy evaluation&lt;/em&gt;) y solo se materializan cuando se ejecutan acciones definitivas como &lt;code&gt;write&lt;/code&gt;, &lt;code&gt;show&lt;/code&gt; o &lt;code&gt;count&lt;/code&gt;. Tener esto claro ayuda a entender el comportamiento del job y a razonar sobre su desempeño.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Los permisos y las relaciones de confianza entre servicios son críticos.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
La correcta configuración de &lt;em&gt;IAM roles&lt;/em&gt;, &lt;em&gt;policies&lt;/em&gt; y &lt;em&gt;trust relationships&lt;/em&gt; entre S3, Glue y EventBridge es indispensable para evitar fricciones innecesarias al implementar el pipeline.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Optimización de costos en laboratorios.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Para fines didácticos, es recomendable utilizar el tipo y la cantidad de workers más económicos posibles, evitando dejar los valores por defecto y controlando activamente los costos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Tiempo de arranque de AWS Glue Jobs.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Los Glue Jobs requieren tiempo para aprovisionar la infraestructura. Un tiempo inicial de arranque es normal y no debe generar alarma; sin embargo, es importante verificar siempre que los jobs finalicen correctamente y no queden en estado &lt;code&gt;running&lt;/code&gt; o &lt;code&gt;stopped&lt;/code&gt; de forma inesperada.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En conjunto, este laboratorio no solo permite construir un pipeline funcional, sino también comprender mejor las decisiones técnicas y operativas que acompañan el uso de servicios administrados para la preparación y automatización de datos en AWS.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>machinelearning</category>
      <category>ai</category>
      <category>certification</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Diana Castro</dc:creator>
      <pubDate>Mon, 22 Dec 2025 17:28:14 +0000</pubDate>
      <link>https://dev.to/dcastrocordero22/-2e00</link>
      <guid>https://dev.to/dcastrocordero22/-2e00</guid>
      <description>&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/aws-builders/diario-de-una-builder-preparandonos-para-aws-machine-learning-desde-cero-preparando-datos-3j4" class="crayons-story__hidden-navigation-link"&gt;Diario de una builder: Preparándonos para AWS Machine Learning desde cero – Preparando Datos&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;
          &lt;a class="crayons-logo crayons-logo--l" href="/aws-builders"&gt;
            &lt;img alt="AWS Community Builders  logo" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F2794%2F88da75b6-aadd-4ea1-8083-ae2dfca8be94.png" class="crayons-logo__image"&gt;
          &lt;/a&gt;

          &lt;a href="/dcastrocordero22" class="crayons-avatar  crayons-avatar--s absolute -right-2 -bottom-2 border-solid border-2 border-base-inverted  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1876418%2Fe1e99ea5-7ed6-4e95-9551-0ebcb5468100.jpg" alt="dcastrocordero22 profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/dcastrocordero22" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Diana Castro
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Diana Castro
                &lt;a href="/++"&gt;&lt;img alt="Subscriber" class="subscription-icon" src="https://assets.dev.to/assets/subscription-icon-805dfa7ac7dd660f07ed8d654877270825b07a92a03841aa99a1093bd00431b2.png"&gt;&lt;/a&gt;
              
              &lt;div id="story-author-preview-content-3119570" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/dcastrocordero22" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1876418%2Fe1e99ea5-7ed6-4e95-9551-0ebcb5468100.jpg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Diana Castro&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

            &lt;span&gt;
              &lt;span class="crayons-story__tertiary fw-normal"&gt; for &lt;/span&gt;&lt;a href="/aws-builders" class="crayons-story__secondary fw-medium"&gt;AWS Community Builders &lt;/a&gt;
            &lt;/span&gt;
          &lt;/div&gt;
          &lt;a href="https://dev.to/aws-builders/diario-de-una-builder-preparandonos-para-aws-machine-learning-desde-cero-preparando-datos-3j4" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Dec 22 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/aws-builders/diario-de-una-builder-preparandonos-para-aws-machine-learning-desde-cero-preparando-datos-3j4" id="article-link-3119570"&gt;
          Diario de una builder: Preparándonos para AWS Machine Learning desde cero – Preparando Datos
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/aws"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;aws&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/machinelearning"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;machinelearning&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/beginners"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;beginners&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
            &lt;a href="https://dev.to/aws-builders/diario-de-una-builder-preparandonos-para-aws-machine-learning-desde-cero-preparando-datos-3j4#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            15 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;




</description>
      <category>aws</category>
      <category>ai</category>
      <category>machinelearning</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Diario de una builder: Preparándonos para AWS Machine Learning desde cero – Preparando Datos</title>
      <dc:creator>Diana Castro</dc:creator>
      <pubDate>Mon, 22 Dec 2025 15:40:06 +0000</pubDate>
      <link>https://dev.to/aws-builders/diario-de-una-builder-preparandonos-para-aws-machine-learning-desde-cero-preparando-datos-3j4</link>
      <guid>https://dev.to/aws-builders/diario-de-una-builder-preparandonos-para-aws-machine-learning-desde-cero-preparando-datos-3j4</guid>
      <description>&lt;p&gt;Resumiendo de forma muy práctica, el ciclo de vida de machine learning puede dividirse en tres grandes fases: &lt;strong&gt;preparación de los datos&lt;/strong&gt;, &lt;strong&gt;entrenamiento del modelo&lt;/strong&gt; e &lt;strong&gt;implementación (inferencia)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;De estas tres, la preparación de los datos suele ser la más crítica, ya que define directamente la calidad de los resultados obtenidos.&lt;/p&gt;

&lt;p&gt;La preparación de datos, a su vez, incluye varias subetapas: &lt;strong&gt;obtención de los datos&lt;/strong&gt;, &lt;strong&gt;limpieza&lt;/strong&gt; y &lt;strong&gt;transformación&lt;/strong&gt;. Como ocurre en cualquier sistema, si los datos de entrada son deficientes, la calidad del modelo resultante será, como mínimo, cuestionable.&lt;/p&gt;

&lt;p&gt;Por ello, y como lo prometido es deuda, en esta segunda parte del artículo nos enfocaremos exclusivamente en el proceso de preparación de datos. Desarrollaremos un pequeño laboratorio práctico en el que trabajaremos un conjunto de datos que, más adelante, podría servir como insumo para entrenar un modelo de machine learning.&lt;/p&gt;

&lt;p&gt;Desde la perspectiva del examen &lt;strong&gt;AWS Machine Learning Associate&lt;/strong&gt;, se espera que el candidato sea capaz de seleccionar las herramientas adecuadas para la preparación de datos, así como demostrar familiaridad con servicios como &lt;strong&gt;SageMaker Data Wrangler&lt;/strong&gt; y &lt;strong&gt;AWS Glue&lt;/strong&gt;. Con ese objetivo, el ejercicio que presento a continuación es de carácter meramente académico y busca recorrer este proceso de forma guiada y estructurada.&lt;/p&gt;

&lt;p&gt;Antes de poner manos a la obra, revisemos brevemente qué nos dice la teoría sobre el  proceso de &lt;em&gt;&lt;strong&gt;preparación de datos&lt;/strong&gt;&lt;/em&gt; en AWS y las decisiones que debemos tomar.&lt;/p&gt;

&lt;h3&gt;
  
  
  a. Obtención de los datos
&lt;/h3&gt;

&lt;p&gt;La selección de los datos es fundamental, así como la elección del repositorio de almacenamiento. Podemos trabajar con datos públicos —como lo haré en este laboratorio— o con datos propios de la organización.&lt;/p&gt;

&lt;p&gt;La elección del almacenamiento dependerá de factores como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;El volumen de datos
&lt;/li&gt;
&lt;li&gt;La frecuencia de actualización
&lt;/li&gt;
&lt;li&gt;Los servicios que se planea utilizar posteriormente
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  b. Limpieza de los datos
&lt;/h3&gt;

&lt;p&gt;Para mejorar el entrenamiento de los modelos, es indispensable revisar y limpiar los datos según sea necesario. Por ejemplo, es común encontrar filas donde variables clave contienen valores nulos; en estos casos, puede ser conveniente eliminarlas.&lt;/p&gt;

&lt;p&gt;Es importante aclarar que la limpieza debe realizarse con criterio: no se trata de reducir la muestra, sino de mejorar su calidad. Si una columna no aporta información relevante o puede inducir al modelo a conclusiones erróneas, es preferible descartarla.&lt;/p&gt;

&lt;p&gt;Otro aspecto clave es la &lt;strong&gt;cardinalidad de las columnas&lt;/strong&gt;. Las columnas de alta cardinalidad —aquellas con muchos valores únicos— pueden introducir complejidad innecesaria y aumentar el riesgo de &lt;em&gt;overfitting&lt;/em&gt;, es decir, que el modelo memorice patrones en lugar de aprender relaciones generalizables.&lt;/p&gt;

&lt;p&gt;En el caso de las cartas de colección, el nombre de la carta es un buen ejemplo de este dilema. Aunque el nombre puede estar asociado a personajes populares, es un valor prácticamente único. El modelo podría inferir incorrectamente que un personaje principal siempre implica un alto precio, cuando en realidad muchas cartas de ese mismo personaje tienen un valor muy bajo.&lt;/p&gt;

&lt;p&gt;Esto provoca que el modelo memorice en lugar de aprender variables verdaderamente relevantes como la rareza o si la carta es considerada un &lt;em&gt;hit&lt;/em&gt; por los coleccionistas.&lt;/p&gt;

&lt;h3&gt;
  
  
  c. Transformación de los datos
&lt;/h3&gt;

&lt;p&gt;Finalmente, para mejorar el rendimiento del modelo, suele ser necesario transformar los datos. Esto puede implicar dividir columnas, combinarlas o cambiar su representación.&lt;/p&gt;

&lt;p&gt;Recuerdo un dataset de características de automóviles en el que toda la información relevante estaba concentrada en una sola columna. En ese caso, tenía mucho más sentido transformar esa columna en atributos separados como número de puertas, tipo de combustible o tipo de vehículo, facilitando así el aprendizaje del modelo.&lt;/p&gt;




&lt;h2&gt;
  
  
  SageMaker AI y las herramientas recomendadas para Machine Learning en AWS
&lt;/h2&gt;

&lt;p&gt;Desde el &lt;em&gt;&lt;strong&gt;3 de diciembre de 2024&lt;/strong&gt;&lt;/em&gt;, Amazon SageMaker pasó a denominarse &lt;em&gt;&lt;strong&gt;Amazon SageMaker AI&lt;/strong&gt;&lt;/em&gt;. Más allá del cambio de nombre, el servicio se consolida como una plataforma totalmente gestionada que permite construir, entrenar y desplegar modelos de machine learning de forma eficiente, integrándose de manera nativa con el resto de servicios de AWS.&lt;/p&gt;

&lt;p&gt;SageMaker AI no es una herramienta aislada, sino el núcleo de un ecosistema de servicios diseñado para cubrir todo el ciclo de vida de machine learning: desde la preparación de los datos hasta la inferencia en producción.&lt;/p&gt;

&lt;p&gt;Esta visión integral es precisamente la que se evalúa en el examen &lt;strong&gt;AWS Machine Learning Associate&lt;/strong&gt;, donde no solo se espera conocer los modelos, sino también cuándo y por qué utilizar cada herramienta.&lt;/p&gt;




&lt;h2&gt;
  
  
  El proceso de preparación de datos  algunas recomendaciones
&lt;/h2&gt;

&lt;p&gt;La preparación de los datos abarca los procesos de recopilación, preprocesamiento y organización de los mismos, y su propósito es que cuando se utilicen para entrenar un modelo estos ayuden a que el modelo aprenda de forma eficaz y correcta.&lt;/p&gt;

&lt;p&gt;Tal y como comentamos previamente, este proceso implica limpiar (eliminar, cambiar, completar) datos y transformaciones, analizar valores atípicos y verificar qué hacer con ellos (&lt;em&gt;outliners&lt;/em&gt;). En mi caso, mi muestra de datos tiene muchos &lt;em&gt;outliners&lt;/em&gt;, pero así son las tarjetas: unas valen para el mercado &lt;code&gt;$0.1&lt;/code&gt; y otras &lt;code&gt;$300&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Dependiendo de nuestros datos y situación, tenemos disponibles toda una gama de opciones, las cuales analizaremos a continuación.&lt;/p&gt;

&lt;p&gt;AWS ofrece distintas capacidades dentro de SageMaker AI para la preparación de datos, pensadas para perfiles y necesidades diferentes. De forma práctica, estos escenarios pueden agruparse en tres casos de uso principales:&lt;/p&gt;

&lt;h3&gt;
  
  
  Caso de uso 1: Preparación visual y de bajo código
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;SageMaker Canvas con Data Wrangler&lt;/strong&gt; ofrece una opción donde es posible explorar, limpiar y transformar datos tabulares sin necesidad de programar, utilizando transformaciones integradas y, en algunos casos, instrucciones en lenguaje natural asistidas por IA generativa.&lt;/p&gt;

&lt;h4&gt;
  
  
  Cuándo usarlo
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Exploración y limpieza de datasets pequeños o medianos
&lt;/li&gt;
&lt;li&gt;Creación rápida de pipelines de preparación de datos
&lt;/li&gt;
&lt;li&gt;Equipos con poca experiencia en Python o Spark
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Consideraciones
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Menor flexibilidad para lógica de negocio compleja
&lt;/li&gt;
&lt;li&gt;No es ideal si el equipo ya trabaja cómodamente con código
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Caso de uso 2: Preparación basada en SQL y Python
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Studio&lt;/strong&gt; está orientado a usuarios con experiencia técnica que desean mayor control y flexibilidad. Sin entrar en el ecosistema Spark, se pueden ejecutar consultas SQL sobre fuentes como Amazon Redshift, Athena, Snowflake o S3, y posteriormente manipular los resultados usando Python y Pandas en notebooks.&lt;/p&gt;

&lt;h4&gt;
  
  
  Cuándo usarlo
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Datos almacenados en sistemas analíticos o data lakes
&lt;/li&gt;
&lt;li&gt;Combinación de SQL exploratorio con transformaciones en Python
&lt;/li&gt;
&lt;li&gt;Preparación de datos tabulares para modelos de ML
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Consideraciones
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Limitado por la memoria de la instancia de SageMaker
&lt;/li&gt;
&lt;li&gt;Diseñado principalmente para datos estructurados
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Caso de uso 3: Preparación de datos a gran escala y sin servidor
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;EMR Serverless integrado con SageMaker Studio&lt;/strong&gt; está dirigido a la preparación de datos distribuida. Permite ejecutar transformaciones a gran escala sobre grandes volúmenes de datos mediante frameworks como Apache Spark y Apache Hive, sin necesidad de gestionar clústeres.&lt;/p&gt;

&lt;h4&gt;
  
  
  Cuándo usarlo
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Grandes volúmenes de datos
&lt;/li&gt;
&lt;li&gt;Necesidad de procesamiento distribuido
&lt;/li&gt;
&lt;li&gt;Cargas de trabajo interactivas o de corta duración basadas en Spark
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Consideraciones
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Curva de aprendizaje más alta
&lt;/li&gt;
&lt;li&gt;Requiere control de costos en cargas prolongadas
&lt;/li&gt;
&lt;li&gt;No sustituye EMR tradicional para procesos complejos o de larga duración
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmch2imhvkfkaepf2zk70.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmch2imhvkfkaepf2zk70.png" alt=" " width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Manos a la obra: dataset y exploración inicial
&lt;/h2&gt;

&lt;p&gt;Ahora sí, manos a la obra. Para este laboratorio recurrí a mi hijo, mi coleccionista de tarjetas favorito, y descargué un archivo de tamaño relativamente pequeño que contiene información histórica y de mercado sobre tarjetas coleccionables.&lt;/p&gt;

&lt;p&gt;El dataset incluye atributos como precio histórico, precio de mercado, rareza, nombre, código y otras características relevantes de cada carta.&lt;/p&gt;

&lt;p&gt;Una vez identificado el conjunto de datos, mi coleccionista estrella me ayudó a destacar cuáles son las características clave que suelen definir las cartas más valiosas: niveles de rareza, cartas &lt;em&gt;hits&lt;/em&gt; y otros atributos especialmente apreciados por la comunidad. Con esta información como contexto, procedí a realizar una primera exploración del dataset.&lt;/p&gt;

&lt;p&gt;Cabe mencionar que la fuente de datos se encuentra en formato &lt;strong&gt;CSV&lt;/strong&gt;. Como recordarán del artículo anterior, este formato es fácil de leer, compartir y generar, pero no es el más eficiente para el entrenamiento de modelos de machine learning.&lt;/p&gt;

&lt;p&gt;Tras la revisión inicial, observé que el conjunto de datos cuenta con pocas columnas y un número reducido de filas, lo cual lo convierte en un candidato ideal para realizar tareas de limpieza, exploración y transformación utilizando &lt;strong&gt;SageMaker Data Wrangler&lt;/strong&gt; como herramienta principal.&lt;/p&gt;

&lt;h3&gt;
  
  
  Configuración inicial y conceptos clave
&lt;/h3&gt;

&lt;p&gt;Si no has trabajado previamente con &lt;strong&gt;SageMaker AI&lt;/strong&gt; o &lt;strong&gt;SageMaker Canvas&lt;/strong&gt;, será necesario realizar una configuración inicial rápida. Para este laboratorio, la configuración de un solo usuario es suficiente.&lt;/p&gt;

&lt;p&gt;Esta opción utiliza valores predeterminados y permite comenzar a trabajar tanto en &lt;strong&gt;SageMaker Studio&lt;/strong&gt; como en &lt;strong&gt;Canvas&lt;/strong&gt; sin configuraciones avanzadas.&lt;/p&gt;

&lt;p&gt;Durante este proceso deberás crear un &lt;strong&gt;SageMaker Domain&lt;/strong&gt;, que actúa como el contenedor lógico donde se organizan los perfiles de usuario, las aplicaciones y los recursos asociados.&lt;/p&gt;

&lt;p&gt;Un dominio está compuesto principalmente por:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Un volumen asociado de &lt;strong&gt;Amazon Elastic File System (Amazon EFS)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Una lista de usuarios autorizados&lt;/li&gt;
&lt;li&gt;Configuraciones de seguridad, aplicaciones, políticas y una &lt;strong&gt;Amazon VPC&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Primer paso: datos crudos
&lt;/h3&gt;

&lt;p&gt;El dataset ha sido cargado previamente en &lt;strong&gt;Amazon S3&lt;/strong&gt;, donde se manejará la data cruda.&lt;/p&gt;

&lt;p&gt;Es importante destacar que el rol de &lt;strong&gt;IAM&lt;/strong&gt; asociado al dominio de SageMaker debe contar con permisos de acceso a S3. De lo contrario, no será posible cargar los datos ni exportar los resultados generados durante el laboratorio.&lt;/p&gt;




&lt;h3&gt;
  
  
  Segundo paso: exploración de los datos con SageMaker Data Wrangler
&lt;/h3&gt;

&lt;p&gt;Dado que nuestro dataset es de tamaño reducido y el objetivo es obtener &lt;em&gt;insights&lt;/em&gt; iniciales, la herramienta más adecuada en este escenario es &lt;strong&gt;SageMaker Data Wrangler&lt;/strong&gt;, que proporciona una solución &lt;em&gt;end-to-end&lt;/em&gt; para importar, preparar, transformar, caracterizar y analizar datos.&lt;/p&gt;

&lt;p&gt;Conforme avancemos en nuestro laboratorio, exploraremos diversas funcionalidades de &lt;strong&gt;Data Wrangler&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Para este laboratorio hice uso de &lt;strong&gt;SageMaker Canvas&lt;/strong&gt;. Una vez ahí, se selecciona &lt;strong&gt;Data Wrangler&lt;/strong&gt;. Al iniciar, haremos uso de su primera funcionalidad: &lt;strong&gt;Importación&lt;/strong&gt;, la cual nos permitirá traer nuestro set de datos desde una amplia variedad de fuentes, entre las que se incluyen:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Amazon S3
&lt;/li&gt;
&lt;li&gt;Amazon Redshift
&lt;/li&gt;
&lt;li&gt;Amazon RDS
&lt;/li&gt;
&lt;li&gt;DynamoDB
&lt;/li&gt;
&lt;li&gt;Archivos locales
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En este laboratorio, el dataset se carga directamente desde &lt;strong&gt;Amazon S3&lt;/strong&gt;, aunque también es posible importar archivos desde el almacenamiento local de tu dispositivo si el escenario lo requiere.&lt;/p&gt;




&lt;h3&gt;
  
  
  Exploración visual y entendimiento de la muestra
&lt;/h3&gt;

&lt;p&gt;La interfaz de &lt;strong&gt;Data Wrangler&lt;/strong&gt; funciona bajo un esquema &lt;em&gt;point and click&lt;/em&gt;, lo que facilita moverse entre distintas vistas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vista de datos
&lt;/li&gt;
&lt;li&gt;Flujo de procesamiento
&lt;/li&gt;
&lt;li&gt;Reportes de &lt;em&gt;insights&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Al observar los datos, es posible identificar de forma inmediata la distribución de valores por columna, lo que permite evaluar rápidamente la calidad de la muestra sin mayor esfuerzo.&lt;/p&gt;

&lt;p&gt;Este paso es clave para entender si el dataset es representativo y si presenta problemas evidentes antes de avanzar.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5glihygn51dx6hrexhty.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5glihygn51dx6hrexhty.png" alt=" " width="800" height="110"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Análisis del set de datos: Data Quality and Insights Report
&lt;/h3&gt;

&lt;p&gt;Antes de aplicar cualquier proceso de limpieza o transformación, me apoyé en el &lt;strong&gt;Data Quality and Insights Report&lt;/strong&gt; de &lt;strong&gt;SageMaker Data Wrangler&lt;/strong&gt;. Este reporte proporciona un resumen automático y muy útil del estado general del dataset.&lt;/p&gt;

&lt;p&gt;Para generarlo, únicamente fue necesario indicar la &lt;strong&gt;columna objetivo&lt;/strong&gt; (&lt;em&gt;Market Price&lt;/em&gt;) y el &lt;strong&gt;tipo de problema&lt;/strong&gt;, que en este caso corresponde a &lt;strong&gt;regresión&lt;/strong&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  ¿Por qué regresión?
&lt;/h4&gt;

&lt;p&gt;Porque el objetivo del modelo es inferir un valor numérico continuo, por ejemplo: &lt;code&gt;0.3&lt;/code&gt;, &lt;code&gt;10&lt;/code&gt;, &lt;code&gt;20&lt;/code&gt; o &lt;code&gt;300&lt;/code&gt; dólares. Es decir, se busca predecir un valor monetario.&lt;/p&gt;

&lt;p&gt;Si el objetivo hubiese sido asignar una etiqueta discreta, como &lt;em&gt;“Rara”&lt;/em&gt; o &lt;em&gt;“Común”&lt;/em&gt;, entonces estaríamos ante un problema de &lt;strong&gt;clasificación&lt;/strong&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Hallazgos del Data Quality and Insights Report
&lt;/h4&gt;

&lt;p&gt;Con estos parámetros definidos, el reporte generado arrojó, entre otros, los siguientes hallazgos relevantes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;71.9%&lt;/strong&gt; de los valores del &lt;em&gt;target&lt;/em&gt; no pudieron convertirse a numérico
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;5.42%&lt;/strong&gt; de filas duplicadas
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skewness (asimetría): 4.81&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kurtosis: 23.4&lt;/strong&gt;, lo que indica la presencia de valores extremos (&lt;em&gt;outliers&lt;/em&gt;)
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A primera vista, el reporte sugiere una alta presencia de valores atípicos. Sin embargo, este comportamiento es esperable y realista en el contexto de tarjetas coleccionables: muchas cartas tienen un valor muy bajo, mientras que unas pocas pueden alcanzar precios significativamente altos o incluso aumentar su valor con el tiempo.&lt;/p&gt;

&lt;p&gt;En términos generales, el dataset no se encuentra en mal estado y refleja adecuadamente la naturaleza del dominio.&lt;/p&gt;

&lt;p&gt;Más adelante abordaremos el tratamiento de valores extremos y columnas de alta cardinalidad (como los nombres). Por ahora, el principal problema identificado es la presencia de valores no numéricos en la variable objetivo, por lo que el siguiente paso se enfocará en la limpieza de estos valores antes de continuar con el proceso de preparación de datos.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs2fkpnf7ndw25tur5dh8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs2fkpnf7ndw25tur5dh8.png" alt=" " width="800" height="322"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpnw4c3wzq76z1bgcje7r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpnw4c3wzq76z1bgcje7r.png" alt=" " width="559" height="561"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Tercerpaso: Transformaciones y limpieza de datos
&lt;/h3&gt;

&lt;p&gt;En el panel lateral se encuentra un conjunto de herramientas que permiten realizar transformaciones y tareas de limpieza de forma intuitiva.&lt;/p&gt;

&lt;p&gt;El primer ajuste realizado fue la corrección de los tipos de datos. Todas las columnas del dataset fueron inicialmente identificadas como &lt;em&gt;string&lt;/em&gt;, por lo que procedí a:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cambiar las columnas relacionadas con precios a tipo &lt;strong&gt;float&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Ajustar otras características numéricas a tipo &lt;strong&gt;long&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F238yalrafvixv1htw4br.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F238yalrafvixv1htw4br.png" alt=" " width="440" height="730"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Manejo de valores faltantes
&lt;/h4&gt;

&lt;p&gt;Tal y como se mencionó en secciones previas, si una columna o fila no aporta valor o genera ruido, lo más recomendable es eliminarla.&lt;/p&gt;

&lt;p&gt;En este caso, el objetivo del modelo será inferir el precio de mercado de una nueva carta, por lo que la variable objetivo es la columna &lt;strong&gt;Market Price&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Las columnas sin valor no aportan al entrenamiento, por lo que el siguiente paso fue eliminar los registros con valores faltantes utilizando la transformación &lt;strong&gt;Drop Missing&lt;/strong&gt;, especificando la columna correspondiente y aplicando la transformación.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Pro Tip 1:&lt;/strong&gt; antes de aplicar cualquier transformación, es posible previsualizar el resultado utilizando la opción &lt;strong&gt;Preview&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  Alta cardinalidad y estrategias de imputación
&lt;/h4&gt;

&lt;p&gt;El dataset contenía varias columnas &lt;em&gt;string&lt;/em&gt; de alta cardinalidad que no aportaban valor al modelo, por ejemplo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Image URL&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Clean Name&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Name&lt;/strong&gt; (esta se conservó solo con fines informativos, pero será eliminada antes del entrenamiento)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Finalmente, una columna clave relacionada con los &lt;em&gt;hits&lt;/em&gt; presentaba valores únicamente para cartas especiales (poco frecuentes por colección), mientras que muchas cartas comunes tenían valores nulos.&lt;/p&gt;

&lt;p&gt;Para este caso se aplicó la transformación &lt;strong&gt;Impute&lt;/strong&gt;, asignando la &lt;strong&gt;media&lt;/strong&gt; como estrategia de imputación.&lt;/p&gt;

&lt;p&gt;En la interfaz visual de &lt;strong&gt;SageMaker Data Wrangler&lt;/strong&gt; es posible visualizar el flujo completo de transformaciones aplicadas al dataset. Estas transformaciones pueden gestionarse directamente desde la vista del flujo o, si se prefiere un enfoque más exploratorio, desde la vista de datos, lo que facilita iterar y ajustar los cambios conforme se avanza en el proceso de preparación.&lt;/p&gt;

&lt;p&gt;Una vez satisfecha con el resultado de la limpieza y transformación, el siguiente paso fue persistir el dataset curado. Aquí surge una pregunta clásica —y muy relevante para el examen—:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Si deseo entrenar un modelo posteriormente, ¿cuál es el formato de datos más adecuado?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;Pregunta de examen.&lt;/strong&gt;  Más adelante verás la elección.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm2tfas1v6zks94u4zx13.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm2tfas1v6zks94u4zx13.png" alt=" " width="800" height="163"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Cuarto paso: Exportación del dataset curado
&lt;/h3&gt;

&lt;p&gt;La conversión se realizó de forma muy sencilla utilizando la opción de exportación de &lt;strong&gt;Data Wrangler&lt;/strong&gt;, tal y como se muestra en la interfaz.&lt;/p&gt;

&lt;p&gt;Al tratarse ya de un dataset curado, le asigné el prefijo &lt;strong&gt;cu_&lt;/strong&gt;, lo almacené en mi bucket de &lt;strong&gt;Amazon S3&lt;/strong&gt; y lo exporté en formato &lt;strong&gt;Parquet&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Adicionalmente:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No apliqué &lt;strong&gt;compresión&lt;/strong&gt;, ya que el tamaño del dataset era reducido.&lt;/li&gt;
&lt;li&gt;No definí &lt;strong&gt;particiones&lt;/strong&gt;, dado que en este caso no existía una dimensión natural que justificara su uso.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sin embargo, vale la pena aclarar el criterio detrás de las particiones. Por ejemplo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;En un dataset de &lt;strong&gt;reservaciones hoteleras&lt;/strong&gt;, una partición por &lt;strong&gt;fecha&lt;/strong&gt; tendría sentido.&lt;/li&gt;
&lt;li&gt;En un dataset de &lt;strong&gt;expedientes clínicos&lt;/strong&gt;, una partición por &lt;strong&gt;ID de paciente&lt;/strong&gt; (identificador único) sería una opción razonable.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En este laboratorio, al tratarse de un conjunto de datos pequeño y con fines académicos, la partición no aportaba un beneficio claro, por lo que se decidió omitirla.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe8ryf4tuji4h8xh15tvi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe8ryf4tuji4h8xh15tvi.png" alt=" " width="469" height="802"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Quinto paso: Consultando los datos curados
&lt;/h3&gt;

&lt;p&gt;Ahora que el dataset curado se encuentra almacenado en &lt;strong&gt;Amazon S3&lt;/strong&gt;, el siguiente objetivo es consultar los datos utilizando &lt;strong&gt;Amazon Athena&lt;/strong&gt;. Sin embargo, antes de llegar a ese punto, incorporaremos una herramienta clave dentro del ecosistema de datos en AWS y fundamental para el examen: &lt;strong&gt;AWS Glue&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Reconozco que, en este escenario particular, podría haberse omitido Glue y definido la tabla de Athena manualmente. No obstante, decidí incluir este paso porque permite introducir un concepto central en arquitecturas de datos modernas en AWS: los &lt;strong&gt;Crawlers&lt;/strong&gt; y el &lt;strong&gt;Glue Data Catalog&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Qué es AWS Glue?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;AWS Glue&lt;/strong&gt; es un servicio de integración de datos totalmente gestionado que facilita la descubierta, preparación y catalogación de datos para análisis, machine learning y &lt;em&gt;data engineering&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;En este laboratorio utilizaremos Glue específicamente para descubrir el esquema del dataset y registrarlo de forma automática en el catálogo.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Qué es un Glue Crawler?
&lt;/h3&gt;

&lt;p&gt;Un &lt;strong&gt;Glue Crawler&lt;/strong&gt; es un componente que:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Recorre (&lt;em&gt;crawl&lt;/em&gt;) datos almacenados en fuentes como &lt;strong&gt;Amazon S3&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Inspecciona los archivos (&lt;strong&gt;CSV&lt;/strong&gt;, &lt;strong&gt;Parquet&lt;/strong&gt;, &lt;strong&gt;JSON&lt;/strong&gt;, etc.)&lt;/li&gt;
&lt;li&gt;Infiere automáticamente el esquema (columnas, tipos de datos, particiones)&lt;/li&gt;
&lt;li&gt;Crea o actualiza tablas en el &lt;strong&gt;Glue Data Catalog&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ¿Qué es el Glue Data Catalog?
&lt;/h3&gt;

&lt;p&gt;El &lt;strong&gt;Glue Data Catalog&lt;/strong&gt; es un &lt;em&gt;metastore&lt;/em&gt; centralizado que mantiene:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bases de datos
&lt;/li&gt;
&lt;li&gt;Tablas
&lt;/li&gt;
&lt;li&gt;Esquemas
&lt;/li&gt;
&lt;li&gt;Ubicación de los datos en &lt;strong&gt;S3&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Metadatos asociados
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Este catálogo no almacena los datos en sí, únicamente los metadatos, y es utilizado por múltiples servicios de análisis y &lt;em&gt;machine learning&lt;/em&gt; en AWS.&lt;/p&gt;

&lt;p&gt;Este paso es necesario porque &lt;strong&gt;Athena no “lee” directamente S3 sin contexto&lt;/strong&gt;. Necesita saber:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dónde están los datos
&lt;/li&gt;
&lt;li&gt;Cómo están estructurados
&lt;/li&gt;
&lt;li&gt;Qué tipos de datos tienen las columnas
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;El &lt;strong&gt;Glue Data Catalog&lt;/strong&gt; provee exactamente esa información. Al ejecutar un crawler:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Glue analiza el dataset en S3
&lt;/li&gt;
&lt;li&gt;Registra la tabla y su esquema en el Data Catalog
&lt;/li&gt;
&lt;li&gt;Athena puede consultar la tabla inmediatamente usando SQL estándar
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Este enfoque no solo reduce errores, sino que además es altamente escalable y reutilizable, especialmente cuando los esquemas evolucionan o se incorporan nuevas particiones.&lt;/p&gt;

&lt;p&gt;Desde una perspectiva de examen, es importante recordar que:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Glue Crawlers automatizan el llenado del catálogo
&lt;/li&gt;
&lt;li&gt;Athena depende del Data Catalog
&lt;/li&gt;
&lt;li&gt;El catálogo desacopla el almacenamiento (&lt;strong&gt;S3&lt;/strong&gt;) del análisis
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En el siguiente paso, con el crawler ejecutado y la tabla registrada, ya estaremos listos para consultar nuestro dataset curado directamente desde Athena.&lt;/p&gt;




&lt;h3&gt;
  
  
  Configuración del Glue Crawler
&lt;/h3&gt;

&lt;p&gt;Antes de ejecutar el crawler, fue necesario completar una serie de pasos previos que permiten organizar y catalogar correctamente los datos que luego serán consumidos por Athena. A continuación, detallo el proceso que llevé a cabo.&lt;/p&gt;

&lt;h4&gt;
  
  
  1. Creación de la base de datos en el Glue Data Catalog
&lt;/h4&gt;

&lt;p&gt;En primer lugar, creé una base de datos en el &lt;strong&gt;Glue Data Catalog&lt;/strong&gt;. Esta base de datos actúa como un contenedor lógico de tablas, similar a un esquema en bases de datos relacionales.&lt;/p&gt;

&lt;p&gt;Definí que esta base de datos estuviera asociada al bucket de &lt;strong&gt;Amazon S3&lt;/strong&gt; donde se almacenan los datasets. Es importante aclarar que esta asociación es meramente académica; en la práctica, el Data Catalog puede referenciar datos ubicados en múltiples buckets y prefijos.&lt;/p&gt;

&lt;h4&gt;
  
  
  2. Creación del Glue Crawler
&lt;/h4&gt;

&lt;p&gt;Posteriormente, procedí a crear el crawler, configurando los siguientes parámetros clave:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Nombre del crawler:&lt;/strong&gt; identificador claro y descriptivo
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fuente de datos (Data Source):&lt;/strong&gt; Amazon S3, apuntando específicamente al prefijo donde se encuentra el dataset curado
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prefijo para el nombre de la tabla:&lt;/strong&gt; definido para mantener consistencia y evitar confusiones en el catálogo
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frecuencia de ejecución:&lt;/strong&gt; configurado para ejecutarse bajo demanda, con el objetivo de evitar ejecuciones innecesarias y posibles impactos en la facturación
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rol de IAM:&lt;/strong&gt; el rol asociado al crawler debe contar, como mínimo, con permisos de lectura sobre el bucket de S3 donde residen los datos, además de permisos para escribir metadatos en el Glue Data Catalog
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhs446rk0p8ervle3tz3g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhs446rk0p8ervle3tz3g.png" alt=" " width="774" height="434"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  3. Ejecución del crawler
&lt;/h4&gt;

&lt;p&gt;Una vez completada la configuración, el crawler se ejecuta manualmente. Al finalizar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Glue analiza los archivos almacenados en &lt;strong&gt;S3&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Infiere el esquema (columnas, tipos de datos y, si aplica, particiones)&lt;/li&gt;
&lt;li&gt;Crea o actualiza la tabla correspondiente en el &lt;strong&gt;Glue Data Catalog&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Con el catálogo poblado correctamente, ya contamos con toda la información necesaria para avanzar al siguiente paso: consultar el dataset curado desde &lt;strong&gt;Amazon Athena&lt;/strong&gt; y empezar a responder preguntas interesantes sobre el mundo de las tarjetas coleccionables utilizando SQL.&lt;/p&gt;




&lt;h3&gt;
  
  
  Consulta del dataset curado con Amazon Athena
&lt;/h3&gt;

&lt;p&gt;Finalmente, con el &lt;strong&gt;Glue Data Catalog&lt;/strong&gt; poblado, podemos avanzar a &lt;strong&gt;Amazon Athena&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Al ingresar a Athena, únicamente es necesario seleccionar la base de datos creada previamente en el Data Catalog. A partir de ese momento, Athena descubre automáticamente las tablas generadas por el crawler y las deja disponibles para su consulta.&lt;/p&gt;

&lt;p&gt;Desde Athena ya es posible ejecutar consultas &lt;strong&gt;SQL estándar&lt;/strong&gt; sobre el dataset curado que construimos a lo largo del laboratorio, sin necesidad de mover o duplicar los datos.&lt;/p&gt;

&lt;p&gt;Athena consulta directamente los archivos almacenados en &lt;strong&gt;Amazon S3&lt;/strong&gt;, apoyándose en los metadatos definidos en el &lt;strong&gt;Data Catalog&lt;/strong&gt; para interpretar correctamente el esquema.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm4x1zahbuzre2tlvfyln.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm4x1zahbuzre2tlvfyln.png" alt=" " width="770" height="343"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Pro Tip 2:&lt;/strong&gt; Una vez finalizado el trabajo en &lt;em&gt;&lt;strong&gt;SageMaker Canvas / Data Wrangler&lt;/strong&gt;&lt;/em&gt;, es fundamental &lt;strong&gt;cerrar la aplicación&lt;/strong&gt; y no dejarla abierta innecesariamente.&lt;br&gt;&lt;br&gt;
Al hacerlo, te aseguras de que no queden &lt;em&gt;&lt;em&gt;jobs&lt;/em&gt;&lt;/em&gt; activos en segundo plano, ya que los costos en este laboratorio están directamente asociados a la ejecución de &lt;strong&gt;Jobs&lt;/strong&gt;.&lt;br&gt;
&lt;em&gt;&lt;strong&gt;Amazon Athena:&lt;/strong&gt;&lt;/em&gt; costo por volumen de datos escaneados en las consultas (beneficiado por el uso de &lt;em&gt;&lt;strong&gt;Parquet&lt;/strong&gt;&lt;/em&gt;)&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Conclusiones importantes
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;SageMaker Data Wrangler&lt;/strong&gt;&lt;/em&gt; es una herramienta sumamente sencilla de utilizar, y en conjunto con &lt;em&gt;&lt;strong&gt;SageMaker Canvas&lt;/strong&gt;&lt;/em&gt;, contribuye de forma clara a democratizar el análisis y la preparación de datos.&lt;/p&gt;

&lt;p&gt;Sin embargo, más allá de la facilidad de uso, es fundamental recordar que cuando se trabaja con datos crudos, estos deben analizarse, limpiarse y transformarse con criterio. No todo se debe eliminar, ni todo se debe conservar: el contexto del problema y el objetivo del modelo son determinantes.&lt;/p&gt;

&lt;p&gt;La selección de la herramienta adecuada es un punto clave y siempre dependerá del caso de uso, del volumen de datos, del nivel de especialización del equipo y de los recursos disponibles.&lt;/p&gt;

&lt;p&gt;Con este laboratorio práctico logramos recorrer un flujo completo y realista en AWS:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Preparamos y limpiamos los datos con &lt;em&gt;&lt;strong&gt;SageMaker Data Wrangler&lt;/strong&gt;&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Catalogamos el dataset utilizando &lt;em&gt;&lt;strong&gt;AWS Glue Crawlers&lt;/strong&gt;&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Analizamos la información de forma interactiva con &lt;em&gt;&lt;strong&gt;Amazon Athena&lt;/strong&gt;&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Este patrón es ampliamente utilizado en arquitecturas de &lt;em&gt;analytics&lt;/em&gt; y &lt;em&gt;machine learning&lt;/em&gt; en AWS, y resume de manera práctica cómo los servicios trabajan de forma integrada para convertir datos crudos en información lista para análisis y entrenamiento de modelos.&lt;/p&gt;

&lt;p&gt;Como puedes observar, a lo largo del proceso también aparecen &lt;em&gt;trade-offs&lt;/em&gt; importantes: facilidad de uso versus flexibilidad, automatización versus control, costo versus escalabilidad, que no solo se evalúan en los exámenes de certificación, sino también en escenarios reales de la vida profesional.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>ai</category>
      <category>machinelearning</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Diario de una builder: Preparándonos para AWS Machine Learning desde cero</title>
      <dc:creator>Diana Castro</dc:creator>
      <pubDate>Fri, 19 Dec 2025 22:57:18 +0000</pubDate>
      <link>https://dev.to/aws-builders/diario-de-una-builder-preparandonos-para-aws-machine-learning-desde-cero-2990</link>
      <guid>https://dev.to/aws-builders/diario-de-una-builder-preparandonos-para-aws-machine-learning-desde-cero-2990</guid>
      <description>&lt;p&gt;Me gusta compartir mi experiencia en la preparación de certificaciones, especialmente cuando el objetivo es &lt;strong&gt;construir criterio y no únicamente aprobar un examen&lt;/strong&gt;. Al final, el valor no está en la certificación en sí, sino en el conocimiento que se adquiere durante el proceso y en cómo este se traduce en crecimiento profesional.&lt;/p&gt;

&lt;p&gt;Actualmente estoy enfocada en obtener las certificaciones de &lt;strong&gt;Machine Learning y AI Developer en AWS&lt;/strong&gt; y, siguiendo las buenas prácticas, recorro con cuidado las guías oficiales de cada examen.&lt;/p&gt;

&lt;p&gt;En este diario documento el camino que sigo para aterrizar conceptos que suelen parecer abstractos cuando se estudian de manera aislada. En más de una ocasión, durante un examen de certificación, aparece alguno de esos detalles trabajados previamente, y es ahí donde confirmo que &lt;strong&gt;aprender construyendo realmente marca la diferencia&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A través de esta serie de artículos comparto ese proceso para que, si estás comenzando en Machine Learning en AWS, puedas apoyarte en experiencias reales y en un enfoque práctico para transitar este camino de aprendizaje.&lt;/p&gt;




&lt;h2&gt;
  
  
  Formatos de datos: un tema menos glamoroso, pero crítico
&lt;/h2&gt;

&lt;p&gt;Quiero comenzar por un tema que suele parecer secundario hasta aburrido de abordar, pero que tiene un impacto directo tanto en los laboratorios, en el entrenamiento de modelos y por supuesto en las certificaciones: &lt;strong&gt;los formatos de datos&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Por qué debe importarnos el formato de los datos?
&lt;/h3&gt;

&lt;p&gt;Es común encontrar preguntas en el examen donde no se evalúa un algoritmo, sino la capacidad de elegir cómo &lt;strong&gt;almacenar, procesar y consumir los datos&lt;/strong&gt; dentro de un flujo de Machine Learning en AWS. En escenarios prácticos, la elección del formato impacta directamente en:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;El rendimiento de los procesos
&lt;/li&gt;
&lt;li&gt;Los costos asociados
&lt;/li&gt;
&lt;li&gt;La capacidad de escalar una solución
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;El primer dominio del examen está relacionado con &lt;strong&gt;Data Preparation for Machine Learning&lt;/strong&gt;, lo que incluye actividades como la ingesta y el almacenamiento de datos. En este contexto comienzan a aparecer conceptos como &lt;strong&gt;formatos de datos validados y no validados&lt;/strong&gt;, tal como se describen en la guía oficial del examen.&lt;/p&gt;

&lt;p&gt;Más allá de memorizar definiciones, este dominio busca que desarrolles criterio para:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cuándo escoger un formato de datos sobre otro
&lt;/li&gt;
&lt;li&gt;Para qué tipos de cargas de trabajo son más efectivos
&lt;/li&gt;
&lt;li&gt;En qué casos de uso aplican dentro de un flujo de ML
&lt;/li&gt;
&lt;li&gt;Con qué servicios y herramientas de AWS son compatibles o no
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Entender estos puntos no solo te ayudará a responder preguntas del examen, sino también a tomar mejores decisiones cuando construyas soluciones reales de Machine Learning en AWS.&lt;/p&gt;




&lt;h2&gt;
  
  
  Iniciando con algo de teoría
&lt;/h2&gt;

&lt;p&gt;Antes de profundizar en los distintos formatos de datos y sus fortalezas, es importante aclarar algunos conceptos que aparecen de forma recurrente en el examen de AWS Machine Learning.&lt;/p&gt;

&lt;h3&gt;
  
  
  Formatos validados
&lt;/h3&gt;

&lt;p&gt;Son aquellos formatos que AWS soporta de manera nativa para procesos de entrenamiento, procesamiento o inferencia, y cuyo uso está documentado oficialmente en los servicios correspondientes, como &lt;strong&gt;Amazon SageMaker&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Formatos no validados
&lt;/h3&gt;

&lt;p&gt;Son formatos que, aunque pueden almacenarse en Amazon S3 u otros servicios de AWS, requieren transformaciones adicionales antes de poder ser utilizados dentro de un flujo de Machine Learning.&lt;/p&gt;

&lt;p&gt;Una vez clara esta distinción, es necesario repasar otro concepto fundamental: &lt;strong&gt;la forma en que los datos se organizan internamente&lt;/strong&gt;. A grandes rasgos, los formatos de datos pueden clasificarse según si almacenan la información por filas (&lt;em&gt;row-based&lt;/em&gt;) o por columnas (&lt;em&gt;column-based&lt;/em&gt;), una diferencia que tiene un impacto directo en el rendimiento y en los costos cuando trabajamos con Machine Learning.&lt;/p&gt;




&lt;h2&gt;
  
  
  Una analogía de la vida real: tarjetas coleccionables
&lt;/h2&gt;

&lt;p&gt;Me gusta mucho trabajar con analogías y ejemplos prácticos. Últimamente, mi hijo se ha convertido en un coleccionista experto de tarjetas Pokemon, así que permíteme compartir un ejemplo de mi vida cotidiana.&lt;/p&gt;

&lt;p&gt;Para un coleccionista, cada tarjeta es un elemento único que consta de varios atributos importantes para definir su valor: &lt;strong&gt;nombre, código, tipo y rareza&lt;/strong&gt; (créeme, hay muchos más atributos como brillo, edición o estado, pero no nos compliquemos).&lt;/p&gt;

&lt;h3&gt;
  
  
  Enfoque orientado a filas (Row-based)
&lt;/h3&gt;

&lt;p&gt;En un enfoque orientado a filas, cada tarjeta se almacena como una unidad completa, con todos sus atributos juntos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tarjeta A: tipo eléctrico, rareza común
&lt;/li&gt;
&lt;li&gt;Tarjeta B: tipo dragón, rareza rara
&lt;/li&gt;
&lt;li&gt;Tarjeta C: tipo psíquico, rareza especial
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Desde la perspectiva del coleccionista, este enfoque es ideal cuando:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Quiere revisar una tarjeta específica
&lt;/li&gt;
&lt;li&gt;Necesita conocer todas las características de una carta en particular
&lt;/li&gt;
&lt;li&gt;Agrega nuevas cartas a su colección una por una
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En los álbumes de mis hijos, cada compartimiento contiene una carta completa. Este enfoque es eficiente cuando se trabaja con registros individuales, pero no es óptimo para analizar grandes volúmenes de tarjetas al mismo tiempo.&lt;/p&gt;

&lt;h3&gt;
  
  
  Enfoque orientado a columnas (Column-based)
&lt;/h3&gt;

&lt;p&gt;En un enfoque orientado a columnas, los atributos de las tarjetas se almacenan por separado:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Todos los nombres juntos
&lt;/li&gt;
&lt;li&gt;Todos los tipos juntos
&lt;/li&gt;
&lt;li&gt;Todas las rarezas juntas
&lt;/li&gt;
&lt;li&gt;Todos los niveles juntos
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Desde la perspectiva del coleccionista, este enfoque resulta ideal cuando quiere:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Encontrar todas las cartas de cierto tipo
&lt;/li&gt;
&lt;li&gt;Analizar la distribución de rarezas en su colección
&lt;/li&gt;
&lt;li&gt;Identificar patrones o tendencias dentro de un conjunto grande de cartas
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Es como reorganizar la colección para analizarla: en lugar de ver carta por carta, se agrupan los atributos para poder comparar rápidamente.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Formato&lt;/th&gt;
&lt;th&gt;Organización&lt;/th&gt;
&lt;th&gt;¿Validado?&lt;/th&gt;
&lt;th&gt;Casos de uso típicos&lt;/th&gt;
&lt;th&gt;¿Comprimido?&lt;/th&gt;
&lt;th&gt;Servicios AWS comunes&lt;/th&gt;
&lt;th&gt;Observaciones&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;JSON&lt;/td&gt;
&lt;td&gt;Row-based&lt;/td&gt;
&lt;td&gt;Sí&lt;/td&gt;
&lt;td&gt;Ingesta de eventos, datos semi-estructurados, APIs&lt;/td&gt;
&lt;td&gt;No por defecto (puede comprimirse)&lt;/td&gt;
&lt;td&gt;S3, Kinesis, Lambda, SageMaker&lt;/td&gt;
&lt;td&gt;Legible para humanos. Soporta datos estructurados y semi-estructurados. Mayor latencia de parsing y overhead de tamaño.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CSV&lt;/td&gt;
&lt;td&gt;Row-based&lt;/td&gt;
&lt;td&gt;Sí&lt;/td&gt;
&lt;td&gt;Datasets pequeños, prototipos, carga inicial&lt;/td&gt;
&lt;td&gt;No por defecto (puede comprimirse)&lt;/td&gt;
&lt;td&gt;S3, SageMaker, Glue&lt;/td&gt;
&lt;td&gt;No soporta esquema ni estructuras complejas. Fácil de producir y consumir, pero poco eficiente a gran escala.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RecordIO&lt;/td&gt;
&lt;td&gt;Binario&lt;/td&gt;
&lt;td&gt;Sí&lt;/td&gt;
&lt;td&gt;Entrenamiento optimizado en SageMaker&lt;/td&gt;
&lt;td&gt;Sí&lt;/td&gt;
&lt;td&gt;SageMaker&lt;/td&gt;
&lt;td&gt;Serializado binario, eficiente y secuencial. No legible para humanos. Requiere procesamiento previo.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Parquet&lt;/td&gt;
&lt;td&gt;Column-based&lt;/td&gt;
&lt;td&gt;Sí&lt;/td&gt;
&lt;td&gt;Big Data, entrenamiento ML, análisis&lt;/td&gt;
&lt;td&gt;Sí (compresión columnar)&lt;/td&gt;
&lt;td&gt;S3, Glue, Athena, SageMaker&lt;/td&gt;
&lt;td&gt;Muy eficiente para consultas y ML. Ideal para grandes volúmenes. No todos los algoritmos built-in lo soportan directamente.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Avro&lt;/td&gt;
&lt;td&gt;Row-based&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Streaming, intercambio de datos&lt;/td&gt;
&lt;td&gt;Sí&lt;/td&gt;
&lt;td&gt;S3, Kafka (MSK), Glue&lt;/td&gt;
&lt;td&gt;Común en pipelines con Kafka. Requiere transformación previa. No recomendado para entrenamiento directo en SageMaker.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Esta tabla resume uno de los &lt;strong&gt;criterios más importantes que evalúa el examen&lt;/strong&gt;: &lt;strong&gt;no todos los formatos sirven para todo&lt;/strong&gt;. Elegir correctamente implica entender el &lt;strong&gt;volumen de datos&lt;/strong&gt;, el &lt;strong&gt;tipo de procesamiento&lt;/strong&gt; y el &lt;strong&gt;servicio de AWS involucrado&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Practiquemos para el examen
&lt;/h2&gt;

&lt;p&gt;Una empresa está construyendo un pipeline de &lt;strong&gt;Machine Learning en AWS&lt;/strong&gt; para entrenar un modelo de clasificación utilizando un dataset de &lt;strong&gt;varios terabytes&lt;/strong&gt; almacenado en &lt;strong&gt;Amazon S3&lt;/strong&gt;.  &lt;/p&gt;

&lt;p&gt;El equipo necesita &lt;strong&gt;reducir el tiempo de entrenamiento&lt;/strong&gt; y &lt;strong&gt;minimizar los costos de I/O&lt;/strong&gt;, ya que el modelo solo utiliza &lt;strong&gt;un subconjunto de las columnas disponibles&lt;/strong&gt; en el dataset.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cuál es el formato de datos más adecuado para este escenario?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;A.&lt;/strong&gt; CSV, porque es fácil de producir y compatible con la mayoría de los servicios de AWS&lt;br&gt;&lt;br&gt;
&lt;strong&gt;B.&lt;/strong&gt; JSON, porque permite manejar datos semi-estructurados de forma flexible&lt;br&gt;&lt;br&gt;
&lt;strong&gt;C.&lt;/strong&gt; Parquet, porque almacena los datos de forma columnar y permite leer solo las columnas necesarias&lt;br&gt;&lt;br&gt;
&lt;strong&gt;D.&lt;/strong&gt; Avro, porque es eficiente para intercambio de datos en sistemas distribuidos  &lt;/p&gt;




&lt;h3&gt;
  
  
  Respuesta correcta
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Parquet&lt;/strong&gt; es un formato &lt;strong&gt;column-based y comprimido&lt;/strong&gt;, lo que permite que los procesos de entrenamiento y análisis lean únicamente las columnas requeridas por el modelo. Esto reduce significativamente el &lt;strong&gt;I/O&lt;/strong&gt;, mejora el &lt;strong&gt;rendimiento&lt;/strong&gt; y disminuye los &lt;strong&gt;costos&lt;/strong&gt;, especialmente cuando se trabaja con grandes volúmenes de datos en &lt;strong&gt;Amazon S3&lt;/strong&gt; y servicios como &lt;strong&gt;Amazon SageMaker, Athena o AWS Glue&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Otra historia hubiera sido si la pregunta estuviera enfocada en &lt;strong&gt;eventos en tiempo real&lt;/strong&gt;, si no se enfocara en &lt;strong&gt;entrenamiento directo&lt;/strong&gt; sino en &lt;strong&gt;ingesta&lt;/strong&gt;.&lt;/p&gt;




&lt;p&gt;Este pequeño &lt;strong&gt;mapa mental&lt;/strong&gt; puede servir como recordatorio rápido del propósito de los principales formatos de datos, tanto para el &lt;strong&gt;examen&lt;/strong&gt; como para la &lt;strong&gt;toma de decisiones en proyectos reales&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo9hotssvmucac8vbv8qp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo9hotssvmucac8vbv8qp.png" alt=" " width="744" height="486"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusión
&lt;/h2&gt;

&lt;p&gt;Entender cuándo usar un formato &lt;strong&gt;orientado a filas&lt;/strong&gt; o a &lt;strong&gt;columnas&lt;/strong&gt;, distinguir entre &lt;strong&gt;formatos validados y no validados&lt;/strong&gt;, y reconocer el &lt;strong&gt;propósito de cada uno dentro de un pipeline&lt;/strong&gt; permite desarrollar el criterio que el examen busca evaluar. Ese mismo criterio es el que luego se traduce en &lt;strong&gt;mejores decisiones técnicas&lt;/strong&gt; cuando diseñamos soluciones de Machine Learning en entornos productivos.&lt;/p&gt;

&lt;p&gt;Este es solo el &lt;strong&gt;primer paso del diario&lt;/strong&gt;. A partir de aquí, el foco estará en cómo &lt;strong&gt;transformar, preparar y consumir estos datos&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>machinelearning</category>
      <category>ai</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Estamos incorporando la IA de forma correcta a nuestras organizaciones, el rumbo lo dirige la necesidad del negocio o implementamos por subirnos a la ola tecnológica. Qué criterios considerar para que la IA generativa tenga el impacto que deseamos?</title>
      <dc:creator>Diana Castro</dc:creator>
      <pubDate>Wed, 27 Aug 2025 20:36:06 +0000</pubDate>
      <link>https://dev.to/dcastrocordero22/estamos-incorporando-la-ia-de-forma-correcta-a-nuestras-organizaciones-el-rumbo-lo-dirige-la-2eje</link>
      <guid>https://dev.to/dcastrocordero22/estamos-incorporando-la-ia-de-forma-correcta-a-nuestras-organizaciones-el-rumbo-lo-dirige-la-2eje</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/aws-builders/como-incorporar-ia-generativa-de-manera-estrategica-metodologia-para-transformar-ideas-en-1od0" class="crayons-story__hidden-navigation-link"&gt;Cómo incorporar IA generativa de manera estratégica: metodología para transformar ideas en resultados reales&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;
          &lt;a class="crayons-logo crayons-logo--l" href="/aws-builders"&gt;
            &lt;img alt="AWS Community Builders  logo" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F2794%2F88da75b6-aadd-4ea1-8083-ae2dfca8be94.png" class="crayons-logo__image"&gt;
          &lt;/a&gt;

          &lt;a href="/dcastrocordero22" class="crayons-avatar  crayons-avatar--s absolute -right-2 -bottom-2 border-solid border-2 border-base-inverted  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1876418%2Fe1e99ea5-7ed6-4e95-9551-0ebcb5468100.jpg" alt="dcastrocordero22 profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/dcastrocordero22" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Diana Castro
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Diana Castro
                &lt;a href="/++"&gt;&lt;img alt="Subscriber" class="subscription-icon" src="https://assets.dev.to/assets/subscription-icon-805dfa7ac7dd660f07ed8d654877270825b07a92a03841aa99a1093bd00431b2.png"&gt;&lt;/a&gt;
              
              &lt;div id="story-author-preview-content-2803658" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/dcastrocordero22" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1876418%2Fe1e99ea5-7ed6-4e95-9551-0ebcb5468100.jpg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Diana Castro&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

            &lt;span&gt;
              &lt;span class="crayons-story__tertiary fw-normal"&gt; for &lt;/span&gt;&lt;a href="/aws-builders" class="crayons-story__secondary fw-medium"&gt;AWS Community Builders &lt;/a&gt;
            &lt;/span&gt;
          &lt;/div&gt;
          &lt;a href="https://dev.to/aws-builders/como-incorporar-ia-generativa-de-manera-estrategica-metodologia-para-transformar-ideas-en-1od0" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Aug 27 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/aws-builders/como-incorporar-ia-generativa-de-manera-estrategica-metodologia-para-transformar-ideas-en-1od0" id="article-link-2803658"&gt;
          Cómo incorporar IA generativa de manera estratégica: metodología para transformar ideas en resultados reales
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/aws"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;aws&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/cloudcomputing"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;cloudcomputing&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/aws-builders/como-incorporar-ia-generativa-de-manera-estrategica-metodologia-para-transformar-ideas-en-1od0" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;1&lt;span class="hidden s:inline"&gt; reaction&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/aws-builders/como-incorporar-ia-generativa-de-manera-estrategica-metodologia-para-transformar-ideas-en-1od0#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              1&lt;span class="hidden s:inline"&gt; comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            6 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>aws</category>
      <category>ai</category>
      <category>cloudcomputing</category>
    </item>
    <item>
      <title>Cómo incorporar IA generativa de manera estratégica: metodología para transformar ideas en resultados reales</title>
      <dc:creator>Diana Castro</dc:creator>
      <pubDate>Wed, 27 Aug 2025 20:06:55 +0000</pubDate>
      <link>https://dev.to/aws-builders/como-incorporar-ia-generativa-de-manera-estrategica-metodologia-para-transformar-ideas-en-1od0</link>
      <guid>https://dev.to/aws-builders/como-incorporar-ia-generativa-de-manera-estrategica-metodologia-para-transformar-ideas-en-1od0</guid>
      <description>&lt;p&gt;La inteligencia artificial está presente en nuestro día a día y ha llegado para quedarse. Ya no es opcional: se ha convertido en la herramienta que marca la diferencia y que tiene el potencial de potenciar nuestras capacidades. En particular, la inteligencia artificial generativa no solo acelera resultados, sino que nos permite enfocarnos en lo que realmente importa.&lt;/p&gt;

&lt;p&gt;De acuerdo con diversos estudios, el 63% de las organizaciones planea incorporar IA en sus operaciones cotidianas. El dilema actual ya no es si adoptarla, sino cómo hacerlo de la manera correcta.&lt;/p&gt;

&lt;p&gt;Sin embargo, lo preocupante es que un porcentaje muy alto de estos proyectos no prospera: se estima que hasta un 95% fracasa. Una de las principales razones es la forma equivocada en que se está incluyendo esta tecnología en las organizaciones. Muchas veces la adopción responde más a la ansiedad de “no quedarse atrás” o a la necesidad de parecer innovadores, que a un análisis real de las necesidades del negocio.&lt;/p&gt;

&lt;p&gt;La prisa por “subirse al tren de la IA” nos lleva a aplicar la tecnología como una solución universal, cuando en realidad no lo es. La pregunta clave no debería ser:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Cómo usamos IA en lo que sea”  &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;sino  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Cuáles son nuestros verdaderos problemas y si la IA es la solución adecuada para ellos”.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;La IA debe integrarse para marcar una diferencia estratégica, no solo para seguir una moda.&lt;/p&gt;




&lt;h2&gt;
  
  
  Cómo decidir de manera más acertada sobre la incorporación de la IA
&lt;/h2&gt;

&lt;p&gt;No existe una receta mágica ni un antídoto infalible para evitar fracasos en proyectos de inteligencia artificial. Cada iniciativa es única y está influenciada por múltiples factores. Sin embargo, antes de embarcarnos en cualquier implementación, es fundamental aplicar una serie de filtros que nos ayuden a discernir si realmente tenemos un caso de uso adecuado, si es viable y si nuestras expectativas están bien definidas. Solo así podremos tomar decisiones informadas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Paso 1: Identificar problemas reales, dolores reales
&lt;/h3&gt;

&lt;p&gt;El punto de partida no debe ser la tecnología, sino las necesidades auténticas del negocio o de tu día a día. Son esos “dolores” los que deben marcar el rumbo.&lt;/p&gt;

&lt;p&gt;Detectar áreas de mejora que resuelvan una problemática concreta permite justificar la inversión y definir con claridad qué buscamos resolver y cuál es el resultado esperado. En otras palabras, las decisiones deben ser guiadas por necesidades reales y no por la moda tecnológica.&lt;/p&gt;

&lt;p&gt;Si pensamos en inteligencia artificial generativa, conviene analizar el entorno y hacerse preguntas como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;¿Existen procesos repetitivos que consumen demasiado tiempo?&lt;/li&gt;
&lt;li&gt;¿Hay tareas que limitan el enfoque en lo realmente importante?&lt;/li&gt;
&lt;li&gt;¿De qué actividades tediosas y costosas nos gustaría deshacernos?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Ejemplo:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Imagina un equipo especializado de investigadores que, en lugar de profundizar en sus líneas de estudio, pasa gran parte del día respondiendo consultas académicas básicas. La información está dispersa en miles de documentos, y gran parte de su jornada se destina a recopilar y compilar material. Este tipo de tareas repetitivas y de bajo valor estratégico son candidatas ideales para ser optimizadas con IA generativa.&lt;/p&gt;

&lt;p&gt;En la experiencia de usuario, podemos mejorar la atención interna y externa: equipos de soporte responden preguntas repetitivas en lugar de mejorar plataformas. Automatizar estas consultas con IA maximiza el uso del tiempo de los recursos técnicos y agiliza la atención del usuario final.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy1cwc4tlbn67jkaqmpcx.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy1cwc4tlbn67jkaqmpcx.jpg" alt=" " width="800" height="1434"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Paso 2: Medir el impacto potencial
&lt;/h3&gt;

&lt;p&gt;Un principio clave: &lt;strong&gt;lo que no se mide, no se puede mejorar&lt;/strong&gt;. Muchas iniciativas de IA no fracasan porque la tecnología no funcione, sino porque no logran demostrar un retorno de inversión que justifique los recursos involucrados.&lt;/p&gt;

&lt;p&gt;Al identificar los puntos de mejora, debemos establecer un ranking de beneficios esperados, definiendo desde el inicio cómo mediremos el impacto. Algunos criterios útiles son:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tiempo ahorrado:&lt;/strong&gt; Horas de trabajo liberadas en el equipo.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reducción de costos:&lt;/strong&gt; Eliminación de procesos manuales que abaratan producción, servicio o tiempos de entrega.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Incremento de ingresos:&lt;/strong&gt; Nuevas capacidades o mejor experiencia del cliente que se traduzca en mayores ventas o retención.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mejora de calidad:&lt;/strong&gt; Reducción de errores, mayor consistencia y experiencia confiable.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Escalabilidad:&lt;/strong&gt; Capacidad de atender un mayor volumen de trabajo sin aumentar recursos de forma proporcional.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Ejemplo práctico:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Generación de historias de usuario: inicialmente cada historia tomaba 4 a 8 horas. Un proyecto con 47 historias representaba más de 200 horas de esfuerzo. Con IA generativa, el tiempo por historia se redujo a 5-30 minutos, logrando ahorro de recursos, mejor calidad y reducción de tiempo de entrega.&lt;/p&gt;




&lt;h3&gt;
  
  
  Paso 3: Evaluar la viabilidad técnica
&lt;/h3&gt;

&lt;p&gt;No todos los problemas son aptos para IA generativa. La clave está en reconocer la naturaleza del problema:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Problemas deterministas:&lt;/strong&gt; Siempre requieren la misma respuesta, explicable paso a paso. Ejemplo: conciliaciones contables, cálculos matemáticos, balanceo de ecuaciones químicas. Estos corresponden al cómputo tradicional o a modelos clásicos de machine learning, no a IA generativa.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Problemas probabilísticos:&lt;/strong&gt; La respuesta puede variar según el contexto, sin una única solución “correcta”. Aquí la IA generativa brilla: generación de texto, resúmenes, preguntas y respuestas, análisis de imágenes, entre otros.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Ejemplo real:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Conciliación de cajeros: exige precisión y trazabilidad, un caso para cómputo tradicional. La IA puede actuar como asistente, pero no ejecutar la conciliación.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Casos híbridos:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
En soporte técnico, la IA generativa puede analizar sentimiento y clasificar texto, mientras que la contabilización de horas corresponde al cómputo tradicional. El valor está en integrar ambos mundos.&lt;/p&gt;




&lt;h3&gt;
  
  
  Paso 4: Validación técnica rápida
&lt;/h3&gt;

&lt;p&gt;Antes de invertir en una prueba de concepto formal, conviene realizar una &lt;strong&gt;validación rápida&lt;/strong&gt; que evitará que iniciemos una etapa más avanzada y nos decepcionemos, el objetivo de esta validación rápida es :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Detectar posibles brechas tempranas.
&lt;/li&gt;
&lt;li&gt;Confirmar disponibilidad de datos en cantidad, calidad y formato adecuado.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Ejemplos:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Test rápido con actas de junta directiva: permite generar resúmenes y preguntas y respuestas.
&lt;/li&gt;
&lt;li&gt;Chatbot de soporte: verifiquemos los datos sabemos que se tiene información de los casos, pero validemos que la documentación de los workarounds y de las soluciones estén presentes antes de desarrollar la POC. Es común encontrar que los datos no son lo que el patrocinador realmente pensaba que eran.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Por otra parte, esta fase ayuda a ubicar el caso de uso en alguno de los cuerpos de una pirámide, llamemosla  &lt;strong&gt;pirámide de complejidad técnica&lt;/strong&gt; entre mas arriba nos ubiquemos en el cuerpo de la misma, mayor será el costo de implementación, propongo esta valoración de complejidad:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F996e64lrclmky96p8d59.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F996e64lrclmky96p8d59.png" alt=" " width="800" height="316"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Primer cuerpo de la pirámide, su base:&lt;/strong&gt; Corresponde a los escenarios que pueden ser resueltos con un buen prompt sobre modelo existente, solo debemos escoger los mejores modelos para la situación en la siguiente fase.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Segundo cuerpo RAG (Retrieval Augmented Generation):&lt;/strong&gt; Estas soluciones requieren conocimiento propio  y la capacidad del modelo. Por ejemplo, necesitamos facilitar las actas de la sesiónes, bases de datos estructuradas o no, entre otros.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tercer cuerpo el afinamiento especializado:&lt;/strong&gt; es tan particular la respuesta tan especializada que aunque le damos información de la empresa no lo logramos, entonces tenemos que subir aun mas y afinar ese modelo.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;La cúspide construir&lt;/strong&gt;: Ligas mayores, estamos hablando de desarrollo de modelos propios, reservado para problemas de gran escala, gran complejidad, muchísima especialización.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Un gran porcentaje de fracasos proviene de construir soluciones propietarias innecesarias. La recomendación: avanzar gradualmente.&lt;/p&gt;




&lt;h3&gt;
  
  
  Paso 5: Prueba de Concepto (POC)
&lt;/h3&gt;

&lt;p&gt;Después de los pasos anteriores, llegamos a la &lt;strong&gt;POC&lt;/strong&gt; su objetivo centrarse en lo que realmente importa, se limita en tiempo y alcance, no interesa interfaz, usabilidad, lo que permita establecer que lo medular del proyecto es lograble y alcanzable por lo tanto su objetivo principal es: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Definir el alcance el core del problema.
&lt;/li&gt;
&lt;li&gt;Validar viabilidad técnica y práctica.
&lt;/li&gt;
&lt;li&gt;Diseñar arquitectura inicial y resolver iterativamente los desafíos.
&lt;/li&gt;
&lt;li&gt;Descarta rápidamente si no funciona la solución&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Acciones clave:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Definir arquitectura deseada.
&lt;/li&gt;
&lt;li&gt;Evaluar modelos disponibles:  esto no es una receta todo depende del caso de uso y podemos estudiar los modelos disponibles ( mas de 160 en Amazon Bedrock) y aplicar  &lt;strong&gt;evaluaciones automatizadas&lt;/strong&gt;  donde obtendremos rendimiento y métricas técnicas y  aplicar como siempre el &lt;strong&gt;criterio humano&lt;/strong&gt; (pertinencia, usabilidad, alineación con el negocio, costo, hasta gustos y preferencias).
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La POC tiene su foco en dos factores críticos: &lt;strong&gt;correctitud&lt;/strong&gt; y &lt;strong&gt;costo&lt;/strong&gt;. Ahora bien una vez que desarrollamos la POC, sabemos si se puede avanzar con este proyecto, elaborarlo completamente ya con mucha más confianza, lo más valioso es que tenemos resultados tangibles, expectativas claras y hasta un vistazo de los costos de la implementación.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusión
&lt;/h2&gt;

&lt;p&gt;La incorporación de IA generativa no debe ser por moda o miedo. Es un &lt;strong&gt;paso estratégico&lt;/strong&gt; que exige:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Claridad de objetivos.
&lt;/li&gt;
&lt;li&gt;Medición de impacto.
&lt;/li&gt;
&lt;li&gt;Validación técnica.
&lt;/li&gt;
&lt;li&gt;Experimentación controlada.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Los cinco pasos presentados —&lt;strong&gt;identificación de problemas reales, medición de impacto, evaluación de viabilidad, validación rápida y POC&lt;/strong&gt;— forman un marco que permite avanzar con seguridad y reducir riesgos.&lt;/p&gt;

&lt;p&gt;El éxito no depende solo del modelo o la infraestructura, sino de &lt;strong&gt;alinear la tecnología con las necesidades del negocio&lt;/strong&gt;, priorizar por impacto y avanzar iterativamente.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Palabra clave:&lt;/strong&gt; intencionalidad. Adoptar la IA con propósito permite transformar procesos, acelerar innovación y liberar talento humano para enfocarse en lo importante. Con estrategia y método, todos podemos ser parte de las grandes ligas de la IA.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>ai</category>
      <category>cloudcomputing</category>
    </item>
    <item>
      <title>Este artículo explica las diferentes opciones de integración de Active Directory con AWS y el uso de Federation mediante una analogía clara: el acceso a edificios y guardias de seguridad. Con este enfoque narrativo, el contenido resulta más accesible para</title>
      <dc:creator>Diana Castro</dc:creator>
      <pubDate>Thu, 21 Aug 2025 14:39:11 +0000</pubDate>
      <link>https://dev.to/dcastrocordero22/este-articulo-explica-las-diferentes-opciones-de-integracion-de-active-directory-con-aws-y-el-uso-228</link>
      <guid>https://dev.to/dcastrocordero22/este-articulo-explica-las-diferentes-opciones-de-integracion-de-active-directory-con-aws-y-el-uso-228</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/aws-builders/rumbo-aws-certified-security-specialty-bitacora-de-vuelo-de-una-builder-aws-directory-services-y-5h03" class="crayons-story__hidden-navigation-link"&gt;Rumbo AWS Certified Security Specialty. Bitácora de vuelo de una builder - AWS Directory Services y Federation&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;
          &lt;a class="crayons-logo crayons-logo--l" href="/aws-builders"&gt;
            &lt;img alt="AWS Community Builders  logo" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F2794%2F88da75b6-aadd-4ea1-8083-ae2dfca8be94.png" class="crayons-logo__image"&gt;
          &lt;/a&gt;

          &lt;a href="/dcastrocordero22" class="crayons-avatar  crayons-avatar--s absolute -right-2 -bottom-2 border-solid border-2 border-base-inverted  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1876418%2Fe1e99ea5-7ed6-4e95-9551-0ebcb5468100.jpg" alt="dcastrocordero22 profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/dcastrocordero22" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Diana Castro
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Diana Castro
                &lt;a href="/++"&gt;&lt;img alt="Subscriber" class="subscription-icon" src="https://assets.dev.to/assets/subscription-icon-805dfa7ac7dd660f07ed8d654877270825b07a92a03841aa99a1093bd00431b2.png"&gt;&lt;/a&gt;
              
              &lt;div id="story-author-preview-content-2784054" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/dcastrocordero22" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1876418%2Fe1e99ea5-7ed6-4e95-9551-0ebcb5468100.jpg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Diana Castro&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

            &lt;span&gt;
              &lt;span class="crayons-story__tertiary fw-normal"&gt; for &lt;/span&gt;&lt;a href="/aws-builders" class="crayons-story__secondary fw-medium"&gt;AWS Community Builders &lt;/a&gt;
            &lt;/span&gt;
          &lt;/div&gt;
          &lt;a href="https://dev.to/aws-builders/rumbo-aws-certified-security-specialty-bitacora-de-vuelo-de-una-builder-aws-directory-services-y-5h03" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Aug 20 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/aws-builders/rumbo-aws-certified-security-specialty-bitacora-de-vuelo-de-una-builder-aws-directory-services-y-5h03" id="article-link-2784054"&gt;
          Rumbo AWS Certified Security Specialty. Bitácora de vuelo de una builder - AWS Directory Services y Federation
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/aws"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;aws&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/security"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;security&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/certification"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;certification&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/cloudcomputing"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;cloudcomputing&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
            &lt;a href="https://dev.to/aws-builders/rumbo-aws-certified-security-specialty-bitacora-de-vuelo-de-una-builder-aws-directory-services-y-5h03#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            13 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>aws</category>
      <category>security</category>
      <category>certification</category>
      <category>cloudcomputing</category>
    </item>
    <item>
      <title>Rumbo AWS Certified Security Specialty. Bitácora de vuelo de una builder - AWS Directory Services y Federation</title>
      <dc:creator>Diana Castro</dc:creator>
      <pubDate>Wed, 20 Aug 2025 02:23:37 +0000</pubDate>
      <link>https://dev.to/aws-builders/rumbo-aws-certified-security-specialty-bitacora-de-vuelo-de-una-builder-aws-directory-services-y-5h03</link>
      <guid>https://dev.to/aws-builders/rumbo-aws-certified-security-specialty-bitacora-de-vuelo-de-una-builder-aws-directory-services-y-5h03</guid>
      <description>&lt;h1&gt;
  
  
  Fecha Estelar 2: AWS Directory Services y Federation
&lt;/h1&gt;

&lt;p&gt;Dentro de la preparación para el &lt;strong&gt;AWS Certified Security -- Specialty&lt;/strong&gt;, descubrí que un tema clave merece especial atención: la integración entre &lt;strong&gt;Active Directory (AD)&lt;/strong&gt; y AWS, así como la &lt;strong&gt;federación de identidades&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Por eso decidí estructurar un repaso práctico: comprender cómo se conectan los directorios corporativos con AWS sin necesidad de replicar identidades, y qué implicaciones tiene para habilitar un acceso seguro y centralizado a los recursos.&lt;/p&gt;




&lt;h2&gt;
  
  
  AWS Directory Services
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Microsoft Active Directory (AD)
&lt;/h3&gt;

&lt;p&gt;Es básicamente el &lt;strong&gt;sistema de identidad y autenticación centralizado&lt;/strong&gt; que usan una gran mayoría de empresas para gestionar usuarios, computadoras y recursos de red en un entorno Windows. Es el gran libro de contactos de la empresa o visto como un edificio el guardia de seguridad que te detiene en la entrada y decide si puedes entrar o no y a qué parte de las instalaciones te puedes dirigir.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Cuál es su función?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Autenticación&lt;/strong&gt;: Verifica quién eres cuando tratas de ingresar al edificio - el portero o guardia te solicita tu carnet de empleado y verifica tu identidad (equivale a usuario y contraseña)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Autorización&lt;/strong&gt;: Define a qué pisos y oficinas puedes acceder una vez dentro - tu carnet tiene permisos específicos: tal vez puedes entrar a contabilidad, pero no a recursos humanos (equivale al acceso a carpetas, aplicaciones, servidores)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Gestión centralizada&lt;/strong&gt;: El departamento de seguridad del edificio mantiene una base de datos central con todos los empleados, sus niveles de acceso y las políticas del edificio (no fumar, no ingresar sin carnet, horarios de acceso). Desde ahí controlan quién puede ir dónde y cuándo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Directorio de objetos&lt;/strong&gt;: Es como el directorio telefónico interno del edificio que almacena información sobre todos los empleados (nombre, departamento, extensión, nivel de acceso), equipos (impresoras, computadoras), salas de juntas, y otros recursos del edificio.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;¿Por qué es importante el tema para nosotros?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Como lo mencioné anteriormente muchas empresas ya tienen AD on-premises y pueden tener necesidades como las siguientes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Extender su identidad existente a la nube&lt;/li&gt;
&lt;li&gt;Usar las mismas credenciales para recursos AWS y on-premises&lt;/li&gt;
&lt;li&gt;Mantener políticas de seguridad consistentes&lt;/li&gt;
&lt;li&gt;Permitir Single Sign-On (SSO)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;AWS Directory Services&lt;/strong&gt; permite integrar o replicar esta funcionalidad en la nube, ya sea conectándote a un AD existente o creando uno nuevo completamente gestionado por AWS y tenemos a nuestra disposición diferentes sabores.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Los conceptos básicos detrás de Active Directory que debemos conocer&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Revisaremos los conceptos fundamentales de Active Directory, ya que al estudiar AWS Directory Services nos encontraremos con términos técnicos como Kerberos, LDAP, entre otros. Mantendremos nuestra analogía del edificio corporativo para explicar estos conceptos de manera sencilla.&lt;/p&gt;

&lt;p&gt;Consideremos al &lt;strong&gt;Controlador de Dominio (DC)&lt;/strong&gt; como el &lt;strong&gt;guardia o portero del edificio&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;El segundo concepto que estudiaremos es &lt;strong&gt;Kerberos&lt;/strong&gt;, este corresponde al &lt;strong&gt;protocolo de autenticación principal en AD&lt;/strong&gt;. En la entrada el DC te dará un &lt;strong&gt;boleto firmado&lt;/strong&gt; que dice: "Diana es Diana y puede visitar el edificio el día de hoy hasta las 5 p.m.". Cuando lleguemos a la sala de reuniones o al comedor solo tendremos que mostrar el boleto y podremos entrar, en este caso cuando quieras abrir una aplicación como QuickSight o SharePoint o las decenas de aplicaciones que usas en el día a día, no hay que realizar todo el protocolo solo enseñamos el boleto firmado es decir no ingreso mi contraseña 20 veces al día.&lt;/p&gt;

&lt;p&gt;El tercer concepto corresponde a &lt;strong&gt;LDAP&lt;/strong&gt; (&lt;strong&gt;Lightweight Directory Access Protocol&lt;/strong&gt;) es el protocolo que usan apps/servicios para &lt;strong&gt;consultar información del directorio&lt;/strong&gt;. Es decir, es el directorio o guía del edificio, y funciona así cuando yo quiero entrar a la sala de junta directiva la secretaria me mira y llama al responsable de la seguridad y le dice tengo a Diana tratando de entrar a la Sala de la Junta Directiva y este le responderá que ni lo sueñe no la encuentro en el directorio como autorizada en ese grupo privilegiado, pero cuando intente entrar al comedor el responsable de la puerta consultará y me dejará ingresar. Cuando yo trato de acceder a QuickSight, este le pregunta al DC: "Dame la lista de todos los usuarios que son del grupo &lt;em&gt;Analistas que son quienes tienen derecho a usar esta aplicación&lt;/em&gt;" y DC responde usando LDAP.&lt;/p&gt;

&lt;p&gt;En algunos edificios la seguridad es extrema y te pedirán otro elemento para identificarte, un segundo factor por ejemplo tu huella, aquí entra &lt;strong&gt;RADIUS&lt;/strong&gt; (&lt;strong&gt;Remote Authentication Dial-In User Service&lt;/strong&gt;) es un protocolo usado para &lt;strong&gt;autenticación centralizada y MFA&lt;/strong&gt;. RADIUS es el segundo elemento de autenticación es el guarda extra que te pide coloques tu dedo índice para verificar que tú eres tú realmente con un segundo elemento.&lt;/p&gt;

&lt;p&gt;Nos queda un elemento importante que veremos más adelante &lt;strong&gt;Trusts&lt;/strong&gt; (confianza) imaginemos que tenemos dos edificios, los guardias de seguridad de cada edificio acuerdan que dejarán ingresar personas del otro edificio siempre que vengan identificadas. La confianza puede ser en un sentido por ejemplo, el guarda del edificio más grande deja pasar a los inquilinos del más pequeño, pero al revés no o en dos vías ambos guardias dejan pasar a los inquilinos de cualquiera de los edificios.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;En resumen:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;&lt;strong&gt;Kerberos&lt;/strong&gt;&lt;/em&gt;: nos ayuda a evitar la fatiga de escribir la contraseña para cada aplicación que tratamos de acceder&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;&lt;strong&gt;LDAP&lt;/strong&gt;&lt;/em&gt;: indica qué permisos tengo y quién soy&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;&lt;strong&gt;RADIUS&lt;/strong&gt;&lt;/em&gt;: agrega una capa de seguridad consultando por algo que tengo&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;&lt;strong&gt;Trust&lt;/strong&gt;&lt;/em&gt;: Confianza, tus amigos son mis amigos también&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdp3t4y9qur9wzkd9v4es.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdp3t4y9qur9wzkd9v4es.png" alt=" " width="800" height="1271"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Los diferentes sabores de AWS Directory Services
&lt;/h2&gt;

&lt;p&gt;AWS Directory Service es un servicio administrado que proporciona capacidades de directorio en la nube AWS y ofrece diversas opciones:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AWS Managed Microsoft AD&lt;/strong&gt;: Active Directory completo en AWS&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AD Connector&lt;/strong&gt;: Proxy que conecta con AD on-premises existente&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Simple AD&lt;/strong&gt;: Directorio LDAP básico basado en Samba 4&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  AD Connector
&lt;/h3&gt;

&lt;p&gt;Imaginemos ahora la empresa abre una sucursal (AWS Cloud) pero no quiere replicar toda la infraestructura de seguridad del edificio principal (datacenter on-premises).&lt;/p&gt;

&lt;p&gt;Entonces implementamos un mecanismo sencillo que aproveche los recursos que ya tenemos, contratamos a un guardia o portero especializado &lt;strong&gt;AD Connector&lt;/strong&gt; en la sucursal que &lt;strong&gt;no tiene acceso directo&lt;/strong&gt; a la base de datos de empleados y realiza los siguientes pasos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cuando alguien quiere entrar, el portero &lt;strong&gt;llama por teléfono/radio&lt;/strong&gt; al edificio principal para verificar credenciales&lt;/li&gt;
&lt;li&gt;Si el edificio principal confirma, el portero autoriza el acceso&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La siguiente figura ilustra en términos técnicos este flujo &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2vd4y7q7i38def2bc0bv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2vd4y7q7i38def2bc0bv.png" alt=" " width="336" height="606"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Beneficios:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No es necesario replicar controladores de dominio en AWS&lt;/li&gt;
&lt;li&gt;Los empleados usan sus credenciales corporativas&lt;/li&gt;
&lt;li&gt;Redirige consultas LDAP/Kerberos al AD original&lt;/li&gt;
&lt;li&gt;Permite acceso a WorkSpaces, QuickSight, EC2 Windows y Consola AWS&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;AD Connector&lt;/strong&gt; es un &lt;strong&gt;proxy service&lt;/strong&gt; que mantiene &lt;strong&gt;toda la información de usuarios en un solo lugar&lt;/strong&gt; - el Active Directory original. La clave está en que no copia, ni sincroniza usuarios: &lt;strong&gt;redirige&lt;/strong&gt; autenticación y consultas (LDAP/Kerberos) a los &lt;strong&gt;controladores de dominio&lt;/strong&gt; existentes. Así puedes usar tus &lt;strong&gt;mismas credenciales corporativas&lt;/strong&gt; para iniciar sesión en servicios como &lt;strong&gt;Amazon WorkSpaces&lt;/strong&gt;, &lt;strong&gt;QuickSight&lt;/strong&gt;, unir &lt;strong&gt;EC2 Windows&lt;/strong&gt; al dominio, e incluso entrar a la &lt;strong&gt;Consola de AWS&lt;/strong&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Características
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Multi-AZ: el conector se despliega por alta disponibilidad en dos subnets en AZ distintas&lt;/li&gt;
&lt;li&gt;Tamaños: Small o Large depende de la cantidad de usuarios y el tamaño de la carga small se recomienda hasta para 500 usuarios y large hasta para 5000&lt;/li&gt;
&lt;li&gt;Cifrado/compatibilidad Kerberos: soporta AES-256/128 HMAC y RC4-HMAC&lt;/li&gt;
&lt;li&gt;Sitios y subredes de AD: mapea las subnets de tu VPC en Active Directory Sites and Services para que el conector "descubra" DCs cercanos (evita latencias cruzadas)&lt;/li&gt;
&lt;li&gt;1:1 por dominio: necesitas un AD Connector por cada dominio (incluye child domains) y cada conector usa su propia cuenta de servicio&lt;/li&gt;
&lt;li&gt;No replica ni sincroniza objetos; no guarda contraseñas&lt;/li&gt;
&lt;li&gt;MFA vía RADIUS existente&lt;/li&gt;
&lt;li&gt;Depende de la conectividad (VPN/Direct Connect) entre VPC y la infraestructura on-premise; si el enlace cae, también caerá la autenticación por AD Connector&lt;/li&gt;
&lt;li&gt;La latencia de la red afecta directamente el rendimiento&lt;/li&gt;
&lt;li&gt;Algunas funciones avanzadas de AD no están disponibles&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La siguiente tabla nos ayudar a clarificar cuando debemos hacer uso de AD Connector y cuando es mejor evitarlo &lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Cuándo Sí&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Cuándo No&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Si tienes AD on-prem y quieres &lt;strong&gt;acceso inmediato&lt;/strong&gt; a servicios AWS con &lt;strong&gt;las mismas credenciales&lt;/strong&gt;, sin levantar DCs en AWS&lt;/td&gt;
&lt;td&gt;Se requieren &lt;strong&gt;integraciones&lt;/strong&gt; que &lt;strong&gt;piden Managed Microsoft AD&lt;/strong&gt; como &lt;strong&gt;RDS SQL Server&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ya tienes un &lt;strong&gt;AD bien gestionado&lt;/strong&gt; y &lt;strong&gt;enlaces de red&lt;/strong&gt; estables/rápidos hacia AWS; buscas &lt;strong&gt;bajo costo operativo&lt;/strong&gt; y &lt;strong&gt;cero sincronización&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Tienes &lt;strong&gt;&amp;gt;5,000 usuarios&lt;/strong&gt; y/o necesitas &lt;strong&gt;trusts&lt;/strong&gt; administrados entre directorios en AWS y on-prem&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  AWS Managed Microsoft AD
&lt;/h3&gt;

&lt;p&gt;Cuando hablamos de &lt;strong&gt;AWS Managed Microsoft AD&lt;/strong&gt;, nos referimos a un &lt;strong&gt;Active Directory real&lt;/strong&gt; ejecutándose como servicio administrado en AWS. No es una "compatibilidad" ni un sustituto: es un AD completo, con controladores de dominio (DCs) corriendo en Windows Server, soportando todas las funciones que conocemos: grupos, trusts, Kerberos, LDAP, GPOs, OUs, etc.&lt;/p&gt;

&lt;p&gt;La clave está en el modelo de responsabilidad compartida:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Nosotros&lt;/strong&gt; administramos el directorio, usuarios, grupos, políticas (GPOs), y estructura organizativa (OUs)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AWS&lt;/strong&gt; se encarga de la infraestructura subyacente: sistema operativo, parches, backups, recuperación ante desastres y disponibilidad&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Características destacadas&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Alta disponibilidad: por defecto despliega dos Domain Controllers en distintas zonas de disponibilidad, garantizando resiliencia automática&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Multi-región: puede implementarse como extensión de tu AD on-premises o bien desplegarse en múltiples regiones para mayor cercanía y continuidad&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Escalable: Podemos pasar de pocos objetos a miles para eso tenemos Versión &lt;em&gt;Standard&lt;/em&gt;: hasta 30,000 objetos (ideal para PYMEs) y Versión &lt;em&gt;Enterprise&lt;/em&gt; hasta 500,000 objetos (grandes corporaciones)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Integración nativa con AWS: se conecta de forma transparente con servicios como Amazon RDS for SQL Server, QuickSight, FSx for Windows File Server, WorkSpaces, entre otros. &lt;em&gt;(Dato clave: RDS no es compatible con AD Connector, pero sí con Managed Microsoft AD)&lt;/em&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Trusts (confianzas): permite establecer confianzas bidireccionales con tu AD on-premises, lo que facilita que usuarios locales accedan a recursos en AWS sin duplicar credenciales&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;¿Qué problemas resuelve?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Elimina la necesidad de administrar tus propios Domain Controllers en la nube&lt;/li&gt;
&lt;li&gt;Facilita la autenticación en aplicaciones que requieren Kerberos o NTLM&lt;/li&gt;
&lt;li&gt;Permite extender tu AD corporativo a AWS de manera transparente y segura&lt;/li&gt;
&lt;li&gt;Soporta la migración de aplicaciones legadas que dependen de AD, sin obligarte a mantener infraestructura on-premises solo para ellas&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;AWS Managed Microsoft AD&lt;/em&gt;&lt;/strong&gt; es la opción para organizaciones que necesitan toda la potencia y compatibilidad de Active Directory, pero desean delegar en AWS la operación, seguridad, alta disponibilidad y escalabilidad del servicio.&lt;/p&gt;

&lt;p&gt;La siguiente tabla nos ayudará a identificar situaciones en las que nos será útil y cuando por el contrario sería contraproducente.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Cuándo Sí&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Cuándo No&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Si necesitas &lt;strong&gt;todas las capacidades de Active Directory real&lt;/strong&gt; (trusts, GPOs, esquema completo)&lt;/td&gt;
&lt;td&gt;Si ya tienes un AD on-premises y &lt;strong&gt;solo quieres que los usuarios usen sus credenciales para loguearse en AWS&lt;/strong&gt; → usa &lt;strong&gt;AD Connector&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Si quieres &lt;strong&gt;administrar usuarios/grupos&lt;/strong&gt; de forma granular como en tu AD local&lt;/td&gt;
&lt;td&gt;Si solo necesitas algo &lt;strong&gt;ligero para apps sencillas&lt;/strong&gt; sin requerimientos avanzados de AD → usa &lt;strong&gt;Simple AD&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Si tienes &lt;strong&gt;apps Windows&lt;/strong&gt; que no funcionan con Simple AD&lt;/td&gt;
&lt;td&gt;Si tu empresa &lt;strong&gt;no usa AD en absoluto&lt;/strong&gt; y no tienes apps que lo requieran&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Si necesitas integrarlo con &lt;strong&gt;servicios de AWS&lt;/strong&gt; que requieren AD "de verdad"&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  Simple AD
&lt;/h3&gt;

&lt;p&gt;El sabor &lt;em&gt;light&lt;/em&gt; de la familia. Y ojo, que no por eso debe subestimarse. Está diseñado pensando en pequeñas empresas o startups que necesitan lo esencial de un Active Directory sin toda la complejidad ---y el costo--- de uno completo.&lt;/p&gt;

&lt;p&gt;Su mayor virtud es precisamente esa: ser la opción económica y práctica. Con Simple AD puedes manejar usuarios, grupos, unir instancias Windows a un dominio y aplicar algunas GPOs básicas. Si lo que buscas es cubrir lo fundamental sin pagar por funciones que nunca vas a usar, este servicio encaja perfecto en la premisa de "usa solo lo que realmente necesitas".&lt;/p&gt;

&lt;p&gt;Además, se despliega automáticamente en dos zonas de disponibilidad dentro de la misma región, lo que le da un nivel de alta disponibilidad muy conveniente para su propósito.&lt;/p&gt;

&lt;p&gt;Eso sí, tiene limitaciones claras: no soporta trusts con AD on-premises, no se integra con todos los servicios de AWS (el más doloroso, en mi opinión, es que no funciona con RDS para SQL Server), tiene un límite de 5,000 usuarios y solo puede vivir en una región. Y si me preguntas, lo que más me molesta es que no soporte MFA... pero bueno, ahí ya entramos en preferencias personales.&lt;/p&gt;

&lt;h3&gt;
  
  
  Resumen comparativo
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Servicio&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Qué es&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Alta disponibilidad&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Casos de uso&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Limitaciones&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;AD Connector&lt;/td&gt;
&lt;td&gt;Un "puente" hacia tu AD on-premise (no almacena usuarios)&lt;/td&gt;
&lt;td&gt;No aplica (solo redirige)&lt;/td&gt;
&lt;td&gt;Útil si ya tienes AD local y solo quieres conectar apps en AWS sin replicar nada&lt;/td&gt;
&lt;td&gt;Necesita siempre que tu AD on-prem esté disponible&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Simple AD&lt;/td&gt;
&lt;td&gt;Un AD básico basado en Samba, hospedado en AWS&lt;/td&gt;
&lt;td&gt;Sí, en 2 AZs de una región&lt;/td&gt;
&lt;td&gt;Apps en AWS que necesitan autenticación AD, pero sin requerir todas las funciones de AD corporativo&lt;/td&gt;
&lt;td&gt;No soporta trusts, funciones avanzadas ni multi-región&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Managed Microsoft AD&lt;/td&gt;
&lt;td&gt;Un AD completo de Microsoft, administrado por AWS&lt;/td&gt;
&lt;td&gt;Sí, en 2 AZs y puede extenderse multi-región&lt;/td&gt;
&lt;td&gt;Empresas que quieren AD real en la nube, integración con Kerberos/NTLM, migraciones o extender AD on-premises&lt;/td&gt;
&lt;td&gt;Más costoso, pero con todas las funciones de AD&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Federation
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Antes de introducir el concepto permítanme a  citar a Les Luthiers pues el tema es similar al anterior pero: &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;"Parecido no es lo mismo caballero"&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Federación&lt;/strong&gt; significa que con una sola identidad puedo acceder a múltiples servicios sin tener que crear cuentas separadas en cada uno. Veámoslo así: Federation aplica cuando quiero entrar a AWS con mi &lt;strong&gt;cuenta corporativa&lt;/strong&gt; (o la de un proveedor de identidades) sin tener que crear usuarios IAM para cada persona.&lt;/p&gt;

&lt;p&gt;En su lugar, otorgamos accesos temporales y seguros mediante STS.&lt;/p&gt;

&lt;p&gt;Ahora bien, existen diversos proveedores de identidad, como &lt;strong&gt;ADFS, Okta, Azure AD o Google Workspace&lt;/strong&gt;, que pueden cumplir ese rol de "recepción central" de nuestras identidades.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conceptos básicos detrás del concepto de federación
&lt;/h3&gt;

&lt;p&gt;Regresemos a los edificios. Pensemos que ahora tenemos &lt;strong&gt;alianzas con empresas externas&lt;/strong&gt; y, definitivamente, los guardias de esos otros edificios &lt;strong&gt;no quieren complicarse registrando a tus inquilinos en su directorio&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;El guardia del edificio aliado confiará en ti: si tú le dices que &lt;strong&gt;Diana trabaja en tu edificio&lt;/strong&gt;, él te creerá y le dejará pasar. Aquí intervienen todos los conceptos importantes de &lt;strong&gt;Federation&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;IdP -- Identity Provider&lt;/strong&gt;:  Corresponde a la &lt;em&gt;&lt;strong&gt;recepción del edificio corporativo&lt;/strong&gt;&lt;/em&gt;. Emitirá un &lt;em&gt;&lt;strong&gt;pase&lt;/strong&gt;&lt;/em&gt; para que tus empleados visiten los edificios aliados Este pase puede ser un &lt;em&gt;&lt;strong&gt;SAML Assertion&lt;/strong&gt;&lt;/em&gt; o un &lt;em&gt;&lt;strong&gt;token OIDC&lt;/strong&gt;&lt;/em&gt;. Ejemplos de IdP: _&lt;strong&gt;ADFS, Okta, Azure AD, Google Workspace&lt;/strong&gt;&lt;br&gt;
_. Piensa en el IdP como la recepción que sabe quién eres y te da un pase confiable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Service Provider&lt;/strong&gt;: Es el edificio aliado. En nuestro caso, la nube de AWS, que no quiere tener un usuario IAM para cada inquilino. Confía en lo que tu IdP le diga y acepta el pase que emitiste.  El guardia del edificio aliado no conoce a Diana personalmente, pero confía en el sello de tu recepción.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Protocolos-- Es el pase _&lt;/strong&gt;SAML*&lt;em&gt;_ un pase o tiquete sellado utilizado por aplicaciones corporativas _&lt;/em&gt;&lt;em&gt;OIDC&lt;/em&gt;*_un pase más moderno basado en OAuth2, como un QR que llevas en tu celular. Ambos permiten que el Service Provider verifique tu identidad sin que tengas que crear usuarios locales.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AWS STS -- Security Token Service&lt;/strong&gt;: Cuando ingresas al otro edificio, el guardia interno emite un &lt;strong&gt;boleto temporal&lt;/strong&gt;. Por ejemplo, &lt;em&gt;válido por una hora&lt;/em&gt;. Este boleto es una &lt;em&gt;credencial temporal&lt;/em&gt; ligada a un &lt;em&gt;rol específico&lt;/em&gt; (AssumeRole). Puedes imaginarlo como ponerte una chaqueta o casco que diga "Analista" o "Cocinera", que determina qué puedes hacer dentro del edificio. Esto garantiza que incluso si pierdes el pase, tu acceso temporal expira y nadie puede usarlo indebidamente.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Muchos conceptos y ¿Por qué no Kerberos?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Kerberos solo funciona para recursos internos, dentro de tu AD.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Si todo está administrado por tu AD, Kerberos permite SSO en la red interna&lt;/li&gt;
&lt;li&gt;Pero si tenemos recursos externos, como aliados o la nube, necesitamos un pase temporal que sea reconocido fuera del dominio&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Es como la diferencia entre &lt;strong&gt;identificación nacional y pasaporte&lt;/strong&gt;: tu DNI te sirve dentro del país, pero para viajar necesitas un documento que otros países reconozcan.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;En Resumen&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;El &lt;strong&gt;IdP&lt;/strong&gt; dice quién eres.&lt;/li&gt;
&lt;li&gt;El &lt;strong&gt;Service Provider&lt;/strong&gt; te deja pasar temporalmente&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;STS + AssumeRole&lt;/strong&gt; te entrega credenciales temporales con permisos específicos.&lt;/li&gt;
&lt;li&gt;Kerberos funciona dentro de tu dominio; &lt;strong&gt;Federation&lt;/strong&gt; es para acceder a recursos externos sin crear usuarios locales.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Un flujo vía Federation
&lt;/h3&gt;

&lt;p&gt;Esta vez Ana será nuestro conejillo de indias:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Ana llega al edificio (AWS Console)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ana se presenta en la recepción del edificio aliado -- es decir abre la página de AWS Console&lt;/li&gt;
&lt;li&gt;La pregunta obvia: &lt;em&gt;"¿Quién eres? Yo no te conozco." Y llaman al edificio del que enviaron a ANA.&lt;/em&gt; AWS redirige la autenticación hacia el &lt;strong&gt;Identity Provider (IdP)&lt;/strong&gt; configurado, por ejemplo &lt;strong&gt;ADFS&lt;/strong&gt; en su empresa&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Va a la recepción de su empresa (IdP)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ana ingresa su usuario y contraseña corporativa en la &lt;strong&gt;recepción central (ADFS)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;El recepcionista confirma: &lt;em&gt;"Sí, Ana trabaja aquí, aquí está su pase."&lt;/em&gt; Técnicamente ADFS autentica contra Active Directory (con Kerberos) y emite un &lt;strong&gt;token SAML&lt;/strong&gt; firmado digitalmente&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Recibe el pase universal (SAML Assertion)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;La recepción le da un &lt;strong&gt;pase con sello de confianza&lt;/strong&gt; que dice: "Esta es Ana, del departamento de Finanzas, tiene permiso para acceder como 'Analista'." El token SAML contiene atributos (nombre, grupos, roles permitidos)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Entrega el pase en la ventanilla de seguridad interna (AWS STS)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ana llega a AWS con el pase. AWS STS lo revisa: &lt;em&gt;"Este pase viene de ADFS, que es de confianza. Todo bien."&lt;/em&gt; AWS &lt;strong&gt;STS (Security Token Service)&lt;/strong&gt; valida el SAML assertion&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Le dan una tarjeta temporal con un rol (AssumeRole)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;La ventanilla de AWS le da una &lt;strong&gt;tarjeta temporal de visitante&lt;/strong&gt; con su rol: "Analista -- válido por 1 hora." STS devuelve &lt;strong&gt;credenciales temporales&lt;/strong&gt; ligadas al rol IAM correspondiente&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Accede al piso correcto (recursos en AWS)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Con su tarjeta temporal, Ana entra al piso de "Reportes Financieros" en AWS. Cuando la tarjeta expira, debe volver a pedir otra. Acceso controlado con &lt;strong&gt;roles temporales&lt;/strong&gt; si se filtra una credencial, expira rápidamente&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fff0pmtb0ej1k1dk5t343.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fff0pmtb0ej1k1dk5t343.png" alt=" " width="800" height="684"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Beneficios&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Solo se usa &lt;strong&gt;credenciales corporativas&lt;/strong&gt; no más usuarios en AWS&lt;/li&gt;
&lt;li&gt;La empresa mantiene el control en &lt;strong&gt;un solo directorio&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;AWS nunca guarda usuarios solo confía en el &lt;strong&gt;pase SAML&lt;/strong&gt; de su IdP&lt;/li&gt;
&lt;li&gt;Los accesos son &lt;strong&gt;temporales y seguros&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Conclusión
&lt;/h2&gt;

&lt;p&gt;Ya exploramos &lt;strong&gt;tres formas de integrar Active Directory con AWS&lt;/strong&gt; y vimos cómo funciona la &lt;strong&gt;federation&lt;/strong&gt; para permitir un acceso seguro y transparente a los usuarios. La clave está en &lt;strong&gt;evaluar tus necesidades&lt;/strong&gt;: el tamaño de la organización, la complejidad que estás dispuesto a manejar y el presupuesto disponible.&lt;/p&gt;

&lt;p&gt;Como siempre, la premisa es clara: &lt;strong&gt;usa solo lo que realmente necesitas&lt;/strong&gt;. Elegir la opción adecuada garantiza seguridad, eficiencia y escalabilidad, sin sobrecargar tu infraestructura ni complicar la administración.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>security</category>
      <category>certification</category>
      <category>cloudcomputing</category>
    </item>
    <item>
      <title>Sostenibilidad no es solo una etiqueta es ventaja competitiva y sostenible. Arquitectos, diseñadores tenemos una gran responsabilidad nuestras decisiones afectan no solo el diseño la seguridad, también la economía y el ambiente</title>
      <dc:creator>Diana Castro</dc:creator>
      <pubDate>Sat, 26 Jul 2025 00:11:34 +0000</pubDate>
      <link>https://dev.to/dcastrocordero22/sostenibilidad-no-es-solo-una-etiqueta-es-ventaja-competitiva-y-sostenible-arquitectos-3jm3</link>
      <guid>https://dev.to/dcastrocordero22/sostenibilidad-no-es-solo-una-etiqueta-es-ventaja-competitiva-y-sostenible-arquitectos-3jm3</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/aws-builders/aws-y-el-pilar-de-la-sostenibilidad-futuro-responsable-ventaja-sostenible-1j4" class="crayons-story__hidden-navigation-link"&gt;AWS y el Pilar de la Sostenibilidad: Futuro Responsable, Ventaja Sostenible&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;
          &lt;a class="crayons-logo crayons-logo--l" href="/aws-builders"&gt;
            &lt;img alt="AWS Community Builders  logo" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F2794%2F88da75b6-aadd-4ea1-8083-ae2dfca8be94.png" class="crayons-logo__image"&gt;
          &lt;/a&gt;

          &lt;a href="/dcastrocordero22" class="crayons-avatar  crayons-avatar--s absolute -right-2 -bottom-2 border-solid border-2 border-base-inverted  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1876418%2Fe1e99ea5-7ed6-4e95-9551-0ebcb5468100.jpg" alt="dcastrocordero22 profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/dcastrocordero22" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Diana Castro
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Diana Castro
                &lt;a href="/++"&gt;&lt;img alt="Subscriber" class="subscription-icon" src="https://assets.dev.to/assets/subscription-icon-805dfa7ac7dd660f07ed8d654877270825b07a92a03841aa99a1093bd00431b2.png"&gt;&lt;/a&gt;
              
              &lt;div id="story-author-preview-content-2709488" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/dcastrocordero22" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1876418%2Fe1e99ea5-7ed6-4e95-9551-0ebcb5468100.jpg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Diana Castro&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

            &lt;span&gt;
              &lt;span class="crayons-story__tertiary fw-normal"&gt; for &lt;/span&gt;&lt;a href="/aws-builders" class="crayons-story__secondary fw-medium"&gt;AWS Community Builders &lt;/a&gt;
            &lt;/span&gt;
          &lt;/div&gt;
          &lt;a href="https://dev.to/aws-builders/aws-y-el-pilar-de-la-sostenibilidad-futuro-responsable-ventaja-sostenible-1j4" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jul 21 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/aws-builders/aws-y-el-pilar-de-la-sostenibilidad-futuro-responsable-ventaja-sostenible-1j4" id="article-link-2709488"&gt;
          AWS y el Pilar de la Sostenibilidad: Futuro Responsable, Ventaja Sostenible
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/aws"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;aws&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/cloud"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;cloud&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/sostenibilidad"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;sostenibilidad&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/productivity"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;productivity&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/aws-builders/aws-y-el-pilar-de-la-sostenibilidad-futuro-responsable-ventaja-sostenible-1j4" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;1&lt;span class="hidden s:inline"&gt; reaction&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/aws-builders/aws-y-el-pilar-de-la-sostenibilidad-futuro-responsable-ventaja-sostenible-1j4#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            4 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>aws</category>
      <category>cloud</category>
      <category>sostenibilidad</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
