<?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: Alejandro</title>
    <description>The latest articles on DEV Community by Alejandro (@al3xlp).</description>
    <link>https://dev.to/al3xlp</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%2F1327224%2F3b28984c-9152-4861-aa47-a09c3ca0f40d.jpeg</url>
      <title>DEV Community: Alejandro</title>
      <link>https://dev.to/al3xlp</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/al3xlp"/>
    <language>en</language>
    <item>
      <title>Desmitificando AWS Lambda: Potencia Real con C++ y CMake</title>
      <dc:creator>Alejandro</dc:creator>
      <pubDate>Fri, 12 Dec 2025 18:42:33 +0000</pubDate>
      <link>https://dev.to/al3xlp/desmitificando-aws-lambda-potencia-real-con-c-y-cmake-4n4o</link>
      <guid>https://dev.to/al3xlp/desmitificando-aws-lambda-potencia-real-con-c-y-cmake-4n4o</guid>
      <description>&lt;p&gt;Cuando pensamos en &lt;strong&gt;Serverless&lt;/strong&gt; y &lt;em&gt;AWS Lambda&lt;/em&gt;, nuestra mente suele irse automáticamente a lenguajes interpretados: Python, Typescript. Son geniales, productivos y fáciles de editar en la consola.&lt;/p&gt;

&lt;p&gt;Pero, ¿son la única opción? Definitivamente no. Y más importante aún: ¿Son siempre la mejor opción? Tampoco. &lt;/p&gt;

&lt;p&gt;Hoy vamos a romper el mito de que las Lambdas son solo para scripts ligeros y vamos a ver cómo C++ entra en juego para ofrecernos un rendimiento brutal y tiempos de ejecución predecibles. Para ello, analizaremos la pieza clave que a menudo asusta a los desarrolladores: el sistema de construcción con CMake.&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%2Fx0linyd0281xirbylaio.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%2Fx0linyd0281xirbylaio.png" alt="Lambda en binario compilada vista desde consola" width="800" height="406"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;La Lambda no es una caja negra: El Rol del Runtime&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A veces vemos a AWS como una caja mágica donde subes código y "simplemente funciona". Pero AWS es ingeniería pura, y entenderla nos da poder.&lt;/p&gt;

&lt;p&gt;Las Lambdas no ejecutan tu código por arte de magia. Necesitan un Runtime. En Python o Node, AWS te da el runtime pre-cocinado. Pero en C++, Go o Rust, tú puedes controlar ese entorno.&lt;/p&gt;

&lt;p&gt;¿Qué hace realmente el Runtime? No es más que un bucle infinito (un loop) que hace peticiones HTTP a una API interna de AWS.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Pregunta: "¿Hay trabajo nuevo?"
2. Si sí: Ejecuta tu función.
3. Envía la respuesta de vuelta a AWS.
4. Repite.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Al usar C++, no estamos "hackeando" Lambda; estamos usando el Custom Runtime API. Y para no tener que escribir ese bucle HTTP nosotros mismos, usamos la librería aws-lambda-runtime.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;El Código: Simpleza en C++&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Para demostrar que esto no es ciencia de cohetes, mira este main.cpp. Es todo lo que necesitas para una Lambda funcional:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;aws/lambda-runtime/runtime.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="k"&gt;namespace&lt;/span&gt; &lt;span class="n"&gt;aws&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;lambda_runtime&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Tu lógica de negocio va aquí&lt;/span&gt;
&lt;span class="n"&gt;invocation_response&lt;/span&gt; &lt;span class="nf"&gt;my_handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;invocation_request&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&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;invocation_response&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;success&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello, World!"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"application/json"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="c1"&gt;// Aquí inicia el bucle infinito del Runtime que mencionamos antes&lt;/span&gt;
   &lt;span class="n"&gt;run_handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;my_handler&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
   &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&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;p&gt;¿Ves el run_handler? Ese es el puente. Ese es el código que conecta tu función my_handler con la infraestructura de Amazon.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;El Arquitecto: Explicando el CMakeLists.txt&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Aquí es donde muchos se detienen. C++ requiere compilación, y en el mundo de AWS, necesitamos empaquetar todo (binario + dependencias) en un archivo .zip.&lt;/p&gt;

&lt;p&gt;Afortunadamente, el SDK de C++ para Lambda nos hace la vida fácil. Analicemos el archivo de configuración línea por línea:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cmake"&gt;&lt;code&gt;
&lt;span class="nb"&gt;cmake_minimum_required&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;VERSION 3.5&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;CMAKE_CXX_STANDARD 11&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;project&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;hello LANGUAGES CXX&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nb"&gt;find_package&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;aws-lambda-runtime REQUIRED&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;add_executable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PROJECT_NAME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="s2"&gt;"main.cpp"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;target_link_libraries&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PROJECT_NAME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; PUBLIC AWS::aws-lambda-runtime&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;aws_lambda_package_target&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PROJECT_NAME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El desglose paso a paso:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configuración Básica:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cmake"&gt;&lt;code&gt;
&lt;span class="nb"&gt;cmake_minimum_required&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;VERSION 3.5&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;CMAKE_CXX_STANDARD 11&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;project&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;hello LANGUAGES CXX&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nada fuera de lo común aquí. Definimos el proyecto y establecemos C++11 como estándar.&lt;/p&gt;

&lt;p&gt;Encontrando el "Pegamento" (El Runtime):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cmake"&gt;&lt;code&gt;&lt;span class="nb"&gt;find_package&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;aws-lambda-runtime REQUIRED&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esta es la línea crítica. Le dice a CMake: "Busca en el sistema la librería aws-lambda-runtime". Ojo: Para que esto funcione, debes haber instalado previamente el AWS Lambda C++ Runtime en tu entorno de compilación (o en tu contenedor Docker de CI/CD). Esta librería contiene la lógica del bucle de eventos.&lt;/p&gt;

&lt;p&gt;Creando el Ejecutable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cmake"&gt;&lt;code&gt;
&lt;span class="nb"&gt;add_executable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PROJECT_NAME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="s2"&gt;"main.cpp"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Compila nuestro main.cpp y crea un binario llamado hello (el nombre del proyecto).&lt;/p&gt;

&lt;p&gt;El Linkeo (La conexión):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cmake"&gt;&lt;code&gt;&lt;span class="nb"&gt;target_link_libraries&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PROJECT_NAME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; PUBLIC AWS::aws-lambda-runtime&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aquí es donde ocurre la magia del enlazado. Unimos nuestro código con la librería de AWS. Esto inyecta toda la funcionalidad necesaria para que run_handler se comunique con la API de Lambda.&lt;/p&gt;

&lt;p&gt;El Empaquetado Automático:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cmake"&gt;&lt;code&gt;&lt;span class="nf"&gt;aws_lambda_package_target&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PROJECT_NAME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esta es la joya de la corona. Esta función no es de CMake estándar; es una utilidad que provee la librería de AWS. ¿Qué hace?&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Toma tu ejecutable.

Busca las dependencias compartidas necesarias.

Lo comprime todo en un hello.zip listo para subir a la consola de AWS o desplegar vía Terraform/CDK.

Te ahorra escribir scripts de bash manuales para hacer el zip.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Asi se ve la configuració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%2F0twjscwl2m7gg0gt87bv.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%2F0twjscwl2m7gg0gt87bv.png" alt="Configuración con custom runtime **Amazon Linux 2023**" width="800" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Reflexión: AWS te hace productivo, no ciego
&lt;/h2&gt;

&lt;p&gt;Este ejemplo de C++ nos enseña algo valioso sobre la filosofía de AWS.&lt;/p&gt;

&lt;p&gt;A menudo, la "nube" se siente como una abstracción que nos quita control a cambio de comodidad. Pero herramientas como el Runtime API y este SDK de C++ demuestran que AWS no es una caja negra hermética.&lt;/p&gt;

&lt;p&gt;Nos dan las herramientas para ser productivos (como aws_lambda_package_target que automatiza el zip), pero nos dejan la puerta abierta para bajar al nivel del sistema operativo, gestionar la memoria manualmente y optimizar cada milisegundo de ejecución si nuestro negocio lo requiere.&lt;/p&gt;

&lt;p&gt;Usar C++ en Lambda no es solo por "velocidad"; es por tener el control total de lo que sucede en tu infraestructura, pagando solo por los milisegundos que realmente usas.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>lambda</category>
      <category>cpp</category>
    </item>
    <item>
      <title>Use the correct version</title>
      <dc:creator>Alejandro</dc:creator>
      <pubDate>Sun, 16 Jun 2024 08:31:49 +0000</pubDate>
      <link>https://dev.to/al3xlp/use-the-correct-version-nkg</link>
      <guid>https://dev.to/al3xlp/use-the-correct-version-nkg</guid>
      <description>&lt;p&gt;When developing software, it's very common, and perhaps necessary, to check for the version of your programming language that best fits your technical requirements in terms of support, third-party libraries, or even compatibility with your operating system.&lt;/p&gt;

&lt;p&gt;It's a very common error to simply select the latest version, use a package manager like NPM or PIP, and start coding right away. Just because our favorite programming languages have cool and very sugary syntax, it doesn't mean it's always the best choice.&lt;/p&gt;

&lt;p&gt;Here is where the issue begins. So, where exactly is the problem?&lt;/p&gt;

&lt;h2&gt;
  
  
  Problems
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Compatibility&lt;/strong&gt;: &lt;br&gt;
When you change the OS version or type (e.g., Windows to macOS) sometimes it comes with a pre-installed version that doesn't match the one you need and change OS version can lead in issues that you don't want.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Support&lt;/strong&gt;: &lt;br&gt;
When you need to provide support for an app that use an older or newer version than the one you usually use.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Performance&lt;/strong&gt;: &lt;br&gt;
When you need to upgrade a dependency for performance issues that was solved in new releases.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Security&lt;/strong&gt;: &lt;br&gt;
Sometimes it a must change version in order to upgrade a dependency due to security risk.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Solution (at least with node):
&lt;/h2&gt;

&lt;p&gt;To address these problems, developers can use Node Version Manager (nvm), a powerful tool designed to manage multiple Node.js versions on a single machine. Here’s how &lt;a href="https://github.com/nvm-sh/nvm" rel="noopener noreferrer"&gt;nvm&lt;/a&gt; can help:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Seamless Version Switching:&lt;/strong&gt;&lt;br&gt;
With simple commands, you can switch to the required version, ensuring compatibility and stability.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Project-Specific Versions:&lt;/strong&gt;&lt;br&gt;
You can specify a version for each project. This ensures that each project runs with the version it was developed and tested on, minimizing compatibility and performance issues.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Simplified Management:&lt;/strong&gt;&lt;br&gt;
Simplifies the management of versions. You can install, update, and uninstall versions with ease, ensuring that your development environment remains clean and organized. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Consistency Across Environments:&lt;/strong&gt;&lt;br&gt;
Ensure that the version used in development matches the versions used in testing and production environments. This consistency reduces the likelihood of encountering environment-specific bugs, leading to a more stable and reliable application.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Enhanced Productivity:&lt;/strong&gt;&lt;br&gt;
The ability to quickly switch versions and maintain project-specific configurations enhances productivity and streamlines the development process.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>development</category>
    </item>
  </channel>
</rss>
