<?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: Rubén Rodríguez</title>
    <description>The latest articles on DEV Community by Rubén Rodríguez (@nanu).</description>
    <link>https://dev.to/nanu</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%2F1235556%2Fa9507c7f-51ff-4069-8917-c2c6e31d2c91.PNG</url>
      <title>DEV Community: Rubén Rodríguez</title>
      <link>https://dev.to/nanu</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nanu"/>
    <language>en</language>
    <item>
      <title>EKS Auto Mode: Kubernetes sin drama😝</title>
      <dc:creator>Rubén Rodríguez</dc:creator>
      <pubDate>Mon, 23 Mar 2026 08:07:05 +0000</pubDate>
      <link>https://dev.to/aws-espanol/eks-auto-mode-kubernetes-sin-drama-1afk</link>
      <guid>https://dev.to/aws-espanol/eks-auto-mode-kubernetes-sin-drama-1afk</guid>
      <description>&lt;p&gt;Llevábamos tiempo queriendo dedicarle un rato a EKS Auto Mode, pero entre proyectos, eventos y vacaciones no conseguíamos encontrar ese hueco. Hoy lo hemos encontrado. &lt;/p&gt;

&lt;p&gt;Y es que una de las conversaciones recurrentes con compañeros, clientes y jefes es precisamente cómo la tecnología está evolucionando para automatizar capas de infraestructura que antes requerían expertise y horas de configuración.&lt;br&gt;
Nuestra respuesta es siempre la misma: la tecnología no elimina el conocimiento. Donde antes necesitabas configurar Karpenter, gestionar AMIs, parchear nodos y mantener add-ons... ahora puedes focalizarte en arquitectura, seguridad y en construir cosas que aporten valor de otra manera.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Qué es EKS Auto Mode?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Podríamos explicarlo de muchas maneras pero ya nos conocéis, nos gusta ser directos:&lt;/p&gt;

&lt;p&gt;AWS gestiona por ti el autoscaling de nodos (con Karpenter), networking de pods, load balancing, DNS, almacenamiento EBS, parches del SO y rotación de nodos. Tú te centras en tus cargas de trabajo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Qué ventajas nos da esto?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AWS gestiona los add-ons core. No los ves, no los tocas, no los parcheas.&lt;/li&gt;
&lt;li&gt;Karpenter gestionado por AWS, sin instalación ni configuración.&lt;/li&gt;
&lt;li&gt;NodePools y NodeClasses disponibles para tener flexibilidad sobre tus nodos.&lt;/li&gt;
&lt;li&gt;Optimización de costes gracias a la consolidación automática de Karpenter.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;¡Al lio!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Para el test hemos utilizado el módulo oficial de la community &lt;a href="https://github.com/terraform-aws-modules/terraform-aws-eks/tree/master/examples/eks-auto-mode" rel="noopener noreferrer"&gt;eks-auto-mode&lt;/a&gt;, modificando la llamada para adaptarla a este caso. Lo importante del módulo es que con "&lt;em&gt;compute_config.enabled = true&lt;/em&gt;" activamos Auto Mode completo.&lt;/p&gt;

&lt;p&gt;Parece broma pero sí.🥶Es así de fácil.🥶&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Qué crea Auto Mode automáticamente?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Una vez desplegado el cluster, veamos como se gestiona Karpenter:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;kubectl get nodeclass&lt;br&gt;
NAME      ROLE                                                  READY   AGE&lt;br&gt;
default   awtwins-cluster-eks-auto-20260322210213399200000003   True    55m&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;kubectl get nodepools&lt;br&gt;
NAME              NODECLASS   NODES   READY   AGE&lt;br&gt;
general-purpose   default     0       True    56m&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Auto Mode crea automáticamente el NodeClass y el NodePool correspondiente. &lt;br&gt;
&lt;em&gt;Puedes añadir configuración extra de almacenamiento, restricciones de instancias, límites de capacidad o tags.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;El test de autoscaling&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Para validar que todo funciona usamos el deployment de pause que usa AWS en sus ejemplos oficiales de Karpenter y que ya hemos utilizado anteriormente. No hace nada, solo consume recursos.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;apps/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Deployment&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;inflate&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;replicas&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;
  &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;matchLabels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;inflate&lt;/span&gt;
  &lt;span class="na"&gt;template&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;inflate&lt;/span&gt;
    &lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;containers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;inflate&lt;/span&gt;
          &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;public.ecr.aws/eks-distro/kubernetes/pause:3.7&lt;/span&gt;
          &lt;span class="na"&gt;resources&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;requests&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;cpu&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1"&lt;/span&gt;
              &lt;span class="na"&gt;memory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1Gi"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aplicamos el manifest y vemos que tenemos los pods creandose correctamente:&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%2F6bbt36mmg572pljvr35j.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%2F6bbt36mmg572pljvr35j.png" alt="Pods Creating" width="517" height="103"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vamos a EC2 mediante la consola y podremos ver como Karpenter está creando el nodo necesario para desplegar este tipo de carga.&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%2Fjdw75l3mj0hz00w0ci7h.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%2Fjdw75l3mj0hz00w0ci7h.png" alt="EC2 View" width="800" height="33"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para validar que el desescalado también funciona sin problema procedemos a escalar el deployment a 0 replicas:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;kubectl scale deployment inflate --replicas=0&lt;br&gt;
&lt;/code&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%2Fsm906gc5utp9czhg3aiv.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%2Fsm906gc5utp9czhg3aiv.png" alt="EC2 Deleting" width="800" height="33"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;El resultado habla por sí solo: nodos provisionados en segundos, pods corriendo, y consolidación automática al bajar la carga. Sin tocar nada más.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;En este post solo estamos validando el autoscaling, pero el mismo principio aplica para todo lo que mencionamos antes como load balancing, networking, DNS, almacenamiento, parches de nodos... Todo eso se gestiona por AWS sin que tengas que instalar, configurar ni actualizar nada. Como ya sabéis, somos muy fans de Karpenter, pero la gracia de Auto Mode es que Karpenter es solo una pieza de todo lo que te quitas de encima.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Adjuntamos una imagen descriptiva como comparació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%2F8bhtzfjzodhkdl8q8fcw.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%2F8bhtzfjzodhkdl8q8fcw.png" alt=" " width="645" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Cuánto cuesta?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;El modelo de precios de EKS Auto Mode tiene tres componentes importantes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Precio del cluster igual que en EKS estándar.&lt;/li&gt;
&lt;li&gt;Precio de las EC2 desplegadas.&lt;/li&gt;
&lt;li&gt;Precio de Auto Mode, aprox un 12% extra sobre el coste de cada instancia.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Nuestra opinión&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Como hemos hablado de estos temas en diferentes foros con muchos compañeros, llega el momento más esperado...🥁&lt;/p&gt;

&lt;p&gt;EKS Auto Mode no es solo una feature más. Es un cambio en cómo operar Kubernetes en AWS. Pasamos de gestionar un cluster a consumirlo. Y eso, bien entendido, desgasta menos y minimiza problemas.&lt;/p&gt;

&lt;p&gt;Además, como ya vimos en nuestro anterior post de awtwins, si le sumamos features como ArgoCD Capability la vida nos vuelve a sonreír con un cluster magnífico con mucha menos gestión que antes. Los que ya nos conocéis sabéis que para nosotros este tipo de soluciones siempre son un &lt;strong&gt;SÍ&lt;/strong&gt;... si lo puedes pagar, claro💰😄&lt;/p&gt;

&lt;p&gt;Como siempre, esperamos vuestros comentarios y feedback👇&lt;/p&gt;

</description>
      <category>aws</category>
      <category>awtwins</category>
      <category>eks</category>
      <category>kubernetes</category>
    </item>
    <item>
      <title>Automatiza el despliegue de EKS y Argo CD con Terraform</title>
      <dc:creator>Rubén Rodríguez</dc:creator>
      <pubDate>Sun, 05 Jan 2025 21:25:48 +0000</pubDate>
      <link>https://dev.to/aws-espanol/automatiza-el-despliegue-de-eks-y-argocd-con-terraform-3h93</link>
      <guid>https://dev.to/aws-espanol/automatiza-el-despliegue-de-eks-y-argocd-con-terraform-3h93</guid>
      <description>&lt;p&gt;Sabemos que 2024 ha sido una locura y, seamos sinceros, no hemos tenido todo el tiempo que nos gustaría para dedicarle a esas horas extras para la comunidad 😝. Pero, aprovechando los primeros días de 2025, hemos encontrado el hueco que necesitábamos para seguir dándole caña a esta serie que teníamos en mente.&lt;/p&gt;

&lt;p&gt;En el capítulo anterior, vimos cómo Argo CD nos ayuda a gestionar nuestras aplicaciones en EKS con ese enfoque GitOps que tanto nos gusta. Sin embargo, sabemos que la teoría siempre se queda corta 🥶. Por eso, en este capítulo vamos a desplegar un clúster de EKS con Argo CD utilizando Terraform. Hablaremos de los requisitos, cómo conectar repositorios y cómo validar que todo está funcionando para que puedas empezar a hacer tus propias pruebas.&lt;/p&gt;

&lt;p&gt;En esta ocasión, no vamos a complicarnos con pipelines de despliegue ni nos centraremos demasiado en best practices, gestión de secretos u optimización del código. Lo que buscamos aquí es entender cómo Argo CD puede hacer que nuestros despliegues sean más ágiles y los beneficios que aporta. Pero no os preocupéis, si el tiempo (y la motivación 😅) nos lo permite, ampliaremos el scope de estos posts para cubrir todos esos temas más adelante.&lt;/p&gt;

&lt;p&gt;🛠️Requisitos🛠️&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Terraform - &lt;a href="https://developer.hashicorp.com/terraform/install" rel="noopener noreferrer"&gt;https://developer.hashicorp.com/terraform/install&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub - &lt;a href="https://github.com/" rel="noopener noreferrer"&gt;https://github.com/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Kubectl - &lt;a href="https://kubernetes.io/docs/tasks/tools/" rel="noopener noreferrer"&gt;https://kubernetes.io/docs/tasks/tools/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;CLI de Argo CD - &lt;a href="https://argo-cd.readthedocs.io/en/stable/cli_installation/" rel="noopener noreferrer"&gt;https://argo-cd.readthedocs.io/en/stable/cli_installation/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Como ya hemos comentado, el clúster de EKS con Argo CD lo desplegaremos utilizando Terraform. Para que podáis probarlo por vuestra cuenta, hemos subido el código al siguiente repositorio:&lt;br&gt;
&lt;a href="https://github.com/rnanudevops/eks-argocd-awsespanol" rel="noopener noreferrer"&gt;https://github.com/rnanudevops/eks-argocd-awsespanol&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Este módulo ya lo utilizamos en un post anterior para el despliegue y test de Karpenter (dale un vistazo aquí: &lt;a href="https://dev.to/aws-espanol/optimiza-tu-cluster-eks-con-karpenter-3mk1"&gt;https://dev.to/aws-espanol/optimiza-tu-cluster-eks-con-karpenter-3mk1&lt;/a&gt;). &lt;br&gt;
Esta vez, hemos añadido la configuración necesaria para incluir el despliegue de Argo CD.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Antes de utilizar este código, recomendamos revisar lo siguiente:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;TAGS: Modifica los tags para personalizar el despliegue según tus necesidades.&lt;/li&gt;
&lt;li&gt;Bucket S3: Asegúrate de configurar el bucket donde se almacenará el estado de Terraform.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Este módulo despliega todos los servicios necesarios para el despliegue de un clúster de EKS, incluyendo la configuración de networking.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Una vez desplegado el código de Terraform, veamos cómo acceder tanto al clúster EKS como a Argo CD.&lt;/p&gt;

&lt;p&gt;En nuestro caso, hemos llamado al clúster awtwins-cluster:&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%2F2qrw35bcqlvoh4ownps9.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%2F2qrw35bcqlvoh4ownps9.png" alt="EKS" width="800" height="37"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para acceder al clúster, necesitamos actualizar el contexto de kubectl mediante el siguiente comando:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;aws eks --region eu-west-1 update-kubeconfig --name awtwins-cluster&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Para validar que la conexión se ha establecido correctamente, podemos ejecutar:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;kubectl get pods -A&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Esto nos devolverá:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NAMESPACE     NAME                                                READY   STATUS    RESTARTS   AGE
argocd        argocd-application-controller-0                     1/1     Running   0          6m23s
argocd        argocd-applicationset-controller-5db4d64b99-72k5m   1/1     Running   0          6m23s
argocd        argocd-dex-server-67d695d958-4p4dt                  1/1     Running   0          6m23s
argocd        argocd-notifications-controller-5795d744fd-sxhjz    1/1     Running   0          6m23s
argocd        argocd-redis-5688bd4c9f-hg7zk                       1/1     Running   0          6m23s
argocd        argocd-repo-server-84d9d8fcfb-dsnfj                 1/1     Running   0          6m23s
argocd        argocd-server-d5f5767b6-4ffw8                       1/1     Running   0          6m23s
kube-system   aws-node-kzx4v                                      2/2     Running   0          7m28s
kube-system   aws-node-wwn2g                                      2/2     Running   0          7m23s
kube-system   coredns-844dbb9f6f-52lv9                            1/1     Running   0          9m53s
kube-system   coredns-844dbb9f6f-7khjt                            1/1     Running   0          9m53s
kube-system   kube-proxy-2dm9t                                    1/1     Running   0          7m23s
kube-system   kube-proxy-zn2lv                                    1/1     Running   0          7m28s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El siguiente paso es obtener la dirección de Argo CD, expuesta mediante un LoadBalancer que se incluye en el código de Terraform. Para ello, ejecutamos:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;kubectl -n argocd get svc argocd-server&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NAME            TYPE           CLUSTER-IP       EXTERNAL-IP                                                               PORT(S)                      AGE
argocd-server   LoadBalancer   172.20.193.200   ab577983472254f28a7ae93e22a478af-2061443254.eu-west-1.elb.amazonaws.com   80:30482/TCP,443:30189/TCP   10m
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Copiaremos el valor de EXTERNAL-IP y accederemos a esta dirección desde el navegador.&lt;/p&gt;

&lt;p&gt;Por defecto, Argo CD genera un usuario administrador (admin) y un password inicial. Para obtener este password, ejecuta el siguiente comando:&lt;br&gt;
&lt;code&gt;kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Con estas credenciales (usuario: admin y el password generado), accedemos a Argo CD. &lt;br&gt;
🚨&lt;em&gt;Este usuario nunca debe usarse en entornos productivos y se recomienda deshabilitarlo.&lt;/em&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%2F2wsnwvou8nugkkjrk1nw.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%2F2wsnwvou8nugkkjrk1nw.png" alt="ArgoCD 2" width="800" height="352"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Una vez dentro de Argo CD, el primer paso es configurar el repositorio donde almacenaremos nuestras aplicaciones. Para simplificar el escenario, utilizaremos la CLI de Argo CD. Esto nos permitirá realizar la configuración de forma sencilla y eficiente.&lt;/p&gt;

&lt;p&gt;Primero, conectamos la CLI a Argo CD utilizando el siguiente comando e introduciendo las credenciales:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;argocd login ab577983472254f28a7ae93e22a478af-2061443254.eu-west-1.elb.amazonaws.com --insecure
Username: admin
Password:
'admin:login' logged in successfully
Context 'ab577983472254f28a7ae93e22a478af-2061443254.eu-west-1.elb.amazonaws.com' updated
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;En este ejemplo, utilizaremos GitHub como repositorio, pero puedes usar otros como BitBucket o GitLab. Debes generar un repositorio y un usuario con los permisos necesarios.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Una vez listo, añade el repositorio a Argo CD utilizando:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;argocd repo add &amp;lt;URL repositorio&amp;gt; --username &amp;lt;user&amp;gt; --password &amp;lt;token/password&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Accede a Argo CD y comprueba que el repositorio aparece en la sección Settings &amp;gt; Repositories, confirmando que se ha conectado correctamente. &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%2Fu67u4nogdvorrwxvzagz.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%2Fu67u4nogdvorrwxvzagz.png" alt="Image description" width="800" height="353"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Con esto, ya hemos configurado nuestro entorno de EKS y Argo CD y hemos conectado un repositorio para empezar a gestionar nuestras aplicaciones. 🚀&lt;/p&gt;

&lt;p&gt;En el próximo post, veremos cómo desplegar aplicaciones en Argo CD y qué estrategias y buenas prácticas podemos utilizar para nuestros despliegues.&lt;/p&gt;

&lt;p&gt;💬 Y recuerda, tus comentarios y opiniones son más que bienvenidos. 😝&lt;/p&gt;

</description>
      <category>aws</category>
      <category>awtwins</category>
      <category>eks</category>
      <category>kubernetes</category>
    </item>
    <item>
      <title>Optimiza tu cluster EKS con Karpenter</title>
      <dc:creator>Rubén Rodríguez</dc:creator>
      <pubDate>Wed, 11 Sep 2024 22:42:17 +0000</pubDate>
      <link>https://dev.to/aws-espanol/optimiza-tu-cluster-eks-con-karpenter-3mk1</link>
      <guid>https://dev.to/aws-espanol/optimiza-tu-cluster-eks-con-karpenter-3mk1</guid>
      <description>&lt;p&gt;¡Después de unas merecidas vacaciones, volvemos a la carga!😁&lt;/p&gt;

&lt;p&gt;En nuestra última publicación, hablamos de &lt;strong&gt;Backstage&lt;/strong&gt;, la plataforma open-source de Spotify para gestionar infraestructura en AWS con Terraform.&lt;/p&gt;

&lt;p&gt;Esta vez, vamos a hablar sobre uno de los temas que está siendo ‘trending topic’ en la gestión de escalado de Kubernetes: &lt;strong&gt;Karpenter&lt;/strong&gt;. Durante este mes de Agosto se ha lanzado su primera versión estable y sin duda merecía un post relacionado. 🎉&lt;/p&gt;

&lt;p&gt;Una de las grandes ventajas de Kubernetes es su capacidad de escalar según la demanda. Pero gestionar este escalado de los nodos puede ser complicado. Necesitas asegurarte de que haya suficientes nodos para desplegar tus aplicaciones, pero tampoco quieres pagar por más recursos de los necesarios. Aquí es donde entra &lt;strong&gt;&lt;em&gt;Karpenter&lt;/em&gt;&lt;/strong&gt;.🧙‍♂️&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Karpenter&lt;/strong&gt; ofrece un escalado rápido y flexible, seleccionando automáticamente las instancias más optimizadas y rentables en función de la demanda. Además, es una solución relativamente fácil de implementar... ¡suena difícil de creer, ¿verdad?!😱&lt;/p&gt;

&lt;p&gt;Para desplegar esta solución, hemos utilizado el siguiente repositorio:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/terraform-aws-modules/terraform-aws-eks/blob/master/examples/karpenter/main.tf" rel="noopener noreferrer"&gt;Karpenter Example&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;El código utilizado automatiza el despliegue de un clúster de EKS con 2 nodos m5.large, las VPC necesarias, y los addons coredns, eks-pod-identity-agent, kube-proxy, vpc-cni, además de la solución de Karpenter, incluyendo el NodePool y el EC2NodeClass necesarios para su funcionamiento. Adicionalmente, también despliega un Deployment que utilizaremos para pruebas.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Para su uso, debemos modificar las llamadas a los módulos para que apunten directamente al repositorio correspondiente.&lt;/p&gt;

&lt;p&gt;Para ello copiaremos el fichero main.tf y realizaremos las siguientes modificaciones:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;module "eks" {
  source = "github.com/terraform-aws-modules/terraform-aws-eks"
}

module "karpenter" {
  source = "github.com/terraform-aws-modules/terraform-aws-eks/modules/karpenter"
}

module "vpc" {
  source  = "terraform-aws-modules/vpc/aws"
  version = "~&amp;gt; 5.0"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Una vez que tenemos el Terraform preparado, desplegamos la solución. El proceso tarda unos 15 minutos aproximadamente en estar completo y operativo.&lt;/p&gt;

&lt;p&gt;Como podemos ver, ya tenemos nuestro clúster desplegado y configurado para utilizar Karpenter.&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%2F04gybavb7t7lzs2csh9p.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%2F04gybavb7t7lzs2csh9p.png" alt="cluster EKS" width="800" height="175"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Actualizamos kubeconfig para poder interaccionar con el cluster:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;aws eks --region eu-west-1 update-kubeconfig --name awtwins-cluster
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verificamos que tenemos acceso al clúster y que los pods se han desplegado correctamente, como hemos comentado con anterioridad el propio código de Terraform ya despliega los addons necesarios por lo que deberíamos tener el siguiente escenario:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl get pods -A
NAMESPACE     NAME                           READY   STATUS    RESTARTS   AGE
kube-system   aws-node-8sd7q                 2/2     Running   0          2m7s
kube-system   aws-node-vjj8q                 2/2     Running   0          2m11s
kube-system   coredns-67d68bcfdc-hww5k       1/1     Running   0          6m39s
kube-system   coredns-67d68bcfdc-vv5h6       1/1     Running   0          6m39s
kube-system   eks-pod-identity-agent-5xzdr   1/1     Running   0          2m12s
kube-system   eks-pod-identity-agent-hdg4k   1/1     Running   0          2m12s
kube-system   karpenter-7868758ccf-7npdb     1/1     Running   0          3m56s
kube-system   karpenter-7868758ccf-t564r     1/1     Running   0          3m56s
kube-system   kube-proxy-9tj27               1/1     Running   0          3m2s
kube-system   kube-proxy-ppkr5               1/1     Running   0          3m5s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;También verificamos que se han creado tanto el Nodepool como el Nodeclass y el Deployment de prueba correspondiente&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl get nodepool
NAME      NODECLASS   NODES   READY   AGE
default   default     0       True    6m34s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl get ec2nodeclass
NAME      READY   AGE
default   True    7m4s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl get deployments
NAME      READY   UP-TO-DATE   AVAILABLE   AGE
inflate   0/0     0            0           9m7s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finalmente, habilitaremos nuestra cuenta de AWS para la creación de instancias spot, ejecutando el siguiente comando desde la CLI:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;aws iam create-service-linked-role --aws-service-name spot.amazonaws.com || true&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;¡Llegados a este punto, ya tenemos un clúster completamente operativo! Ahora, podemos jugar con Karpenter.  Antes de empezar, vamos a intentar dar algunas pinceladas sobre sus componentes clave: &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;NodePools&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
Los NodePools permiten configurar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tipo de instancia: Puedes elegir entre tipos como c, m o r (según tus necesidades de cómputo, memoria, etc.).&lt;/li&gt;
&lt;li&gt;Arquitectura: Por ejemplo, amd64.&lt;/li&gt;
&lt;li&gt;Tipo de instancia: Selecciona entre instancias on-demand o spot.&lt;/li&gt;
&lt;li&gt;Sistema operativo: Configura el OS que mejor se adapte a tus aplicaciones.&lt;/li&gt;
&lt;li&gt;Tiempo de vida de los nodos o consolidación de los mismos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Estas configuraciones permiten ajustar los recursos de manera precisa, optimizando el uso de la infraestructura. &lt;br&gt;
&lt;strong&gt;Importante&lt;/strong&gt;: Para que Karpenter funcione, debes tener al menos un NodePool creado.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://karpenter.sh/docs/concepts/nodepools/" rel="noopener noreferrer"&gt;Link NodePools&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;NodeClasses&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
Permiten definir clases específicas de nodos dentro de un clúster de Kubernetes en AWS. Aquí puedes configurar aspectos como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Capacidad de almacenamiento.&lt;/li&gt;
&lt;li&gt;Opciones de red y configuraciones de seguridad.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esto te permite ajustar los nodos a las necesidades de cada aplicación, mejorando tanto el rendimiento como el coste de la infraestructura.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://karpenter.sh/docs/concepts/nodeclasses/" rel="noopener noreferrer"&gt;Link NodeClasses&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Gracias a estas configuraciones, &lt;strong&gt;Karpenter&lt;/strong&gt; puede gestionar los nodos de forma automática, ajustando el tamaño y las características de los nodos en tiempo real según la demanda. Esto asegura que siempre tengas los recursos óptimos para tus aplicaciones sin desperdiciar capacidad.&lt;/p&gt;

&lt;p&gt;Al jugar con las configuraciones de &lt;strong&gt;NodePools&lt;/strong&gt; y &lt;strong&gt;NodeClasses&lt;/strong&gt;, puedes personalizar el comportamiento de &lt;strong&gt;Karpenter&lt;/strong&gt; y adaptarlo a las necesidades específicas de tu clúster. Es fundamental ir probando y ajustando según tu caso de uso para encontrar la máxima eficiencia y reducir costes.&lt;/p&gt;

&lt;p&gt;Dicho esto… 🕹️¡vamos a jugar!🕹️&lt;/p&gt;

&lt;p&gt;Como hemos podido observar anteriormente el código de Terraform utilizado nos ha desplegado automáticamente los siguientes recursos de Karpenter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;NodePool&lt;/li&gt;
&lt;li&gt;NodeClass&lt;/li&gt;
&lt;li&gt;Deployment de pruebas&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Si analizamos los ficheros de configuración observaremos lo siguiente:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;NodePool&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    apiVersion: karpenter.sh/v1beta1
    kind: NodePool
    metadata:
      name: default
    spec:
      template:
        spec:
          nodeClassRef:
            name: default
          requirements:
            - key: "karpenter.k8s.aws/instance-category"
              operator: In
              values: ["c", "m", "r"]
            - key: "karpenter.k8s.aws/instance-cpu"
              operator: In
              values: ["4", "8", "16", "32"]
            - key: "karpenter.k8s.aws/instance-hypervisor"
              operator: In
              values: ["nitro"]
            - key: "karpenter.k8s.aws/instance-generation"
              operator: Gt
              values: ["2"]
      limits:
        cpu: 1000
      disruption:
        consolidationPolicy: WhenEmpty
        consolidateAfter: 30s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;em&gt;EC2NodeClass&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    apiVersion: karpenter.k8s.aws/v1beta1
    kind: EC2NodeClass
    metadata:
      name: default
    spec:
      amiFamily: AL2023
      role: ${module.karpenter.node_iam_role_name}
      subnetSelectorTerms:
        - tags:
            karpenter.sh/discovery: ${module.eks.cluster_name}
      securityGroupSelectorTerms:
        - tags:
            karpenter.sh/discovery: ${module.eks.cluster_name}
      tags:
        karpenter.sh/discovery: ${module.eks.cluster_name}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Karpenter desplegará los nodos con las siguientes caracteristicas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Instancias de las categorías c, m o r (optimizadas para cómputo, uso general y memoria).&lt;/li&gt;
&lt;li&gt;Instancias con 4, 8, 16 o 32 vCPUs.&lt;/li&gt;
&lt;li&gt;Instancias que utilicen el hipervisor Nitro.&lt;/li&gt;
&lt;li&gt;Instancias de generaciones superiores a la segunda.&lt;/li&gt;
&lt;li&gt;El escalado de nodos no superará un total de 1000 vCPUs.&lt;/li&gt;
&lt;li&gt;Las instancias se eliminarán automáticamente cuando no tengan cargas de trabajo durante más de 30 segundos.&lt;/li&gt;
&lt;li&gt;Utilizará una Amazon Machine Image (AMI) de la familia AL2023.&lt;/li&gt;
&lt;li&gt;Se asignará el rol IAM definido por ${module.karpenter.node_iam_role_name}.&lt;/li&gt;
&lt;li&gt;Los nodos se desplegarán en subnets que tengan la etiqueta karpenter.sh/discovery: ${module.eks.cluster_name}.&lt;/li&gt;
&lt;li&gt;Los nodos estarán asociados a grupos de seguridad con la etiqueta karpenter.sh/discovery: ${module.eks.cluster_name}.&lt;/li&gt;
&lt;li&gt;Los nodos estarán etiquetados con karpenter.sh/discovery: ${module.eks.cluster_name} para facilitar su identificación.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para verificar su funcionamiento vamos a escalar el numero de replicas del deployment generado (mediante Terraform) lo que forzará el despliegue de nodos puesto que el clúster requerirá de nuevos nodos para asignar la carga correspondiente.&lt;/p&gt;

&lt;p&gt;Para ello, ejecutamos el siguiente comando:&lt;br&gt;
&lt;code&gt;kubectl scale deployment inflate --replicas=15&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Como podremos observar disponemos de 15 pods en estado "pending"&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NAMESPACE     NAME                           READY   STATUS    RESTARTS   AGE
default       inflate-66fb68585c-4nzbw       0/1     Pending   0          11s
default       inflate-66fb68585c-6hdft       0/1     Pending   0          11s
default       inflate-66fb68585c-7h2vr       0/1     Pending   0          11s
default       inflate-66fb68585c-bh66g       0/1     Pending   0          11s
default       inflate-66fb68585c-c4w9r       0/1     Pending   0          11s
default       inflate-66fb68585c-d2n7s       0/1     Pending   0          11s
default       inflate-66fb68585c-hpzdw       0/1     Pending   0          11s
default       inflate-66fb68585c-ljqgf       0/1     Pending   0          11s
default       inflate-66fb68585c-lkp4t       0/1     Pending   0          11s
default       inflate-66fb68585c-nbfcd       0/1     Pending   0          11s
default       inflate-66fb68585c-pkwvb       0/1     Pending   0          11s
default       inflate-66fb68585c-qx27z       0/1     Pending   0          11s
default       inflate-66fb68585c-sxzs9       0/1     Pending   0          11s
default       inflate-66fb68585c-tqwkd       0/1     Pending   0          11s
default       inflate-66fb68585c-vw4dw       0/1     Pending   0          11s
kube-system   aws-node-jb5sb                 2/2     Running   0          11m
kube-system   aws-node-wfj2q                 2/2     Running   0          11m
kube-system   coredns-67d68bcfdc-m5dg2       1/1     Running   0          15m
kube-system   coredns-67d68bcfdc-tqj44       1/1     Running   0          15m
kube-system   eks-pod-identity-agent-7hsb7   1/1     Running   0          11m
kube-system   eks-pod-identity-agent-vzkls   1/1     Running   0          11m
kube-system   karpenter-7ffd65448-nmld6      1/1     Running   0          13m
kube-system   karpenter-7ffd65448-t94wh      1/1     Running   0          13m
kube-system   kube-proxy-twfgp               1/1     Running   0          12m
kube-system   kube-proxy-vpk6s               1/1     Running   0          12m
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En este punto &lt;strong&gt;Karpenter&lt;/strong&gt; estará desplegando nuevos nodos con los requisitos facilitados en los ficheros de configuración para poder cumplir con las cargas necesarias, accedemos a la consola y podemos ver que ya disponemos de una nueva instancia:&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%2Fn3bvutykf4s03ag1jk58.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%2Fn3bvutykf4s03ag1jk58.png" alt="EC2 Running" width="566" height="108"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Si vemos el estado de los pods veremos como han sido desplegados y asignados correctamente y la instancia desplegada cumple con los requisitos facilitados en los ficheros de configuración.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NAMESPACE     NAME                           READY   STATUS    RESTARTS   AGE
default       inflate-66fb68585c-4nzbw       1/1     Running   0          4m55s
default       inflate-66fb68585c-6hdft       1/1     Running   0          4m55s
default       inflate-66fb68585c-7h2vr       1/1     Running   0          4m55s
default       inflate-66fb68585c-bh66g       1/1     Running   0          4m55s
default       inflate-66fb68585c-c4w9r       1/1     Running   0          4m55s
default       inflate-66fb68585c-d2n7s       1/1     Running   0          4m55s
default       inflate-66fb68585c-hpzdw       1/1     Running   0          4m55s
default       inflate-66fb68585c-ljqgf       1/1     Running   0          4m55s
default       inflate-66fb68585c-lkp4t       1/1     Running   0          4m55s
default       inflate-66fb68585c-nbfcd       1/1     Running   0          4m55s
default       inflate-66fb68585c-pkwvb       1/1     Running   0          4m55s
default       inflate-66fb68585c-qx27z       1/1     Running   0          4m55s
default       inflate-66fb68585c-sxzs9       1/1     Running   0          4m55s
default       inflate-66fb68585c-tqwkd       1/1     Running   0          4m55s
default       inflate-66fb68585c-vw4dw       1/1     Running   0          4m55s
kube-system   aws-node-gdx8l                 2/2     Running   0          4m28s
kube-system   aws-node-jb5sb                 2/2     Running   0          16m
kube-system   aws-node-wfj2q                 2/2     Running   0          16m
kube-system   coredns-67d68bcfdc-m5dg2       1/1     Running   0          20m
kube-system   coredns-67d68bcfdc-tqj44       1/1     Running   0          20m
kube-system   eks-pod-identity-agent-7hsb7   1/1     Running   0          16m
kube-system   eks-pod-identity-agent-vzkls   1/1     Running   0          16m
kube-system   eks-pod-identity-agent-w9tcq   1/1     Running   0          4m27s
kube-system   karpenter-7ffd65448-nmld6      1/1     Running   0          18m
kube-system   karpenter-7ffd65448-t94wh      1/1     Running   0          18m
kube-system   kube-proxy-r65c2               1/1     Running   0          4m28s
kube-system   kube-proxy-twfgp               1/1     Running   0          17m
kube-system   kube-proxy-vpk6s               1/1     Running   0          17m
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si procedemos a eliminar las replicas desplegadas podremos ver que los nodos se eliminan bajo las condiciones facilitadas.&lt;/p&gt;

&lt;p&gt;Para ello ejecutamos el siguiente comando:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;kubectl scale deployment inflate --replicas=0&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Esperamos 30 segundos y podremos ver como el nodo se elimina sin problemas.&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%2F2nx557dcrwao2oot2lak.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%2F2nx557dcrwao2oot2lak.png" alt="EC2 Shutdown" width="565" height="105"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Una vez visto el funcionamiento, podemos empezar a "jugar" con los archivos de configuración según las necesidades específicas de nuestro clúster. Al ajustar los parámetros de los &lt;strong&gt;NodePools&lt;/strong&gt; y &lt;strong&gt;NodeClasses&lt;/strong&gt;, es posible controlar aspectos clave como el tipo de instancias, la cantidad de CPU o memoria, el tiempo de vida de los nodos, o el uso de instancias spot para reducir costes.&lt;/p&gt;

&lt;p&gt;En nuestra opinión, &lt;strong&gt;Karpenter&lt;/strong&gt; es una de esas soluciones que no pueden faltar en tus proyectos si buscas optimizar la gestión de tus clústeres en Kubernetes. Su capacidad para automatizar el escalado y aprovisionamiento de nodos hace que la complejidad operativa y la sobrecarga manual no sean uno de nuestros problemas.&lt;/p&gt;

&lt;p&gt;🚨&lt;strong&gt;&lt;em&gt;Recomendación&lt;/em&gt;&lt;/strong&gt;🚨&lt;br&gt;
Antes de implementar Karpenter en tu clúster de Kubernetes, se recomienda configurar algunos elementos que optimizan el funcionamiento y aseguran una eficiente gestión de recursos como pueden ser:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Optimización de la infraestructura&lt;/strong&gt;: Se recomienda configurar PodDisruptionBudgets (&lt;strong&gt;PDB&lt;/strong&gt;) para garantizar la disponibilidad de las aplicaciones durante mantenimientos o interrupciones.&lt;br&gt;
&lt;strong&gt;Alta disponibilidad&lt;/strong&gt;: Tener al menos 2 réplicas por aplicación asegura redundancia en caso de fallos de nodos.&lt;br&gt;
&lt;strong&gt;Escalado automático&lt;/strong&gt;: Implementar el Vertical Pod Autoscaler (&lt;strong&gt;VPA&lt;/strong&gt;) para ajustar recursos automáticamente y el Horizontal Pod Autoscaler (&lt;strong&gt;HPA&lt;/strong&gt;) para gestionar el número de réplicas según las métricas.&lt;br&gt;
&lt;strong&gt;Visualización del clúster&lt;/strong&gt;: Herramientas como &lt;strong&gt;Kubernetes Dashboard&lt;/strong&gt;, &lt;strong&gt;KubeOpsView&lt;/strong&gt; y otras facilitan la administración y ofrecen una visión mas "amigable" del clúster.&lt;/p&gt;

&lt;p&gt;👀&lt;strong&gt;&lt;em&gt;Enlaces interesantes&lt;/em&gt;&lt;/strong&gt;👀&lt;/p&gt;

&lt;p&gt;&lt;a href="https://karpenter.sh/" rel="noopener noreferrer"&gt;Documentación Oficial de Karpenter&lt;/a&gt;&lt;br&gt;
&lt;a href="https://community.aws/content/2dhlDEUfwElQ9mhtOP6D8YJbULA/run-kubernetes-clusters-for-less-with-amazon-ec2-spot-and-karpenter" rel="noopener noreferrer"&gt;Post Community AWS - Christian Melendez (AWS)&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=3QsVRHVdOnM&amp;amp;t=54s" rel="noopener noreferrer"&gt;Video Explicativo Karpenter&lt;/a&gt;&lt;br&gt;
&lt;a href="https://catalog.workshops.aws/karpenter/en-US" rel="noopener noreferrer"&gt;Workshop Karpenter (AWS)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;¡Y hasta aquí llegamos por hoy! Como siempre, estamos deseando leer tus comentarios y preguntas. Nos ayudan a mejorar y seguir creando contenido interesante.&lt;/p&gt;

&lt;p&gt;¡Nos vemos en el próximo post! 👌&lt;/p&gt;

</description>
      <category>awtwins</category>
      <category>aws</category>
      <category>community</category>
      <category>kubernetes</category>
    </item>
    <item>
      <title>Administra las credenciales de aplicación con [EKS Pod Identity]</title>
      <dc:creator>Rubén Rodríguez</dc:creator>
      <pubDate>Thu, 18 Jan 2024 23:34:16 +0000</pubDate>
      <link>https://dev.to/aws-espanol/administra-las-credenciales-de-aplicacion-con-eks-pod-identity-1oae</link>
      <guid>https://dev.to/aws-espanol/administra-las-credenciales-de-aplicacion-con-eks-pod-identity-1oae</guid>
      <description>&lt;p&gt;¿Quién iba a decir que llegaríamos al cuarto post?🥳¡Increíble!🥳Pero, aquí entre nosotros, hemos decidido hacer un pacto con la pausa y bajarle un poco al estrés. A partir de ahora, intentaremos publicar de forma mensual para que nadie termine en la locura, nosotros incluidos!🕵️&lt;br&gt;
En nuestro último post, exploramos cómo desplegar sin miedo con un ejemplo sobre App Runner. Sin embargo, en estos últimos meses, ha surgido un susurro constante en nuestras conversaciones técnicas:&lt;/p&gt;

&lt;p&gt;🚨&lt;strong&gt;EKS Pod Identities&lt;/strong&gt;🚨&lt;br&gt;
Esta nueva funcionalidad se presenta como una herramienta que simplifica la configuración de permisos de IAM para aplicaciones Kubernetes en AWS. Como era de esperar, nos sumergiremos para comprender cómo funciona y compartiremos algunas novedades adicionales que se han publicado en referencia al servicio de EKS.&lt;br&gt;
¡Así que, vamos a por ello! 🚀💻&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Requisitos&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clúster EKS&lt;/li&gt;
&lt;li&gt;El rol de nodo debe tener permisos para que el agente realice la acción de AssumeRoleForPodIdentity en la API de autenticación de EKS&lt;/li&gt;
&lt;li&gt;Bucket S3&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://docs.aws.amazon.com/es_es/eks/latest/userguide/pod-id-agent-setup.html" rel="noopener noreferrer"&gt;https://docs.aws.amazon.com/es_es/eks/latest/userguide/pod-id-agent-setup.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para este ejemplo, crearemos un rol de IAM con permisos de lectura sobre S3 y configuraremos todo lo necesario para que un pod de prueba pueda asumir este rol y realizar una lista (list) en un bucket de S3. En este caso, hemos creado un bucket con el nombre &lt;em&gt;"test-pod-demo"&lt;/em&gt;.&lt;br&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%2Fvhdqvftrh00q0s0c1pl9.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%2Fvhdqvftrh00q0s0c1pl9.PNG" alt="0" width="800" height="195"&gt;&lt;/a&gt;&lt;br&gt;
Accedemos a nuestro clúster y añadimos el complemento "Amazon EKS Pod Identity Agent".&lt;br&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%2F71u9l99ar8j2gcz3yg4b.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%2F71u9l99ar8j2gcz3yg4b.PNG" alt="1" width="800" height="407"&gt;&lt;/a&gt;&lt;br&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%2Fzykc6k3r9ezei886q80m.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%2Fzykc6k3r9ezei886q80m.PNG" alt="2" width="800" height="350"&gt;&lt;/a&gt;&lt;br&gt;
Una vez añadimos el complemento al clúster, los pods asociados a este se desplegarán. Deberemos verificar que se han desplegado correctamente revisando su estado.&lt;br&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%2Fjrpyuikj940cqbd4m3mx.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%2Fjrpyuikj940cqbd4m3mx.PNG" alt="3" width="800" height="43"&gt;&lt;/a&gt;&lt;br&gt;
Creamos el rol de IAM &lt;em&gt;“iam-pod-identities-demo”&lt;/em&gt; con los permisos necesarios.&lt;br&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%2Fdmog79hq7hruae7k5w3j.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%2Fdmog79hq7hruae7k5w3j.PNG" alt="4" width="609" height="746"&gt;&lt;/a&gt;&lt;br&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%2Fonp1lc8ixvhdmhae9vns.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%2Fonp1lc8ixvhdmhae9vns.png" alt="5" width="567" height="348"&gt;&lt;/a&gt;&lt;br&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%2Fzifpuxzickphoxyumxi6.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%2Fzifpuxzickphoxyumxi6.png" alt="6" width="567" height="860"&gt;&lt;/a&gt;&lt;br&gt;
Una vez creado el rol de IAM, regresamos al clúster y configuramos la asociación de la identidad del pod.&lt;br&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%2Fed5heu87gswgjz4dvyc9.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%2Fed5heu87gswgjz4dvyc9.PNG" alt="7" width="246" height="521"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;IAM role: Rol creado previamente&lt;/li&gt;
&lt;li&gt;Namespace: Namespace donde vamos a desplegar el pod (puede estar creado previamente o crearlo más tarde)&lt;/li&gt;
&lt;li&gt;ServiceAccount: ServiceAccount que vamos a asociar (puede estar creada o no)
En este caso, hemos utilizado la siguiente configuración:
&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%2F2ecqmgrao1090s9gxhpn.PNG" alt="8" width="800" height="589"&gt;
Si accedemos nuevamente al clúster, podemos observar que la asociación ya ha sido generada.
&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%2Fuquekkr7gkcdropvxmxp.PNG" alt="9" width="304" height="493"&gt;
&lt;em&gt;En caso de no contar con el namespace y la service account, procedemos a crearlos. Podemos realizar esta acción a través de comandos (kubectl) o mediante la definición de un archivo YAML.&lt;/em&gt;
&lt;em&gt;kubectl create namespace test-demo&lt;/em&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%2Frlmrlttugimfpm9215a3.png" alt="10" width="181" height="83"&gt;
&lt;em&gt;kubectl create serviceaccount sa-test-demo -n test-demo&lt;/em&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%2Fn3augdikquoesp7n9p4g.png" alt="11" width="244" height="114"&gt;
Creamos un pod de prueba que desplegaremos en el namespace creado previamente y le asociaremos la service account. En este caso, para realizar las pruebas correspondientes, utilizaremos la imagen de aws-cli y le añadiremos un comando de "sleep infinity" para que el pod no se detenga y podamos acceder sin problemas.
&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%2F9ve70ac6noze0wlugoj7.png" alt="12" width="289" height="229"&gt;
Verificamos que el pod se ha iniciado correctamente.
&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%2Fc1tfmabq6odjzlria555.jpg" alt="13" width="314" height="36"&gt;
Accedemos al pod para realizar las validaciones necesarias.
&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%2F81ue87y9hqkkus0r479z.png" alt="14" width="353" height="25"&gt;
Ejecutamos el comando de la CLI de AWS aws s3 ls para listar el contenido del bucket.
&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%2Fdp11k0aspga7ul010tlp.jpg" alt="15" width="298" height="82"&gt;
¡Y con un toque de magia! El pod ha logrado listar el contenido del bucket sin ningún inconveniente.🎉&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🧙‍♂️&lt;strong&gt;Ventajas de las identidades de Pod de EKS&lt;/strong&gt;🧙‍♂️&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Privilegio mínimo: puede limitar los permisos de IAM a una cuenta de servicio y solo los Pods que utilizan esa cuenta de servicio tienen acceso a esos permisos.&lt;/li&gt;
&lt;li&gt;Aislamiento de credenciales: los contenedores de un Pod's solo pueden recuperar las credenciales para el rol de IAM asociado a la cuenta de servicio que usa el contenedor. Un contenedor nunca tiene acceso a credenciales que utilizan otros contenedores de otros Pods. &lt;/li&gt;
&lt;li&gt;Auditabilidad: el acceso y el registro de eventos está disponible a través de AWS CloudTrail para facilitar una auditoría retrospectiva.&lt;/li&gt;
&lt;li&gt;No utiliza proveedores de identidad OIDC (menos gestión y más facilidad).&lt;/li&gt;
&lt;li&gt;Reutilización: la Pod Identity de EKS utiliza una única entidad principal de IAM en lugar de los principios independientes para cada clúster que utilizan los roles de IAM para las cuentas de servicio.&lt;/li&gt;
&lt;li&gt;Escalabilidad: cada conjunto de credenciales temporales lo asume el servicio de EKS Auth en Pod Identity de EKS, en lugar de cada SDK de AWS que se ejecuta en cada pod. A continuación, el agente de Pod Identity de Amazon EKS que se ejecuta en cada nodo emite las credenciales de los SDK.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;😱&lt;strong&gt;Restricciones de Pod Identity&lt;/strong&gt;😱&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No se admiten los pods de Linux y Windows que se ejecutan en AWS Fargate (Fargate). No se admiten pods que se ejecutan en instancias Windows Amazon EC2.&lt;/li&gt;
&lt;li&gt;No se admiten complementos de Amazon EKS que necesitan credenciales de IAM.&lt;/li&gt;
&lt;li&gt;No se admiten los clústeres Kubernetes que se crean y ejecutan en Amazon EC2.
No se admiten las regiones de AWS GovCloud(EE. UU.), la región China(Beijing, operada por Sinnet) y China(Ningxia, operada por NWCD)&lt;/li&gt;
&lt;li&gt;Disponible para las versiones enumeradas en &lt;a href="https://docs.aws.amazon.com/es_es/eks/latest/userguide/pod-identities.html#pod-id-cluster-versions" rel="noopener noreferrer"&gt;https://docs.aws.amazon.com/es_es/eks/latest/userguide/pod-identities.html#pod-id-cluster-versions&lt;/a&gt;
¡Pero espera, hay más! En estos últimos meses, han surgido novedades emocionantes sobre el servicio de EKS. ¡No podíamos dejarlas pasar! 🚀&lt;/li&gt;
&lt;li&gt;28/12/2023 - Amazon EKS ahora admite la asignación de grupos de seguridad de EC2 a pods de Kubernetes IPv6&lt;/li&gt;
&lt;li&gt;28/12/2023 - Amazon EKS ahora muestra los detalles del estado del clúster&lt;/li&gt;
&lt;li&gt;20/12/2023 - Amazon EKS presenta la información sobre actualizaciones
¡Pero eso no es todo! Puedes echarle un vistazo a &lt;a href="https://aws.amazon.com/es/new/?whats-new-content-all.sort-by=item.additionalFields.postDateTime&amp;amp;whats-new-content-all.sort-order=desc&amp;amp;awsf.whats-new-categories=*all" rel="noopener noreferrer"&gt;https://aws.amazon.com/es/new/?whats-new-content-all.sort-by=item.additionalFields.postDateTime&amp;amp;whats-new-content-all.sort-order=desc&amp;amp;awsf.whats-new-categories=*all&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;¡Esperamos vuestras reacciones y comentarios!&lt;/p&gt;

</description>
      <category>eks</category>
      <category>kubernetes</category>
      <category>security</category>
      <category>awtwins</category>
    </item>
    <item>
      <title>EC2: Parches automáticos para liberar tu agenda</title>
      <dc:creator>Rubén Rodríguez</dc:creator>
      <pubDate>Thu, 04 Jan 2024 00:51:11 +0000</pubDate>
      <link>https://dev.to/aws-espanol/ec2-parches-automaticos-para-liberar-tu-agenda-1doa</link>
      <guid>https://dev.to/aws-espanol/ec2-parches-automaticos-para-liberar-tu-agenda-1doa</guid>
      <description>&lt;p&gt;"¡Hola de nuevo! En el primer post, exploramos el SSO en AWS para despedirnos de esos engorrosos roles de salto que nos han dado más de un dolor de cabeza. En esta segunda parte, nos adentraremos en otro de los problemas comunes que hemos enfrentado a lo largo de nuestra trayectoria. ¿Cómo abordamos el tema de parchear las EC2 que aún necesitamos mantener? ¡Ups! ¿Pero no estamos todos trabajando con containers y serverless? 😜 ¿Cómo resolver este problema sin dedicar ese tiempo del que nunca parece haber suficiente? En este caso, vamos a hablar de nuestro querido aliado..."&lt;br&gt;
&lt;strong&gt;System Manager&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Operativa común:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Conexión manual a las EC2.&lt;/li&gt;
&lt;li&gt;Descarga y revisión de los parches disponibles.&lt;/li&gt;
&lt;li&gt;Creación de una copia de seguridad para una posible recuperación en caso de error.&lt;/li&gt;
&lt;li&gt;Instalación de los parches seleccionados.&lt;/li&gt;
&lt;li&gt;Reinicio de la instancia.&lt;/li&gt;
&lt;li&gt;Verificación del correcto funcionamiento.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sin duda, un proceso tedioso y "aburrido" con el que nadie quiere lidiar. Para hacerlo más sencillo, AWS nos ofrece un servicio llamado &lt;strong&gt;Patch Manager&lt;/strong&gt;, una herramienta que facilita la administración y automatización de actualizaciones de software y parches tanto en instancias EC2 como en entornos locales. Sin embargo, aún así, vamos a presentar una alternativa (estrechamente relacionada) que nos permite gestionar estas actualizaciones de forma más personalizada.&lt;br&gt;
&lt;strong&gt;Documents personalizados de System Manager&lt;/strong&gt;👌&lt;br&gt;
En esta ocasión, vamos a crear un documento que ejecute los siguientes pasos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Envío de correo para notificar el inicio del proceso de parcheo.&lt;/li&gt;
&lt;li&gt;Actualización del agente de SSM.&lt;/li&gt;
&lt;li&gt;Creación de una AMI (backup) para facilitar la recuperación en caso de error.&lt;/li&gt;
&lt;li&gt;Aplicación de los parches al sistema.&lt;/li&gt;
&lt;li&gt;Envío de correo para notificar la finalización del proceso de parcheo.&lt;/li&gt;
&lt;li&gt;Gestión de errores: si se produce algún error en cualquiera de los pasos, el proceso de parcheo se detendrá y se enviará una notificación correspondiente.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👩‍🏭¡Vamos a ello!👨‍🏭&lt;/p&gt;
&lt;h2&gt;
  
  
  Requisitos
&lt;/h2&gt;

&lt;p&gt;Instancias con System Manager&lt;br&gt;
&lt;a href="https://docs.aws.amazon.com/systems-manager/latest/userguide/what-is-systems-manager.html" rel="noopener noreferrer"&gt;https://docs.aws.amazon.com/systems-manager/latest/userguide/what-is-systems-manager.html&lt;/a&gt;&lt;br&gt;
Bucket S3 para almacenar logs, en nuestro caso hemos generado el logs-patch-demo&lt;br&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%2F3yxhny72jbkbc83n1amu.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%2F3yxhny72jbkbc83n1amu.png" alt="1" width="800" height="289"&gt;&lt;/a&gt;&lt;br&gt;
Rol de IAM con los permisos necesarios para ejecutar todas las acciones requeridas. En este ejemplo, y debido a que se trata de una POC (Prueba de Concepto), se han otorgado permisos completos ("full access") sobre los siguientes servicios:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AmazonEC2FullAccess&lt;/li&gt;
&lt;li&gt;AmazonSNSFullAccess&lt;/li&gt;
&lt;li&gt;AmazonSSMFullAccess
&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%2Fdq8kr9lkd2xntm6gcvjb.png" alt="2" width="800" height="408"&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%2Fvka96p188fdocsk8z3g1.png" alt="3" width="670" height="311"&gt;
&lt;em&gt;Recuerda que siempre debemos aplicar los permisos mínimos necesarios, y que el ejemplo proporcionado nunca debe ser utilizado en entornos de producción&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Utilizaremos Amazon SNS para enviar correos electrónicos indicando el inicio, final y cualquier error que pueda surgir. Esto se realizará a través de una suscripción, que especificará el destinatario que recibirá los correos informativos.&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%2Fo3w0l9md3p43mngbntwb.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%2Fo3w0l9md3p43mngbntwb.PNG" alt="4" width="800" height="348"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Resource group al cual aplicaremos el documento. En nuestro caso, será aplicado a todas las instancias EC2 que tengan la etiqueta 'Patch:yes'.&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%2Fxycftvfj0shjv0r4z6mp.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%2Fxycftvfj0shjv0r4z6mp.png" alt="5" width="800" height="371"&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%2Fax988dfse1lnejxc8sk2.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%2Fax988dfse1lnejxc8sk2.png" alt="6" width="800" height="204"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;En este caso, solo hemos desplegado una instancia, pero podríamos incluir todas las que sean necesarias.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Y por supuesto...💎la joya de la corona💎, el documento personalizado de AWS System Manager:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;description: Parcheo automatizado
schemaVersion: '0.3'
assumeRole: '{{Rol}}'
parameters:
  TopicArn:
    type: String
    description: (Required) ARN del SNS para enviar eventos.
  Instance:
    type: String
    description: (Required) ID de Instancia EC2.
  Rol:
    type: String
    description: (Required) Rol de IAM con permisos.
  BucketName:
    type: String
    description: (Required) Nombre del bucket donde almacenaremos los logs.
mainSteps:
  - name: Iniciopatch
    action: aws:executeAwsApi
    nextStep: ActualizacionAgenteSSM
    isEnd: false
    onFailure: Abort
    inputs:
      Service: sns
      Api: Publish
      TopicArn: '{{TopicArn}}'
      Message: Empezamos el parcheo de {{Instance}}
  - name: ActualizacionAgenteSSM
    action: aws:runCommand
    maxAttempts: 1
    timeoutSeconds: 3600
    nextStep: CreacionAMI
    isEnd: false
    onFailure: step:Errorpatch
    inputs:
      DocumentName: AWS-UpdateSSMAgent
      InstanceIds:
        - '{{Instance}}'
  - name: CreacionAMI
    action: aws:createImage
    maxAttempts: 3
    nextStep: ParcheoInstancia
    isEnd: false
    onFailure: step:Errorpatch
    inputs:
      InstanceId: '{{Instance}}'
      ImageName: AMI generada el {{global:DATE_TIME}} sobre {{Instance}}
      NoReboot: true
      ImageDescription: AMI generada por parcheo en {{global:DATE_TIME}} para {{Instance}}
  - name: ParcheoInstancia
    action: aws:runCommand
    maxAttempts: 1
    timeoutSeconds: 5400
    nextStep: Finalpatch
    isEnd: false
    onFailure: step:Errorpatch
    inputs:
      DocumentName: AWS-RunPatchBaseline
      InstanceIds:
        - '{{Instance}}'
      OutputS3BucketName: '{{BucketName}}'
      Parameters:
        Operation: Install
        RebootOption: RebootIfNeeded
  - name: Finalpatch
    action: aws:executeAwsApi
    isEnd: true
    onFailure: step:Errorpatch
    inputs:
      Service: sns
      Api: Publish
      TopicArn: '{{TopicArn}}'
      Message: Finalizamos el parcheo de {{ Instance }}
  - name: Errorpatch
    action: aws:executeAwsApi
    isEnd: true
    inputs:
      Service: sns
      Api: Publish
      TopicArn: '{{TopicArn}}'
      Message: El parcheo no ha finalizado correctamente, revisar el estado
outputs:
  - CreacionAMI.ImageId

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

&lt;/div&gt;



&lt;p&gt;Mientras preparamos el post, hemos notado que actualmente existe la opción de visualizar de manera gráfica las acciones que llevaremos a cabo mediante el documento. Esta función ciertamente resulta de gran ayuda para comprender mejor las operaciones que realizaremos.&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%2Fglzs6dkwgg9mf0batyyi.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%2Fglzs6dkwgg9mf0batyyi.png" alt="7" width="758" height="684"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como mencionamos anteriormente, el documento está configurado para enviar un correo indicando el inicio del proceso de parcheo, actualizar el agente de System Manager, crear una AMI de la EC2, aplicar los parches a la instancia y enviar un correo notificando la finalización del proceso de parcheo. Todo esto se realizará de manera automatizada, sin necesidad de supervisión. ¡Fantástico! 👌&lt;br&gt;
Ahora, podrías estar pensando, "¡perfecto! Pero, ¿cómo ejecuto este documento para no tener que estar pendiente de cuándo debo parchear los sistemas?" Para abordar esta inquietud, vamos a profundizar en "&lt;strong&gt;Maintenance Windows&lt;/strong&gt;", un servicio que permite programar y gestionar centralizadamente las tareas de mantenimiento y actualizaciones en los recursos de AWS.&lt;br&gt;
Para comenzar, crearemos una nueva ventana de mantenimiento:&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%2Fiatjtwj5fl6zwm31plqu.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%2Fiatjtwj5fl6zwm31plqu.png" alt="8" width="800" height="557"&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%2Fq28y63usaysc7h6s6i1h.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%2Fq28y63usaysc7h6s6i1h.png" alt="9" width="722" height="809"&gt;&lt;/a&gt;&lt;br&gt;
🚨&lt;em&gt;Para ejecutar la ventana de mantenimiento en el grupo de instancias al que queremos aplicarlo, es necesario registrar dicho grupo dentro de la ventana.&lt;/em&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%2Fwyz0zfrpxjok3moixy9p.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%2Fwyz0zfrpxjok3moixy9p.png" alt="10" width="568" height="738"&gt;&lt;/a&gt;&lt;br&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%2F0qnjzp2kq52hbu6sygnr.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%2F0qnjzp2kq52hbu6sygnr.png" alt="11" width="800" height="211"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Seleccionamos la sección "Task" y creamos una nueva tarea que haga referencia a nuestro documento.&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%2Fcvgt81821lhhw5tq1xfo.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%2Fcvgt81821lhhw5tq1xfo.png" alt="12" width="565" height="440"&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%2F5viyzql65t7l0u7hjmz4.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%2F5viyzql65t7l0u7hjmz4.png" alt="13" width="565" height="424"&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%2Fyzs2tcav0f3z0ih4a82m.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%2Fyzs2tcav0f3z0ih4a82m.png" alt="14" width="562" height="312"&gt;&lt;/a&gt;&lt;br&gt;
Habiendo alcanzado este punto, es el momento de proporcionar las variables que mencionamos al principio como requisitos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;TopicArn: Arn del SNS generado.&lt;/li&gt;
&lt;li&gt;Rol: Rol de IAM con los permisos necesarios.&lt;/li&gt;
&lt;li&gt;BucketName: Nombre del bucket donde se almacenarán los logs.&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%2Fyogznb26c3s6yibppv5z.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%2Fyogznb26c3s6yibppv5z.png" alt="15" width="562" height="455"&gt;&lt;/a&gt;&lt;br&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%2Fjikteneer0dqyxl7kfsj.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%2Fjikteneer0dqyxl7kfsj.png" alt="16" width="562" height="348"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;En este caso, el rol no es necesario proporcionarlo en esta última opción, ya que se asume dentro del propio documento.&lt;/em&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  ¡Ha llegado el momento más esperado... es hora de probarlo!
&lt;/h2&gt;

&lt;p&gt;Para garantizar la ejecución de la tarea, hemos modificado el cron de la ventana de mantenimiento para que se ejecute a una hora específica: 23:12 PM (¡Sí, así somos! ¡Con una Coca-Cola en la mano y listos para compartir! 🎉)&lt;br&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%2F1qrtc12wq0qvjtk2rxoi.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%2F1qrtc12wq0qvjtk2rxoi.png" alt="17" width="163" height="57"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Podemos seguir el progreso de la tarea en la pestaña "History" de la propia ventana.&lt;br&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%2Fidnfr3c2pm005pw06227.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%2Fidnfr3c2pm005pw06227.png" alt="18" width="677" height="167"&gt;&lt;/a&gt;&lt;br&gt;
Para ver la ejecución paso a paso, podemos seleccionar "View details", lo cual nos mostrará el proceso de parcheo en detalle, paso por paso.&lt;br&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%2Ff95bszgnmverocaxrx7k.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%2Ff95bszgnmverocaxrx7k.png" alt="19" width="800" height="383"&gt;&lt;/a&gt;&lt;br&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%2F7vy5524oodrkuf2uiddg.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%2F7vy5524oodrkuf2uiddg.png" alt="20" width="800" height="363"&gt;&lt;/a&gt;&lt;br&gt;
En cada paso, es posible obtener los resultados y visualizar los logs correspondientes. En el caso de la actualización del agente de System Manager, el resultado es el siguiente.&lt;br&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%2Fn14k0wbfq37zffn0crb5.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%2Fn14k0wbfq37zffn0crb5.png" alt="21" width="800" height="184"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Una vez ejecutado y completado sin errores (en caso de recibir errores, se recibiría un correo indicando el error y se podrían ver los detalles en esta sección de manera detallada), procedemos a validar que tenemos registros en S3 y que la imagen se ha generado sin problemas.&lt;br&gt;
&lt;strong&gt;S3&lt;/strong&gt;&lt;br&gt;
Al llevar a cabo el parcheo de la instancia, AWS genera una estructura de carpetas dentro de S3 donde se almacenan tanto los registros de resultado como los de error:&lt;br&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%2Fmfcwfo7lf8rg93jyx2cv.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%2Fmfcwfo7lf8rg93jyx2cv.png" alt="22" width="800" height="238"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;En este caso, las horas de los logs no coinciden debido a que se ejecutó en múltiples ocasiones durante la creación del documento. Verificamos que las imágenes se han generado correctamente durante las ejecuciones.&lt;/em&gt;&lt;br&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%2F0o1op376sh5z9lox5g66.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%2F0o1op376sh5z9lox5g66.png" alt="23" width="800" height="184"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;SNS&lt;/strong&gt;&lt;br&gt;
En el caso de las notificaciones por correo electrónico, se ha seleccionado una cuenta de Gmail como destino para la POC.&lt;br&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%2F9zury318fy54q9z54i5e.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%2F9zury318fy54q9z54i5e.png" alt="24" width="368" height="248"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Antes de finalizar el post, nos gustaría proporcionar algunos ejemplos donde este tipo de solución puede aplicarse:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Parar y arrancar instancias o RDS de forma automatizada.&lt;/li&gt;
&lt;li&gt;Parchear sistemas con aplicaciones que requieran detención o inicio controlado.&lt;/li&gt;
&lt;li&gt;Actualizar paquetes personalizados o realizar customizaciones en instancias.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Información adicional&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;En este caso, hemos utilizado una cuenta única para la POC. Sin embargo, es importante destacar que estos documentos pueden ser compartidos entre cuentas, lo que permite realizar la ejecución de manera centralizada. ¡Mola! ¿no? 👀&lt;/p&gt;

&lt;p&gt;Además, es relevante tener en cuenta que el documento ofrece una amplia gama de variables. Por ejemplo, podemos elegir reiniciar la instancia al finalizar el parcheo (tal como se ha ejemplificado), pero también podríamos incluir acciones como el apagado de servicios antes del parcheo, la ejecución de scripts, y muchas otras opciones.&lt;/p&gt;

&lt;p&gt;¡Sin duda, esta es una solución muy personalizable que estamos seguros será de gran utilidad en diversas situaciones, simplificando las operaciones y liberando tiempo para seguir aprendiendo y enfrentando nuevos retos!&lt;/p&gt;

&lt;p&gt;¿Te has preguntado si este flujo automatizado podría convertirse en una infraestructura como código con Terraform? ¡La respuesta es sí!¿Le damos caña?💯&lt;/p&gt;

&lt;p&gt;¡Y eso es todo por hoy! Esperamos que hayas disfrutado de este post sobre automatización. ¿Te ha parecido interesante? ¡Nos encantaría conocer tu opinión! Déjanos tus comentarios, reacciones o preguntas. ¡Estamos ansiosos por saber qué piensas! 🙏&lt;/p&gt;

</description>
      <category>ec2</category>
      <category>automation</category>
      <category>security</category>
      <category>awtwins</category>
    </item>
  </channel>
</rss>
