<?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: Carlos Garcés</title>
    <description>The latest articles on DEV Community by Carlos Garcés (@cgarces).</description>
    <link>https://dev.to/cgarces</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F525213%2Fd5e6e085-ac7a-4fea-82dc-763c5759fb39.jpeg</url>
      <title>DEV Community: Carlos Garcés</title>
      <link>https://dev.to/cgarces</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/cgarces"/>
    <language>en</language>
    <item>
      <title>Deja de usar requests en tus Lambdas: a tu CTO le encantará</title>
      <dc:creator>Carlos Garcés</dc:creator>
      <pubDate>Sun, 25 Oct 2026 20:49:46 +0000</pubDate>
      <link>https://dev.to/aws-builders/deja-de-usar-requests-en-tus-lambdas-a-tu-cto-le-encantara-2ojc</link>
      <guid>https://dev.to/aws-builders/deja-de-usar-requests-en-tus-lambdas-a-tu-cto-le-encantara-2ojc</guid>
      <description>&lt;h2&gt;
  
  
  Introducción: Dos librerías, distinto funcionamiento en AWS Lambda
&lt;/h2&gt;

&lt;p&gt;En el ecosistema de Python, &lt;code&gt;requests&lt;/code&gt; es la opción por defecto para muchos cuando interactúan con HTTP. Bajo el lema «HTTP for Humans» («HTTP para humanos»), &lt;code&gt;requests&lt;/code&gt; ofrece una API intuitiva y de alto nivel que abstrae los mecanismos de cabeceras, parámetros de consulta, cookies y serialización JSON.&lt;/p&gt;

&lt;p&gt;Cualquier desarrollador de Python usa por defecto &lt;code&gt;requests&lt;/code&gt;. Es elegante, intuitiva y prácticamente un sinónimo de HTTP en Python. Por eso, al crear una función en Python que llama a un webhook externo o a un microservicio interno, la reacción inmediata es:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;requests
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sin embargo, bajo esa superficie tan amigable para el desarrollador, &lt;code&gt;requests&lt;/code&gt; en realidad no gestiona las comunicaciones de red de bajo nivel por sí misma. En su lugar, se apoya en &lt;code&gt;urllib3&lt;/code&gt; como motor de transporte subyacente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qué hace realmente cada librería
&lt;/h2&gt;

&lt;p&gt;Para entender por qué deberías prescindir de &lt;code&gt;requests&lt;/code&gt; en Lambda, primero es necesario comprender la relación entre ambos paquetes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;urllib3&lt;/code&gt; es un cliente de transporte HTTP de bajo nivel. Gestiona directamente las conexiones de sockets, el pooling de conexiones, la resolución DNS y los handshakes SSL/TLS.
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;requests&lt;/code&gt; es una capa envolvente de alto nivel, &lt;strong&gt;construida sobre &lt;code&gt;urllib3&lt;/code&gt;&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;requests&lt;/code&gt; no reinventa la rueda; delega el trabajo pesado en &lt;code&gt;urllib3&lt;/code&gt;. Lo que &lt;code&gt;requests&lt;/code&gt; aporta es mejoras de sintaxis: codificación automática de diccionarios, gestión de cookies, serialización JSON integrada y objetos de respuesta de alto nivel.&lt;/p&gt;

&lt;p&gt;Ambas librerías realizan un trabajo similar pero los entornos de ejecución (runtimes) de AWS Lambda ya incluyen preinstalados boto3 y botocore, los cuales dependen directamente de urllib3. Como resultado, urllib3 ya está disponible de forma nativa en cualquier entorno Python de AWS Lambda sin añadir un solo kilobyte al tamaño de tu paquete de despliegue.&lt;/p&gt;

&lt;h2&gt;
  
  
  Actualizaciones del entorno de ejecución: ¿acaso no puede hacerlo otro?
&lt;/h2&gt;

&lt;p&gt;Una de las mayores ventajas operativas de AWS Lambda es el ciclo de vida gestionado de su entorno de ejecución (&lt;strong&gt;Managed Runtime Lifecycle&lt;/strong&gt;); como nos enseñó el episodio &lt;em&gt;Trash of the Titans&lt;/em&gt;, siempre es mejor cuando alguien más lo hace por ti.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cómo gestiona AWS urllib3
&lt;/h3&gt;

&lt;p&gt;Los runtimes de Python en AWS Lambda vienen con el SDK de AWS (&lt;code&gt;boto3&lt;/code&gt; / &lt;code&gt;botocore&lt;/code&gt;) preinstalado. Dado que &lt;code&gt;botocore&lt;/code&gt; depende de &lt;code&gt;urllib3&lt;/code&gt;, &lt;strong&gt;&lt;code&gt;urllib3&lt;/code&gt; ya está presente dentro de tu entorno Lambda sin necesidad de empaquetarlo&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Además, AWS aplica automáticamente parches de seguridad, correcciones de errores menores y actualizaciones de mantenimiento en los runtimes gestionados mediante &lt;a href="https://docs.aws.amazon.com/lambda/latest/dg/runtimes-update.html" rel="noopener noreferrer"&gt;despliegues de runtime en dos fases&lt;/a&gt;. Cuando se corrige una vulnerabilidad en &lt;code&gt;urllib3&lt;/code&gt;, AWS actualiza el entorno subyacente en toda tu flota por ti, sin necesidad de un nuevo despliegue ni de ejecutar tus pipelines de CI/CD.&lt;/p&gt;

&lt;h3&gt;
  
  
  Qué ocurre cuando empaquetas &lt;code&gt;requests&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;requests&lt;/code&gt; &lt;strong&gt;no&lt;/strong&gt; forma parte del runtime nativo de Lambda. Cuando la incluyes en tu archivo zip o en una Lambda Layer, se instalan todas sus dependencias:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;requests==2.34.2
┣━━ ✓ certifi required: &amp;gt;=2023.5.7 installed: 2026.6.17
┣━━ ✓ charset-normalizer required: &amp;gt;=2,&amp;lt;4 installed: 3.4.7
┣━━ ✓ idna required: &amp;gt;=2.5,&amp;lt;4 installed: 3.18
┗━━ ✓ urllib3 required: &amp;gt;=1.26,&amp;lt;3 installed: 2.6.3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este subárbol de dependencias &lt;strong&gt;no&lt;/strong&gt; está gestionado por AWS, y tú eres el responsable de mantenerlo al día, con las siguientes consecuencias:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Tú eres dueño del ciclo de mantenimiento:&lt;/strong&gt; AWS nunca actualizará ni parchará &lt;code&gt;requests&lt;/code&gt; por ti. Si se descubre una vulnerabilidad, todas y cada una de las funciones Lambda que incluyan &lt;code&gt;requests&lt;/code&gt; seguirán expuestas hasta que alguien actualice el archivo &lt;code&gt;requirements.txt&lt;/code&gt;, recompile el artefacto y lo vuelva a desplegar.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exposición a vulnerabilidades de seguridad:&lt;/strong&gt; Los escáneres de seguridad detectan dependencias desactualizadas en CI/CD. Por ejemplo, vulnerabilidades recientes como &lt;a href="https://app.opencve.io/cve/CVE-2026-25645" rel="noopener noreferrer"&gt;CVE-2026-25645&lt;/a&gt; (extracción en rutas temporales predecibles). Sé que sabes que esto probablemente no afecte a un entorno aislado como Lambda, pero las herramientas de seguridad estática (como Amazon Inspector) generarán una alerta automáticamente. Buena suerte explicando a tu equipo de seguridad que un CVE específico es un &lt;em&gt;«falso positivo»&lt;/em&gt;.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aumento de dependencias:&lt;/strong&gt; Empaquetar &lt;code&gt;requests&lt;/code&gt;, &lt;code&gt;certifi&lt;/code&gt;, &lt;code&gt;idna&lt;/code&gt; y &lt;code&gt;charset-normalizer&lt;/code&gt; engorda los paquetes de despliegue, incrementando los tiempos de subida y prolongando ligeramente la descompresión del código en los inicios en frío (&lt;em&gt;cold starts&lt;/em&gt;). Además, estas dependencias adicionales pueden introducir problemas de seguridad imprevistos, como los incidentes recientes con &lt;a href="https://github.com/advisories/GHSA-6q48-6c7w-9gw2" rel="noopener noreferrer"&gt;los paquetes de certifi y los certificados de eMudhra&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Al cambiar a la versión nativa de &lt;code&gt;urllib3&lt;/code&gt; del runtime, eliminas todo un subárbol de dependencias externas y delegas la aplicación de parches de seguridad en AWS.&lt;/p&gt;




&lt;h2&gt;
  
  
  Entendiendo la fase INIT de Lambda
&lt;/h2&gt;

&lt;p&gt;En AWS Lambda, la ejecución se divide en dos fases bien diferenciadas del ciclo de vida:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;La fase de inicialización (INIT):&lt;/strong&gt; Ejecuta todo el código a nivel de módulo que está fuera de &lt;code&gt;lambda_handler&lt;/code&gt;. Esto ocurre una sola vez cuando se arranca un entorno de ejecución.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;La fase de invocación (Invocation):&lt;/strong&gt; Ejecuta &lt;code&gt;lambda_handler(event, context)&lt;/code&gt; en cada petición recibida.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Un antipatrón clásico con &lt;code&gt;requests&lt;/code&gt; es invocar &lt;code&gt;requests.get()&lt;/code&gt; directamente dentro del handler:&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="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;lambda_handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="c1"&gt;# ¡Crea una conexión completamente nueva en cada invocación!
&lt;/span&gt;  &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.example.com/data&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dado que &lt;code&gt;requests.get()&lt;/code&gt; no mantiene estado, cada invocación realiza una nueva resolución DNS, handshake TCP y negociación TLS desde cero. Bajo un alto volumen de tráfico, esto añade algun milisegundo de latencia a cada llamada.&lt;/p&gt;

&lt;h3&gt;
  
  
  La solución: urllib3.PoolManager global
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;urllib3&lt;/code&gt; se articula en torno a &lt;code&gt;PoolManager&lt;/code&gt;, que es seguro para hilos (&lt;em&gt;thread-safe&lt;/em&gt;) y mantiene los sockets abiertos entre invocaciones cuando se declara en el ámbito estático de &lt;code&gt;INIT&lt;/code&gt;:&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="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;urllib3&lt;/span&gt;

&lt;span class="c1"&gt;# Inicializado UNA SOLA VEZ durante la fase INIT de Lambda
&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;urllib3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;PoolManager&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;maxsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;lambda_handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="c1"&gt;# Reutiliza la conexión TCP/TLS existente en invocaciones "warm"
&lt;/span&gt;  &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;GET&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;https://api.example.com/data&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="bp"&gt;...&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como el entorno de ejecución se mantiene activo (&lt;em&gt;warm&lt;/em&gt;) entre invocaciones, la sesión TLS permanece establecida, reduciendo la sobrecarga de red a prácticamente cero en las llamadas subsiguientes.&lt;/p&gt;

&lt;p&gt;Se puede obtener un resultado similar creando un objeto de sesión con la librería requests:&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="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="c1"&gt;# Inicializado UNA SOLA VEZ durante la fase INIT de Lambda
&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Session&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;lambda_handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="c1"&gt;# Reutiliza la conexión TCP/TLS existente en invocaciones "warm"
&lt;/span&gt;  &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.example.com/data&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="bp"&gt;...&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Benchmarks de rendimiento y Cold-Start
&lt;/h3&gt;

&lt;p&gt;Para comprobar el impacto en el rendimiento, se probaron 2 funciones Lambda diferentes utilizando &lt;a href="https://github.com/alexcasalboni/aws-lambda-power-tuning" rel="noopener noreferrer"&gt;aws lambda power tuning&lt;/a&gt; con los mismos parámetros:&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;"lambdaARN"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"lambda_arn"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"powerValues"&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="mi"&gt;128&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"num"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"payload"&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;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Métrica&lt;/th&gt;
&lt;th&gt;
&lt;code&gt;requests&lt;/code&gt; (Handler)&lt;/th&gt;
&lt;th&gt;
&lt;code&gt;urllib3.PoolManager&lt;/code&gt; (INIT)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Tamaño del paquete&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;653 KB&lt;/td&gt;
&lt;td&gt;582 bytes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Inicio en frío (Cold Start)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;840 ms&lt;/td&gt;
&lt;td&gt;915 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Invocación promedio&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;340 ms&lt;/td&gt;
&lt;td&gt;72 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Consumo de memoria&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;63 MB&lt;/td&gt;
&lt;td&gt;56 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Guía de migración: de requests a urllib3
&lt;/h2&gt;

&lt;p&gt;La migración es muy sencilla; cualquier LLM moderno puede hacerla por ti, solo debes indicarle que utilice PoolManager.&lt;/p&gt;

&lt;p&gt;Aquí tienes los reemplazos directos para los patrones más comunes:&lt;/p&gt;

&lt;h3&gt;
  
  
  Patrón 1: Petición GET simple con parámetros de consulta
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Antes (&lt;code&gt;requests&lt;/code&gt;):&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="n"&gt;params&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;status&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;active&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;limit&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.example.com/items&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Después (&lt;code&gt;urllib3&lt;/code&gt;):&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;
  &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;
  &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;urllib3&lt;/span&gt;

  &lt;span class="n"&gt;http&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;urllib3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;PoolManager&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

  &lt;span class="n"&gt;params&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;status&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;active&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;limit&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;GET&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;https://api.example.com/items&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fields&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;5.0&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;utf-8&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;h3&gt;
  
  
  Patrón 2: POST con carga útil (payload) JSON y cabeceras personalizadas
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Antes (&lt;code&gt;requests&lt;/code&gt;):&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="n"&gt;headers&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;Authorization&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;Bearer secret-token&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;payload&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;name&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;Widget&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;price&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;49.99&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.example.com/products&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Después (&lt;code&gt;urllib3&lt;/code&gt;):&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;
  &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;
  &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;urllib3&lt;/span&gt;

  &lt;span class="n"&gt;http&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;urllib3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;PoolManager&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

  &lt;span class="n"&gt;headers&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;Authorization&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;Bearer secret-token&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;Content-Type&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;application/json&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="n"&gt;payload&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;name&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;Widget&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;price&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;49.99&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;POST&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;https://api.example.com/products&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Patrón 3: Configurar reintentos automáticos con backoff exponencial
&lt;/h3&gt;

&lt;p&gt;En &lt;code&gt;requests&lt;/code&gt;, configurar reintentos requiere importar &lt;code&gt;HTTPAdapter&lt;/code&gt; y &lt;code&gt;Retry&lt;/code&gt; y montarlos en una sesión personalizada. En &lt;code&gt;urllib3&lt;/code&gt;, los reintentos son una funcionalidad nativa de primer nivel:&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="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;urllib3&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;urllib3.util&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Retry&lt;/span&gt;

&lt;span class="c1"&gt;# Configurar la estrategia de backoff
&lt;/span&gt;&lt;span class="n"&gt;retries&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Retry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;backoff_factor&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;status_forcelist&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;429&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;502&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;503&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;504&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;raise_on_status&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Asociar los reintentos globalmente al pool manager
&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;urllib3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;PoolManager&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;retries&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;retries&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;lambda_handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;GET&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;https://api.example.com/reliable-endpoint&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Resumen: Por qué deberías dejar de usar requests en tus Lambdas
&lt;/h2&gt;

&lt;p&gt;Pasar de &lt;code&gt;requests&lt;/code&gt; a &lt;code&gt;urllib3&lt;/code&gt; en tus Lambdas le aporta beneficios inmediatos a tu equipo de ingeniería:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Cero dependencias de terceros&lt;/strong&gt; que empaquetar, comprimir en zip o compilar en capas (layers).
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Parches automáticos de vulnerabilidades&lt;/strong&gt; mantenidos directamente por AWS.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Invocaciones promedio más rápidas&lt;/strong&gt; y ejecuciones «warm» ultrarrápidas gracias a pools de conexiones persistentes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Informes de auditoría limpios&lt;/strong&gt; sin avisos de CVE transitivos.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Tu código se mantiene limpio, tus Lambdas se ejecutan más rápido y tu CTO no tendrá que preocuparse por el próximo zero-day en una dependencia.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>performance</category>
      <category>python</category>
      <category>serverless</category>
    </item>
    <item>
      <title>Nuevas instancias T8i, ¿hora de jubilar tus T3i?</title>
      <dc:creator>Carlos Garcés</dc:creator>
      <pubDate>Sat, 19 Sep 2026 19:39:17 +0000</pubDate>
      <link>https://dev.to/aws-builders/nuevas-instancias-t8i-hora-de-jubilar-tus-t3i-2k4j</link>
      <guid>https://dev.to/aws-builders/nuevas-instancias-t8i-hora-de-jubilar-tus-t3i-2k4j</guid>
      <description>&lt;h2&gt;
  
  
  Introducción: ¿Qué ofrece la familia T8i?
&lt;/h2&gt;

&lt;p&gt;Las instancias &lt;strong&gt;Amazon EC2 T8i&lt;/strong&gt; son la versión más reciente de instancias &lt;em&gt;burstable&lt;/em&gt; de bajo costo en AWS. Están impulsadas por el &lt;strong&gt;AWS Nitro System&lt;/strong&gt; y procesadores personalizados &lt;strong&gt;Intel Xeon Scalable de 6.ª generación (Granite Rapids)&lt;/strong&gt;. Diseñadas para cargas de trabajo con uso de CPU de bajo a moderado (como microservicios, entornos de desarrollo/pruebas, sitios web de bajo tráfico y procesamiento por lotes).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Y cual es la diferencia con mis venerables T3?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Arquitectura de procesador antigua:&lt;/strong&gt; Las instancias T3 se lanzaron en 2018, en informática 8 años de diferencia son como los &lt;a href="https://www.purina.es/cuidados/perros/salud/edad-tu-perro-en-anos-humanos" rel="noopener noreferrer"&gt;años de un perro&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3zgdwoziq510o8z1u098.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3zgdwoziq510o8z1u098.jpg" alt="tu t3.medium es más vieja de lo que te imaginas" width="800" height="492"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rendimiento de cómputo inferior:&lt;/strong&gt; Las nuevas instancias T8i ofrecen &lt;strong&gt;hasta un 70% más de rendimiento de cómputo&lt;/strong&gt;, &lt;strong&gt;1.25 veces más ancho de banda de red&lt;/strong&gt; y &lt;strong&gt;2.4 veces más ancho de banda para EBS&lt;/strong&gt; en comparación con las T3.&lt;/p&gt;




&lt;h2&gt;
  
  
  Genial las T8i son mas rápidas, ¿migro ya?
&lt;/h2&gt;

&lt;p&gt;No tan rápido, debido a las mejoras tanto en CPU como en memoria AWS asegura ofrecer &lt;strong&gt;hasta un 30% mejor relación precio-rendimiento&lt;/strong&gt; en comparación con T3. Sin embargo en la &lt;a href="https://aws.amazon.com/blogs/aws/new-low-cost-burstable-amazon-ec2-t8i-instances-are-generally-available/" rel="noopener noreferrer"&gt;nota de prensa&lt;/a&gt; no hablan de que son un 20% mas caras.&lt;/p&gt;

&lt;p&gt;Además hay que tener en cuenta que las T8i no están cubiertas aún por los saving plans y que pueden no estar disponibles en tu región.&lt;/p&gt;




&lt;h2&gt;
  
  
  Alternativas a T3 basadas en costo y rendimiento
&lt;/h2&gt;

&lt;p&gt;Al evaluar una estrategia de migración desde T3, existen diferentes casuísticas según el patrón de uso y el tamaño requerido:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Reemplazo directo a T8i:&lt;/strong&gt; T8i solo ofrece los tamaños &lt;code&gt;nano&lt;/code&gt;, &lt;code&gt;micro&lt;/code&gt;, &lt;code&gt;small&lt;/code&gt; y &lt;code&gt;medium&lt;/code&gt;. El reemplazo directo no tiene riesgo desde el punto de vista del rendimiento ya que se mantiene la cantidad de CPU y memoria.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Instancias de rendimiento dedicado sin créditos (&lt;code&gt;c6a&lt;/code&gt;, &lt;code&gt;m6a&lt;/code&gt;, &lt;code&gt;c7i-flex&lt;/code&gt;):&lt;/strong&gt; Diseñadas para aplicaciones con un uso de CPU continuo o sostenido donde los límites de créditos de la serie T generan sobrecostes o cuellos de botella.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Instancias optimizadas en memoria (&lt;code&gt;r6a&lt;/code&gt;, &lt;code&gt;r8i-flex&lt;/code&gt;):&lt;/strong&gt; Recomendadas para cargas que superan los tamaños de T8i o que requieren mantener el tamaño de la memoria.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Migración a soluciones gestionadas por AWS:&lt;/strong&gt; Es un caso de uso poco habitual, pero en determinadas situaciones una migración de la máquina EC2 a la solución gestionada por AWS puede ahorrar costes.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Escenarios de Migración y Comparativas
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Escenario 1: &lt;code&gt;t3&lt;/code&gt; vs &lt;code&gt;t8i&lt;/code&gt; para tamaños menores a &lt;code&gt;large&lt;/code&gt; (&lt;code&gt;nano&lt;/code&gt;, &lt;code&gt;micro&lt;/code&gt;, &lt;code&gt;small&lt;/code&gt;, &lt;code&gt;medium&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;Para tamaños pequeños, la migración a T8i proporciona un incremento de hasta el 70% en el rendimiento de cálculo y mayor capacidad de red/EBS, logrando una mejora general de precio-rendimiento de hasta el 30%.&lt;/p&gt;

&lt;p&gt;Si en la T3 actual la CPU es cuello de botella, la migración a T8i puede eliminar el cuello de botella.&lt;/p&gt;

&lt;p&gt;Además si la instancia T3 está consumiendo créditos en modo ilimitado, la mejora de CPU causará un menor consumo de créditos, que puede compensar el 20% de incremento de coste.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Métrica / Característica&lt;/th&gt;
&lt;th&gt;Familia T3 (&lt;code&gt;&amp;lt; large&lt;/code&gt;)&lt;/th&gt;
&lt;th&gt;Familia T8i (&lt;code&gt;&amp;lt; large&lt;/code&gt;)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Procesador&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Intel Xeon Platinum (hasta 3.1 GHz)&lt;/td&gt;
&lt;td&gt;Intel Xeon Scalable n (hasta 3.8 GHz)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Rendimiento CPU&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Base previa&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Hasta +70% rendimiento de cómputo&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ancho de banda Red&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Hasta 5 Gbps (&lt;code&gt;t3.medium&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Hasta 6.25 Gbps (&lt;code&gt;t8i.medium&lt;/code&gt;, 1.25x mayor)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ancho de banda EBS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Hasta 2,085 - 2,780 Mbps&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Hasta 2.4x mayor ancho de banda EBS&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ejemplo de Costo On-Demand&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;t3.medium&lt;/code&gt;: &lt;strong&gt;$0.046 / hora&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;t8i.medium&lt;/code&gt;: &lt;strong&gt;$0.055 / hora&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  Escenario 2: &lt;code&gt;t3&lt;/code&gt; vs &lt;code&gt;m6a&lt;/code&gt;, &lt;code&gt;c6a&lt;/code&gt; y &lt;code&gt;c7i-flex&lt;/code&gt; para aplicaciones de alto uso de CPU y poca memoria
&lt;/h3&gt;

&lt;p&gt;En aplicaciones con uso de CPU bajo pero constante, las instancias T3 pueden convertirse en una trampa de costos debido a su arquitectura basada en créditos de CPU:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;El riesgo de los créditos en T3:&lt;/strong&gt; En modo &lt;em&gt;Standard&lt;/em&gt;, si se agotan los créditos acumulados, el rendimiento de la CPU se restringe drásticamente a la línea base (por ejemplo, 30% por vCPU en &lt;code&gt;t3.large&lt;/code&gt;). En modo &lt;em&gt;Unlimited&lt;/em&gt; (activado por defecto), si el uso promediado en 24 horas supera la línea base, AWS cobra &lt;strong&gt;$0.05 adicionales por vCPU-hora&lt;/strong&gt;. Si una instancia &lt;code&gt;t3.large&lt;/code&gt; (2 vCPUs) se ejecuta al 100% de CPU de manera continua, el recargo suma $0.10/hora, elevando el costo total real de ~$0.0835/hora a &lt;strong&gt;~$0.1835/hora&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;La ventaja de &lt;code&gt;m6a&lt;/code&gt;, &lt;code&gt;c6a&lt;/code&gt; y &lt;code&gt;c7i-flex&lt;/code&gt;:&lt;/strong&gt; Estas familias ofrecen vCPUs dedicadas al 100% de rendimiento constante, eliminando la volatilidad de créditos y garantizando una capacidad fija.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Migrar a familias de tipo &lt;code&gt;c&lt;/code&gt; permite cambiar el ratio de CPU y memoria (2 GB de RAM por cada vCPU), esta opción es solo válida si se está usando menos del 50% de memoria en la instancia T3 actual.&lt;/p&gt;

&lt;p&gt;Si por el contrario se quiere mantener el ratio de CPU y memoria se debe optar por una &lt;code&gt;m6a&lt;/code&gt;, esta opción es solo válida si la instancia T3 está consumiendo créditos en modo unlimited, causando costos adicionales.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Instancia&lt;/th&gt;
&lt;th&gt;vCPUs&lt;/th&gt;
&lt;th&gt;Memoria (GiB)&lt;/th&gt;
&lt;th&gt;Arquitectura CPU&lt;/th&gt;
&lt;th&gt;Precio On-Demand (por hora)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;t3.large&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;Intel Xeon 1.ª/2.ª Gen (30% línea base / requiere créditos)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;$0.091&lt;/strong&gt; &lt;em&gt;(+$0.10/h si consume créditos)&lt;/em&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;c6a.large&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;100% Dedicado&lt;/strong&gt; (AMD EPYC)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$0.082&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;m6a.large&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;100% Dedicado&lt;/strong&gt; (AMD EPYC 7R13 @ 3.6 GHz)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$0.096&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;c7i-flex.large&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;100% Dedicado&lt;/strong&gt; (Sapphire Rapids @ 3.2 GHz)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$0.091&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  Escenario 3: &lt;code&gt;t3.xlarge&lt;/code&gt; vs &lt;code&gt;r8i-flex.large&lt;/code&gt; para aplicaciones de bajo uso de CPU y mucha memoria
&lt;/h3&gt;

&lt;p&gt;Dado que T8i no ofrece un tamaño &lt;code&gt;large&lt;/code&gt;, AWS recomienda migrar los tamaños superiores a instancias &lt;strong&gt;Flex&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Si la aplicación no hace un uso intensivo de la CPU y se quiere mantener la cantidad de memoria, es posible reemplazar las instancias t3.xlarge por r8i-flex.large. El procesador de la familia R8i es un 70% mas potente que las CPUs de la familia T3, es posible que aun reduciendo el número de vCPUs a la mitad, la mejora del 70% compense el rendimiento.&lt;/p&gt;

&lt;p&gt;Después de hacer este cambio es necesario monitorizar la CPU del equipo, para confirmar que el rendimiento es aceptable.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Instancia&lt;/th&gt;
&lt;th&gt;vCPUs&lt;/th&gt;
&lt;th&gt;Memoria (GiB)&lt;/th&gt;
&lt;th&gt;Arquitectura CPU&lt;/th&gt;
&lt;th&gt;Precio On-Demand (por hora)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;t3.large&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;Intel Xeon 1.ª/2.ª Gen (30% línea base)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$0.182&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;r8i-flex.large&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;Intel Xeon Scalable Granite Rapids @ 3.9 GHz&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$0.148&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  Escenario 4: Migración a soluciones gestionadas por AWS
&lt;/h3&gt;

&lt;p&gt;Reconozco que es un caso atípico pero he tenido clientes en esta situación.&lt;/p&gt;

&lt;p&gt;Algunas veces tendemos a usar instancias EC2 en vez de las soluciones gestionadas por AWS intentando ahorrar algo de dinero en la factura mensual. Pero a veces estas soluciones se quedan obsoletas debido a cambios de precios en AWS.&lt;/p&gt;

&lt;p&gt;Caso real en uno de mis clientes.&lt;/p&gt;

&lt;p&gt;Maquina t3.micro usada como servidor Redis $0.011 hora. La instancia tenía asociada una IP pública que añadida $0.005 al coste por hora.&lt;/p&gt;

&lt;p&gt;El servidor se levantó hace años, desde entonces muchas cosas han pasado:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;2021 Amazon ofrece &lt;a href="https://aws.amazon.com/about-aws/whats-new/2021/11/amazon-elasticache-supports-t4g-graviton2-based-instances/" rel="noopener noreferrer"&gt;servidores redis con t4g&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;2024 &lt;a href="https://aws.amazon.com/blogs/aws/new-aws-public-ipv4-address-charge-public-ip-insights/" rel="noopener noreferrer"&gt;AWS empieza a cobrar las IPs públicas&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;2025 &lt;a href="https://aws.amazon.com/blogs/database/reduce-your-amazon-elasticache-costs-by-up-to-60-with-valkey-and-cudos/" rel="noopener noreferrer"&gt;AWS lanza Valkey&lt;/a&gt; con un precio por debajo del coste de Redis.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La T3 que montaste pensando en ahorrar dinero, resulta que es mas cara que su equivalente administrado.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Instancia&lt;/th&gt;
&lt;th&gt;Costo On-Demand&lt;/th&gt;
&lt;th&gt;Costo IP&lt;/th&gt;
&lt;th&gt;Total&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;t3.micro&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$0.0110 / hora&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$0.005 / hora&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$0.0160 / hora&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;t4g.micro&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$0.0136 / hora&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$0.0136 / hora&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;(*) En la tabla se han omitido los costes del disco EBS.&lt;/p&gt;

&lt;p&gt;Normalmente migrar una máquina x86 a Arm64 puede conllevar bastante trabajo, pero al delegar en un servicio administrado AWS se encarga de la optimización del sistema para Arm64. Este caso de uso solo tiene sentido en máquinas pequeñas en las que el precio de la IP pública puede tener mas impacto.&lt;/p&gt;

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

&lt;p&gt;La familia &lt;strong&gt;T3 no ha quedado desactualizada&lt;/strong&gt; sigue siendo una opción barata para entornos con poco uso de CPU. Para entornos con tamaños iguales o menores a &lt;code&gt;medium&lt;/code&gt;, la adopción de &lt;strong&gt;T8i&lt;/strong&gt; ofrece ganancias inmediatas de hasta un 70% en rendimiento de procesamiento con un ahorro de precio-rendimiento de hasta el 30%. Para instancias &lt;code&gt;large&lt;/code&gt; o superiores, la migración natural debe dirigirse hacia las instancias &lt;strong&gt;Flex&lt;/strong&gt; (familias 7i u 8i) o hacia alternativas AMD (&lt;code&gt;c6a&lt;/code&gt; / &lt;code&gt;m6a&lt;/code&gt;) para eliminar definitivamente la sobrecarga por gestión de créditos de CPU.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>ec2</category>
    </item>
  </channel>
</rss>
