<?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>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;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-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#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>
    <item>
      <title>Rumbo AWS Certified Security Specialty – Bitácora de Vuelo de una Builder - ASFF</title>
      <dc:creator>Diana Castro</dc:creator>
      <pubDate>Fri, 25 Jul 2025 23:59:56 +0000</pubDate>
      <link>https://dev.to/aws-builders/rumbo-aws-certified-security-specialty-bitacora-de-vuelo-de-una-builder-asff-ac1</link>
      <guid>https://dev.to/aws-builders/rumbo-aws-certified-security-specialty-bitacora-de-vuelo-de-una-builder-asff-ac1</guid>
      <description>&lt;p&gt;Una de mis metas más ambiciosas para este año —que incluso dejé por escrito en un artículo — es convertirme en &lt;strong&gt;AWS Ambassador&lt;/strong&gt;. Claro, ese reconocimiento no se otorga por azar. Depende de varios factores: el trabajo diario como parte de un partner, la creación de contenido como artículos, conferencias, investigación, y también el nivel de certificación técnica y otros factores más. De todo eso, solo hay algo que realmente está en mis manos: &lt;strong&gt;mi esfuerzo y constancia&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Uno de los hitos clave en ese camino es aprobar dos certificaciones avanzadas. Una de las que seleccioné: &lt;strong&gt;AWS Certified Security – Specialty&lt;/strong&gt;. Esta certificación cubre temas que no solo son requeridos y complejos, sino también profundamente útiles y apasionantes. Representa un verdadero reto, y aunque puede que me toque intentarlo más de una vez, estoy comprometida a lograrlo.&lt;/p&gt;

&lt;p&gt;Llevo ya tiempo estudiando pero he tenido que interrumpir el estudio por muchos factores externos. Recientemente me detuve a pensar:&lt;br&gt;&lt;br&gt;
&lt;strong&gt;¿Y si este camino no lo hago sola? ¿Y si mis apuntes, mis hallazgos, mis dudas y descubrimientos le sirven a otras personas?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;🚀 Así nace esta serie: &lt;strong&gt;Rumbo AWS Certified Security Specialty – Bitácora de Vuelo de una Builder&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Este será un espacio para compartir:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Conceptos clave
&lt;/li&gt;
&lt;li&gt;Cosas que me resultan difíciles
&lt;/li&gt;
&lt;li&gt;Curiosidades o detalles que ayudan a conectar puntos&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Si estás en tu propio viaje hacia esta certificación o simplemente quieres fortalecer tu dominio de la seguridad en AWS, te invito a acompañarme.&lt;/p&gt;




&lt;h2&gt;
  
  
  🗓️ Fecha Estelar 1: ASFF
&lt;/h2&gt;

&lt;p&gt;En esta primera entrada… me encontré con algo inesperado.&lt;/p&gt;

&lt;p&gt;Revisando la guía oficial del examen —como debe ser antes de lanzarse a estudiar en serio— fui leyendo tema por tema, conceptos a dominar como:&lt;/p&gt;

&lt;p&gt;✅ Criptografía&lt;br&gt;&lt;br&gt;
✅ Modelo de responsabilidad compartida&lt;br&gt;&lt;br&gt;
✅ Respuesta ante incidentes&lt;br&gt;&lt;br&gt;
✅ Logging y monitoreo  &lt;/p&gt;

&lt;p&gt;Todo dentro de lo esperado... &lt;strong&gt;hasta que…&lt;/strong&gt; En el dominio de &lt;strong&gt;detección de amenazas y respuesta ante incidentes&lt;/strong&gt;, leo un término que me dejó completamente en blanco:  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;AWS Security Finding Format (ASFF)&lt;/strong&gt;  ¿¡ASFF qué!?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Confieso que tragué grueso. No tenía ni idea de qué era. Y ese tipo de cosas, cuando uno está arrancando un reto grande, pueden sentirse como un golpe al ánimo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Cómo es que nunca había oído hablar de esto?&lt;/strong&gt; , &lt;strong&gt;¿Cómo algo tan importante se me ha pasado por alto?&lt;/strong&gt;  &lt;/p&gt;

&lt;p&gt;Pero luego lo pensé bien: &lt;em&gt;estoy aprendiendo desde el momento en que leo la guía&lt;/em&gt;, y eso ya es un buen comienzo.&lt;/p&gt;

&lt;p&gt;Y ahí me picó la curiosidad  (Por dicha, la curiosidad buena... y no la que mató al gato).&lt;/p&gt;




&lt;h2&gt;
  
  
  🔍 ¿Qué es ASFF?
&lt;/h2&gt;

&lt;p&gt;Antes de ir al grano, empecemos por el principio. Cuando herramientas especializadas como &lt;strong&gt;GuardDuty, Inspector, Detective o Macie&lt;/strong&gt;, entre otros, identifican actividad sospechosa, maliciosa, o una configuración pobremente realizada, se genera un &lt;strong&gt;hallazgo de seguridad&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Aquí es donde entra &lt;strong&gt;ASFF (AWS Security Finding Format)&lt;/strong&gt;, que corresponde a un formato &lt;strong&gt;JSON estandarizado&lt;/strong&gt; para presentar precisamente los hallazgos detectados de manera normalizada. Proporciona una estructura común para facilitar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Integración entre diferentes servicios y con herramientas de terceros
&lt;/li&gt;
&lt;li&gt;Automatizar acciones con EventBridge o Lambda
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;📑 De acuerdo con la documentación oficial de AWS Security Hub, los siguientes atributos top-level son obligatorios para cualquier entrada válida:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Campo&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;AwsAccountId&lt;/td&gt;
&lt;td&gt;ID de la cuenta AWS donde ocurrió el hallazgo.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CreatedAt&lt;/td&gt;
&lt;td&gt;Fecha/hora en que se creó el hallazgo (formato ISO 8601).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Description&lt;/td&gt;
&lt;td&gt;Descripción detallada del hallazgo.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GeneratorId&lt;/td&gt;
&lt;td&gt;Identificador del componente o servicio que generó el hallazgo.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Id&lt;/td&gt;
&lt;td&gt;Identificador único del hallazgo (ej. un ARN).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ProductArn&lt;/td&gt;
&lt;td&gt;ARN del producto que generó el hallazgo (ej. GuardDuty, Macie).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resources&lt;/td&gt;
&lt;td&gt;Lista de recursos afectados (al menos uno, con &lt;code&gt;Type&lt;/code&gt; e &lt;code&gt;Id&lt;/code&gt;).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SchemaVersion&lt;/td&gt;
&lt;td&gt;Versión del esquema ASFF. Actualmente: &lt;code&gt;"2018-10-08"&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Severity&lt;/td&gt;
&lt;td&gt;Severidad del hallazgo (&lt;code&gt;INFORMATIONAL&lt;/code&gt;, &lt;code&gt;LOW&lt;/code&gt;, &lt;code&gt;MEDIUM&lt;/code&gt;, &lt;code&gt;HIGH&lt;/code&gt;, etc.).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Title&lt;/td&gt;
&lt;td&gt;Título del hallazgo.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Types&lt;/td&gt;
&lt;td&gt;Clasificación del hallazgo (ej. tipo MITRE, CVE, vulnerabilidad, etc.).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UpdatedAt&lt;/td&gt;
&lt;td&gt;Fecha/hora de la última actualización del hallazgo (formato ISO 8601).&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🧪 ASFF en casos de la vida real
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;¿Cómo podemos sacarle provecho al ASFF en un escenario real?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Imaginemos que el equipo de seguridad necesita recibir una notificación cada vez que se genere un hallazgo de criticidad &lt;strong&gt;media o alta&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Para lograrlo, podemos crear una &lt;strong&gt;regla en Amazon EventBridge&lt;/strong&gt; que capture cualquier hallazgo de &lt;strong&gt;AWS Security Hub&lt;/strong&gt; con esas características y ejecute una acción automática.&lt;/p&gt;

&lt;h3&gt;
  
  
  El procedimiento sería:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;En &lt;strong&gt;EventBridge&lt;/strong&gt;, creamos una nueva regla.&lt;/li&gt;
&lt;li&gt;Seleccionamos &lt;strong&gt;“Patrón personalizado”&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Insertamos un JSON que contenga al menos los campos mínimos necesarios: el servicio que genera el hallazgo y el nivel de severidad.&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%2F0j85edbfmf6b3w0car3c.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%2F0j85edbfmf6b3w0car3c.png" alt=" " width="800" height="410"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Configuramos un &lt;strong&gt;tema de Amazon SNS&lt;/strong&gt; como destino.&lt;/li&gt;
&lt;li&gt;Definimos los &lt;strong&gt;roles necesarios&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%2F7umf47t3wafvws3lg707.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%2F7umf47t3wafvws3lg707.png" alt=" " width="800" height="423"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;¡Y listo!  &lt;/p&gt;

&lt;p&gt;Ya tenemos una regla que permite al equipo de seguridad enterarse de inmediato cuando se detecta un hallazgo relevante.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✅ Conclusión
&lt;/h2&gt;

&lt;p&gt;Explorar el universo de la seguridad en AWS puede ser desafiante, pero &lt;strong&gt;cada territorio desconocido, cada nebulosa es una oportunidad para aprender y fortalecer nuestra nave&lt;/strong&gt;. Esta certificación no se trata solo de pasar un examen, sino de desarrollar una &lt;strong&gt;mentalidad que priorice la protección, la detección oportuna y la respuesta efectiva&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;La ignorancia no es el enemigo, sino el punto de partida.&lt;br&gt;&lt;br&gt;
Así que si al igual que yo viste algo en la guía y pensaste “¿qué rayos es esto?”, estás en el camino correcto: el del aprendizaje real.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Bitácora cerrada por ahora.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>security</category>
      <category>certification</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
