Blog de Amazon Web Services (AWS)

Etiquetado automatizado de recursos de AWS mediante AWS Config, Amazon EventBridge y AWS Lambda

Por Ricardo Marques, Senior Solution Architect, DNB – LATAM

 

En esta entrada de blog, Ud. aprenderá a crear una solución para identificar los recursos de AWS creados en su cuenta sin etiquetas obligatorias e incluirlas automáticamente.

Una de las formas más eficaces de controlar los costos o identificar a los propietarios de los recursos creados en las cuentas de AWS es utilizar etiquetas. Una buena práctica consiste en definir etiquetas que identifiquen los departamentos, los centros de costos o las unidades de negocio e insertarlas en los recursos de AWS en el momento de su creación. Sin embargo, los equipos de desarrollo a menudo terminan creando recursos sin estas etiquetas, lo que aumenta la dificultad para administrar los recursos creados.

 

Hay algunas formas de evitar la creación de algunos recursos sin etiquetas específicas usando Tag Policies o Service Control Policies (SCP), ambas en el servicio de AWS Organizations. Sin embargo, algunos tipos de recursos aún no están cubiertos por los servicios anteriores y requieren otras formas de controlar la existencia de las etiquetas.

 

Arquitectura de la solución

La creación automática de etiquetas obligatorias en los recursos de AWS se realiza siguiendo el siguiente flujo. Este flujo incluye reglas creadas en AWS Config y Amazon EventBridge, una función de AWS Lambda y una API para el servicio de AWS Resource Groups.

Siguiendo los pasos de flujo de esta publicación, Ud. creará una regla en AWS Config para detectar los recursos creados sin una o más etiquetas específicas, una regla en Amazon EventBridge que se ejecutará cuando se detecte un recurso sin etiquetar, una función AWS Lambda para obtener el ARN del recurso y ejecutar la API del servicio de Resource Groups que insertará la etiqueta en el recurso.

La solución permite etiquetar los tipos de recursos que existen en este enlace:

https://docs.aws.amazon.com/resourcegroupstagging/latest/APIReference/supported-services.html

 

Figura 1: Diseño de la solución

Pasos del flujo de ejecución

  1. Un usuario crea una instancia de Amazon EC2 sin la etiqueta deseada.
  2. AWS Config detecta la creación del recurso sin la etiqueta deseada y lo clasifica como no compatible.
  3. Se activa una regla de Amazon EventBridge que ejecuta una función Lambda.
  4. La función obtiene el ARN del recurso de AWS Config y ejecuta la API del servicio de Resource Groups pasando el ARN y la etiqueta que se van a crear.
  5. AWS Lambda executa a API do serviço Resource Groups passando o ARN e a Tag a ser criada.

Configuración de la solución

Siga los pasos que se indican a continuación para configurar la solución para incluir etiquetas en los recursos no compatibles de forma automática.

PASO 1 Cree una regla en AWS Config

Cree una nueva regla en AWS Config para identificar los recursos creados sin la etiqueta deseada y clasificarlos como no compatibles. Para crear la regla, acceda al servicio y, en el menú de la izquierda, haga clic en Reglas y, a continuación, en el botón Agregar regla.

Se le dirigirá a la pantalla Especificar tipo de regla. Utilice los siguientes ajustes:

  • En Seleccionar tipo de regla, elija Añadir una regla administrada por AWS.
  • En Reglas administradas por AWS, elija las required-tags.
  • Haz clic en Siguiente.

 

Figura 2: Pantalla de especificación del tipo de regla

 

En la pantalla Configurar regla, utilice los siguientes ajustes:

En la sección Detalles:

  • En el campo Nombre, introduzca required-tags
  • En el campo Descripción, introduzca una descripción.

En la sección Desencadenador:

  • En Ámbito de los cambios, elija Todos los cambios.

En la sección Parámetros:

  • Para el campo Clave, escriba Tag1key para la primera etiqueta y Tag1Value para el valor de la primera etiqueta.
  • Para el campo Value, defina CostCenter como el valor de la clave Tag1key y déjelo en blanco para la clave Tag1Value.
  • Haz clic en

Si desea incluir más etiquetas, haga clic en el botón Agregar otra fila.

Figura 3: Pantalla de configuración de reglas en Config

 

En la pantalla Revisar y crear, haga clic en el botón Agregar regla.

Una vez creada la regla, AWS Config realizará la evaluación de los recursos y mostrará si son compatibles o no. Esta comprobación puede tardar unos minutos en realizarse.

A continuación, podemos ver el resultado de la verificación y la lista de recursos identificados sin la etiqueta CostCenter.

 

Figura 4 — Pantalla de reglas de etiquetas obligatorias

 

PASO 3 Cree una función AWS Lambda

Para insertar las etiquetas en los recursos de AWS que se clasificaron como no compatibles, crearemos una función Lambda que se ejecutará mediante una regla en Amazon EventBridge. Esta función Lambda recibirá el ID y el tipo del recurso de AWS, buscará en AWS Config para obtener el ARN del recurso y, finalmente, insertará la etiqueta mediante la API de servicio de Resource Groups.

Para crear, inicie sesión en el servicio AWS Lambda, haga clic en el botón Crear una función y utilice la siguiente configuración:

  • Dejé seleccionada la opción Crear desde cero.
  • En el campo Nombre de la función, introduzca el nombre lambda-put-tag.
  • En el campo Tiempo de ejecución, selecciona Python 3.9.
  • En Arquitectura, selecciona arm64.
  • Deje todos los demás campos sin cambios y haga clic en Crear una función.

Tras la creación, aparecerá la pantalla con la configuración de la función Lambda, en la pestaña de código, sustituya el código de la ventana lambda_function por el código de abajo y haga clic en el botón Deploy.

 

JSON
import json
import boto3

client = boto3.client('resourcegroupstaggingapi')
conf = boto3.client('config')

def lambda_handler(event, context):
  successesResources = []
  FailedResources = []

  typeComplient = event["typeComplient"]
  if typeComplient == "NON_COMPLIANT":
    resourcesArn = getARN(event["resourceType"],event["resourceId"])
    tags = event["requiredTags"]
    
    for arn in resourcesArn:
        try:
          numberARN = json.loads(arn)
          response = client.tag_resources(ResourceARNList = [numberARN["arn"]], Tags = tags)
          successesResources.append(arn)
  
        except Exception as e:
          errorMsg = str(e)
          FailedResources.append({'ResourceArn': arn , "error": errorMsg})
  
  out = {
      "SuccessesResources": successesResources,
      "FailedResources": FailedResources
  }
  return out


def getARN(resourceType, resourceID):
  try:
    query = "SELECT arn WHERE resourceId='" +  resourceID + "' AND resourceType='" + resourceType + "'"
    resp = conf.select_resource_config(Expression=query)['Results']
    return resp
  except Exception as e:
    errorMsg = str(e)
    FailedResources.append({'ResourceArn': arn , "error": errorMsg})
Code
 
JSON

Haga clic en la pestaña Configuración, en el menú de la izquierda, haga clic en Configuración general y haga clic en el botón Editar. Use los siguientes ajustes:

  • En el campo Memoria, cambie el valor a 512.
  • En el campo Tiempo de espera, cambie el valor a 1 minuto y 0
  • Haz clic en Guardar.

Ahora incluiremos los permisos necesarios para que la función AWS Lambda acceda a los servicios necesarios para incluir las etiquetas.

Aún en la pestaña Configuración, haga clic en Permisos en el menú de la izquierda, en la sección Rol  de ejecución, haga clic en el nombre del rol.

Se abrirá la pantalla con la configuración de la función IAM con las políticas de permisos de ejecución de la función AWS Lambda. En esta función de IAM ya habrá una política con permiso para crear registros; añada las políticas que aparecen a continuación a esa función de IAM. Para obtener información sobre cómo incluir políticas en una función de IAM, siga este enlace: https://docs.aws.amazon.com/pt_br/IAM/latest/UserGuide/access_policies_manage-edit.html

Incluya las políticas siguiendo los pasos que se indican a continuación:

  • En la pestaña Permisos, haga clic en el botón Agregar permisos y, a continuación, en Crear política en línea.

Figura 5: Pantalla de funciones de IAM

 

  • En la pantalla Crear política, haga clic en la pestaña JSON y pegue la definición de las políticas que aparecen a continuación en la ventana.
  • Haz clic en Revisar política.
  • Introduzca un nombre para la política y haga clic en el botón Crear política.
  • Criar política.

Figura 6: Pantalla de creación de políticas

 

Siga los pasos anteriores para introducir cada una de las políticas que aparecen a continuación.

  • Política para permitir la búsqueda de ARN en AWS Config:
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "config:SelectResourceConfig",
            "Resource": "*"
        }
    ]
}

Code
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "tag:getResources",
                "tag:getTagKeys",
                "tag:getTagValues",
                "tag:TagResources",
                "tag:UntagResources" 
            ],
            "Resource": "*"
        }
    ]
}
Code
  • En esta entrada de blog solo incluiremos los permisos para insertar etiquetas en Amazon EC2. Para otros recursos de AWS, añada los permisos necesarios según el tipo de recurso.
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeTags",
                "ec2:CreateTags"
            ],
            "Resource": "*"
        }
    ]
}
Code

 

PASO 3 Crear una regla en Amazon EventBridge

Cree una regla en Amazon EventBridge para que se active cuando un recurso de AWS se clasifique como no compatible y ejecute una función de AWS Lambda para insertar posteriormente la etiqueta en ese recurso. Para crear la regla, inicie sesión en el servicio Amazon EventBridge, haga clic en Reglas y, a continuación, haga clic en el botón Crear regla.

En la pantalla Definir detalles de la regla, utilice los siguientes ajustes:

  • Para el campo Nombre, introduzca el valor Enter-tag.
  • Para el campo Descripción, introduzca una descripción.
  • Para Bus de eventos, deje el valor default.
  • En los demás campos, deje los valores ya seleccionados y haga clic en Siguiente.

 

Figura 7 — Pantalla de definición de detalles de la regla

 

Para la pantalla Crear patrón de eventos, usa los siguientes ajustes:

En la sección Origen del evento, deje seleccionada la primera opción.

En la sección Evento de ejemplo: opcional, no cambie ningún campo.

En la sección Patrón de eventos, usa los siguientes ajustes:

  • Para el campo Origen del evento, seleccione Servicios de AWS.
  • Para el campo Servicios de AWS, seleccione Config.
  • Para el campo Tipo de evento, seleccione Config Rules Compliance Change.
  • Seleccione cualquier tipo de mensaje.
  • Seleccione Nombres de reglas específicos.
  • Introduzca el nombre de la regla creada en AWS Config.
  • Deje todos los demás campos sin cambios y haga clic en Siguiente.

Figura 8 — Pantalla de creación de patrones de eventos

 

En la pantalla Seleccionar destinos, utilice los siguientes ajustes:

En la sección Destino 1, usa los siguientes ajustes:

  • En el campo Tipos de destino, seleccione Servicio de AWS.
  • En el campo Seleccione un destino, seleccione Función Lambda.
  • En Función, seleccione el nombre de la AWS Lambda creada en el paso 2.
  • Amplíe el campo Configuración adicional.
  • En Configurar la entrada de destino, selecciona Transformador de entrada.
  • Haga clic en el botón Configurar transformador de entrada.

Se abrirá una ventana en la que realizará un cambio en el payload que se enviará a la función AWS Lambda.  Para ello, utilice los siguientes ajustes:

Desplázate hacia abajo hasta la sección Transformaciones de entrada de destino.

  • En la ventana Ruta de entrada, introduzca el fragmento:

 

{
  "resourceID": "$.detail.newEvaluationResult.evaluationResultIdentifier.evaluationResultQualifier.resourceId",
  "resourceType": "$.detail.newEvaluationResult.evaluationResultIdentifier.evaluationResultQualifier.resourceType",
  "typeComplient": "$.detail.newEvaluationResult.complianceType"
}
JSON
  • En la ventana Plantilla, introduzca lo siguiente:
{
  "resourceType": "<resourceType>",
  "resourceId": "<resourceID>",
  "typeComplient": "<typeComplient>",
  "requiredTags": {"CostCenter": "45678"}
}
JSON

 

  • Pulse Confirmar.
  • Deje el resto de los campos sin cambios y haga clic en Siguiente dos veces y, a continuación, en Crear regla.
  • Próximo duas vezes e depois em Criar regra.

 

Figura 9: Pantalla de selección de destinos

Probando la solución

Una vez que haya completado la configuración anterior, ya podemos realizar una prueba. Como en el paso 3 incluimos el permiso solo para incluir etiquetas en Amazon EC2, nuestra prueba consistirá en crear una instancia sin ninguna etiqueta y esperar a que la etiqueta se inserte automáticamente.

Recuerde que para que la solución pueda insertar etiquetas en otros tipos de recursos, es necesario incluir políticas de IAM con permisos para los servicios deseados en la función IAM de AWS Lambda.

A continuación, podemos ver la etiqueta CostCenter, con el valor 45678, que nuestra solución inserta automáticamente después de crear la instancia.

 

Figura 10: Pantalla de detalles de la instancia Amazon EC2

 

Conclusión

En esta entrada de blog vimos cómo implementar una solución automatizada para detectar e insertar etiquetas en los recursos que se crean sin etiquetas obligatorias de una manera sencilla. Esta solución le permite insertar etiquetas en diferentes tipos de recursos, lo que permite un mayor control sobre los costos y el uso de los servicios en AWS.

 

Este artículo fue traducido del Blog de AWS en Portugués


Acerca del autor

Ricardo Marques es arquitecto de soluciones sénior en AWS y cuenta con más de 15 años de experiencia en desarrollo de software, arquitecturas de soluciones escalables, aplicaciones nativas de la nube, microservicios, sistemas sin servidor y seguridad.  Trabaja apoyando a los clientes nativos digitales y ayudándolos en su viaje a la nube.

 

https://www.linkedin.com/in/ricardo-marques-45846425