Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

Etiqueta automáticamente instancias y volúmenes EC2 de AWS

By Avi KeinanMar 17, 20214 min read

Esta página también está disponible en English, Deutsch, Français, Italiano, 日本語 y Português.

Asigna el gasto de AWS etiquetando automáticamente tus workloads de EC2.

Instancias "John Doe"

Al revisar el uso de AWS EC2, es probable que encuentres instancias o volúmenes sin nombre o, peor aún, con un nombre poco claro. Estos recursos pueden ser dinero tirado a la basura o, por el contrario, piezas críticas de workloads en producción.

Instancia m3.2xlarge "DO NOT DELETE" en us-east-1 que cuesta $388 al mes

Las instancias pueden tener varios años de antigüedad, sin que nadie en la organización conozca su propósito ni cuente con las credenciales para conectarse a ellas.

Para evitar este problema, las empresas aplican políticas de etiquetado: cada instancia que se aprovisiona debe llevar una etiqueta de Name/Owner/Project/etc.

Etiquetar instancias y volúmenes EC2 no tiene costo adicional…

…sin embargo, como las instancias se lanzan tanto a mano como mediante scripts de automatización, el proceso es propenso a errores.

Para evitar estos casos, escribí una solución para AWS (y otra similar para Google Cloud) que etiqueta automáticamente las instancias con la etiqueta Owner, y los volúmenes con las etiquetas Owner y AttachedInstance.

Así, en el futuro, si alguien se topa con una instancia o un volumen de propósito desconocido, estas etiquetas facilitarán identificar quién lo configuró.

**¿Cómo funciona el etiquetado automático?**

  1. El usuario crea una instancia EC2 de AWS.
  2. AWS CloudTrail registra las llamadas a la API y se las pasa a AWS EventBridge.
  3. AWS EventBridge dispara la función Lambda.
  4. AWS Lambda etiqueta la instancia y sus volúmenes.

Cuando la función de AWS Lambda se dispara con la información del lanzamiento, etiqueta la instancia con la etiqueta Owner, cuyo valor será uno de los siguientes:

  1. IAM User
  2. Assume Role (por ejemplo, AutoScaling Role, SSO user, etc.).
  3. Root User

Página de instancias, etiqueta al final

En la siguiente etapa, Lambda etiqueta todos los volúmenes de la instancia con las etiquetas 'Owner' y 'AttachedInstance'. La etiqueta 'Owner' tiene la misma información que la 'Owner' de la instancia, y la 'AttachedInstance' incluye el instance-id y el nombre de la instancia, si lo tiene.

Página de volúmenes, etiquetas al final

Cómo implementarlo:

  1. Entra a la página de CloudTrail y haz clic en "Create trail".

2. Asígnale un nombre al trail.

3. Baja en la página y define un nombre para el bucket S3 de CloudTrail. Luego haz clic en Create.

4. Ve al dashboard de Lambda y haz clic en "Create function".

5. Asígnale un nombre a la función, selecciona "Python 3.8" en el desplegable Runtime y haz clic en "Create Function".

6. Pega el código del repositorio de Github y haz clic en "Save".

7. Baja hasta el cuadro "Basic settings" y haz clic en el botón Edit.

Sube el timeout de la función Lambda a 1 minuto.

Después, haz clic en el botón Save.

8. Vuelve a subir y haz clic en Permissions. Luego haz clic en el nombre del Role.

9. Haz clic en el botón "Add inline policy".

10. Haz clic en el botón JSON, pega la siguiente política IAM y haz clic en Review policy.

{
    "Version": "2012-10-17",
    "Statement": [\
        {\
            "Sid": "VisualEditor0",\
            "Effect": "Allow",\
            "Action": "ec2:CreateTags",\
            "Resource": [\
                "arn:aws:ec2:*:*:instance/*",\
                "arn:aws:ec2:*:*:volume/*"\
            ]\
        },\
        {\
            "Sid": "VisualEditor1",\
            "Effect": "Allow",\
            "Action": [\
                "ec2:DescribeInstances",\
                "ec2:DescribeVolumes"\
            ],\
            "Resource": "*"\
        }\
    ]
}

Con esta política, la función Lambda podrá descubrir los volúmenes de la instancia y etiquetar tanto la instancia como sus volúmenes.

11. Asígnale un nombre a la política y haz clic en Create policy.

12. Vuelve a la pestaña de Lambda en el navegador y haz clic en "Add trigger".

13. Haz clic en "Select a trigger", busca EventBridge y luego haz clic en "Create a new rule" en el desplegable Rule.

Asígnale un nombre y una descripción a la regla.

En "Rule type", marca el radio button Event pattern.

En el primer desplegable elige EC2, y en el segundo selecciona AWS API call via CloudTrail.

14. Baja en la página, marca la casilla Operation y, en Operation, escribe RunInstances. Luego haz clic en el botón Add para crear el disparador del evento.

15. Por último, despliega una nueva instancia de prueba para confirmar que todo funciona.

En cuestión de segundos, la función Lambda que acabamos de implementar etiquetará automáticamente la instancia y sus volúmenes.

Refresca la página y revisa las etiquetas de la instancia.

Notas:

  1. Esta solución solo etiqueta las instancias que se creen después de instalar la función Lambda.
  2. Si acabas de activar el trail de CloudTrail, puede pasar hasta una hora antes de que EventBridge empiece a invocar la función.
  3. El tamaño de la respuesta de CloudTrail está limitado a 500 Kb. Si lanzas muchas instancias con una sola llamada a la API, la función Lambda no podrá etiquetarlas todas.
  4. AWS EventBridge es un recurso regional. Si operas en varias regiones, tendrás que desplegar la solución en cada región de AWS.