Supervisar el uso de una imagen de máquina de Amazon compartida en varias cuentas de AWS - Recomendaciones de AWS

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Supervisar el uso de una imagen de máquina de Amazon compartida en varias cuentas de AWS

Creado por Naveen Suthar (AWS) y Sandeep Gawande (AWS)

Repositorio de código: -terraform-samples cross-account-ami-auditing

Entorno: PoC o piloto

Tecnologías: administración y gobierno; sin servidor; operaciones DevOps

Servicios de AWS: Amazon DynamoDB; AWS Lambda; Amazon EventBridge

Resumen

Las Imágenes de máquina de Amazon (AMI) se utilizan para crear instancias de Amazon Elastic Compute Cloud (Amazon EC2) en su entorno de Amazon Web Services (AWS). Puede crear AMI en una cuenta de AWS independiente y centralizada, que en este patrón se denomina cuenta de creador. A continuación, puede compartir la AMI entre varias cuentas de AWS que estén en la misma región de AWS, que se denominan cuentas de consumidor en este patrón. La administración de las AMI desde una sola cuenta proporciona escalabilidad y simplifica la gobernanza. En las cuentas de consumidor, puede hacer referencia a la AMI compartida en las plantillas de lanzamiento de Amazon EC2 Auto Scaling y en los grupos de nodos de Amazon Elastic Kubernetes Service (Amazon EKS).

Cuando una AMI compartida queda obsoleta, se anula su registro o se deja de compartir, los servicios de AWS que hacen referencia a la AMI en las cuentas de consumidor no pueden usar esta AMI para lanzar nuevas instancias. Se produce un error en cualquier evento de escalado automático o en el relanzamiento de la misma instancia. Esto puede provocar problemas en el entorno de producción, como el tiempo de inactividad de las aplicaciones o la degradación del rendimiento. Cuando se producen eventos de uso compartido y de uso de la AMI en varias cuentas de AWS, puede ser difícil supervisar esta actividad.

Este patrón ayuda a supervisar el uso y el estado de la AMI compartida en cuentas de la misma región. Utiliza servicios de AWS sin servidor, como Amazon EventBridge, Amazon DynamoDB, AWS Lambda y Amazon Simple Email Service (Amazon SES). La infraestructura se aprovisiona como código (IaC) mediante Terraform. HashiCorp Esta solución proporciona alertas cuando un servicio de una cuenta de consumidor hace referencia a una AMI que ya no está registrada o compartida.

Requisitos previos y limitaciones

Requisitos previos 

  • Dos o más cuentas de AWS activas: una cuenta de creador y una o más cuentas de consumidor

  • Una o más AMI que se comparten desde la cuenta de creador a una cuenta de consumidor

  • Terraform CLI, instalada (documentación de Terraform)

  • Terraform AWS Provider, configurado (documentación de Terraform)

  • (Opcional, pero recomendado) Backend de Terraform, configurado (documentación de Terraform)

  • Git, instalado

Limitaciones

  • Este patrón supervisa las AMI que se han compartido con cuentas específicas mediante el ID de la cuenta. Este patrón no supervisa las AMI que se han compartido con una organización mediante el ID de la organización.

  • Las AMI solo se pueden compartir con cuentas que se encuentren dentro de la misma región de AWS. Este patrón supervisa las AMI dentro de una única región de destino. Para supervisar el uso de las AMI en varias regiones, implemente esta solución en cada región.

  • Este patrón no supervisa ninguna AMI que se compartiera antes de implementar esta solución. Si desea supervisar las AMI compartidas anteriormente, puede dejar de compartir la AMI y, a continuación, volver a compartirla con las cuentas de consumidor.

Versiones de producto

  • Versión de Terraform 1.2.0 o posterior

  • Versión de Terraform AWS Provider 4.20 o posterior

Arquitectura

Pila de tecnología de destino

Los recursos siguientes se aprovisionan como IaC a través de Terraform:

  • Tablas de Amazon DynamoDB

  • EventBridge Reglas de Amazon

  • Rol de AWS Identity and Access Management (IAM)

  • Funciones de AWS Lambda

  • Amazon SES

Arquitectura de destino

Arquitectura para supervisar el uso de la AMI compartida y alertar a los usuarios si la AMI no se comparte o su registro se cancela

En el diagrama, se muestra el siguiente flujo de trabajo:

  1. La AMI de la cuenta de creador se comparte con una cuenta de consumidor de la misma región de AWS.

  2. Cuando se comparte la AMI, una EventBridge regla de Amazon en la cuenta del creador captura el ModifyImageAttribute evento e inicia una función Lambda en la cuenta del creador.

  3. La función de Lambda almacena los datos relacionados con la AMI en una tabla de DynamoDB de la cuenta de creador.

  4. Cuando un servicio de AWS de la cuenta del consumidor utiliza la AMI compartida para lanzar una instancia de Amazon EC2 o cuando la AMI compartida está asociada a una plantilla de lanzamiento, una EventBridge regla de la cuenta del consumidor captura el uso de la AMI compartida.

  5. La EventBridge regla inicia una función Lambda en la cuenta del consumidor. La función de Lambda lleva a cabo lo siguiente:

    1. La función de Lambda actualiza los datos relacionados con la AMI en una tabla de DynamoDB de la cuenta de consumidor.

    2. La función de Lambda asume un rol de IAM en la cuenta de creador y actualiza la tabla de DynamoDB de la cuenta de creador. En la tabla Mapping, crea un elemento que asigna el ID de instancia o el ID de plantilla de lanzamiento a su ID de AMI correspondiente.

  6. La AMI que se administra de forma centralizada en la cuenta de creador está obsoleta, se ha anulado su registro o ha dejado de compartirse.

  7. La EventBridge regla de la cuenta del creador captura el DeregisterImage evento ModifyImageAttribute o con la remove acción e inicia la función Lambda.

  8. La función de Lambda comprueba la tabla de DynamoDB para determinar si la AMI se utiliza en alguna de las cuentas de consumidor. Si en la tabla Mapping no hay ningún ID de instancia o ID de plantilla de lanzamiento asociado a la AMI, el proceso se ha completado.

  9. Si hay algún ID de instancia o ID de plantilla de lanzamiento asociado a la AMI en la tabla Mapping, la función de Lambda utiliza Amazon SES para enviar una notificación por correo electrónico a los suscriptores configurados.

Herramientas

Servicios de AWS

  • Amazon DynamoDB es un servicio de base de datos de NoSQL completamente administrado que ofrece un rendimiento rápido, predecible y escalable.

  • Amazon EventBridge es un servicio de bus de eventos sin servidor que le ayuda a conectar sus aplicaciones con datos en tiempo real de diversas fuentes. Por ejemplo, las funciones de Lambda de AWS, los puntos de conexión de invocación HTTP que utilizan destinos de API o los buses de eventos de otras cuentas de AWS.

  • AWS Identity and Access Management (IAM) le permite administrar de forma segura el acceso a los recursos de AWS mediante el control de quién está autenticado y autorizado a utilizarlos.

  • AWS Lambda es un servicio de computación que ayuda a ejecutar código sin necesidad de aprovisionar ni administrar servidores. Ejecuta el código solo cuando es necesario y amplía la capacidad de manera automática, por lo que solo pagará por el tiempo de procesamiento que utilice.

  • Amazon Simple Email Service (Amazon SES) facilita poder enviar y recibir correos electrónicos a través de los dominios y direcciones de correo electrónico propios.

Otras herramientas

  • HashiCorp Terraform es una herramienta de código abierto de infraestructura como código (IaC) que le ayuda a usar el código para aprovisionar y administrar la infraestructura y los recursos de la nube.

  • Python es un lenguaje de programación informático de uso general.

Repositorio de código

El código de este patrón está disponible en el repositorio -terraform-samples. GitHub cross-account-ami-monitoring

Prácticas recomendadas

Epics

TareaDescripciónHabilidades requeridas

Cree los perfiles con nombre de AWS CLI.

Para la cuenta de creador y para cada cuenta de consumidor, cree un perfil con nombre de Interfaz de la línea de comandos de AWS (AWS CLI). Si necesita instrucciones, consulte Configuración de AWS CLI en el Centro de recursos de introducción a AWS.

DevOps ingeniero

Clonar el repositorio.

Escriba el siguiente comando. Esto clona el repositorio cross-account-ami-monitoring-terraform-samples mediante SSH. GitHub

git clone git@github.com:aws-samples/cross-account-ami-monitoring-terraform-samples.git
DevOps ingeniero

Actualice el archivo provider.tf.

  1. Ingrese el comando siguiente para acceder a la carpeta terraform del repositorio clonado.

    cd cross-account-ami-monitoring/terraform
  2. Abra el archivo provider.tf.

  3. Actualice las configuraciones de Terraform AWS Provider para la cuenta de creador y la cuenta de consumidor de la manera siguiente:

    • En alias, especifique un nombre para la configuración del proveedor.

    • En region, especifique la región de AWS de destino en la que desea implementar esta solución.

    • En profile, especifique el nombre de perfil de AWS CLI para acceder a la cuenta.

  4. Si va a configurar más de una cuenta de consumidor, cree un perfil para cada cuenta de consumidor adicional.

  5. Guarde y cierre el archivo provider.tf.

Para más información sobre la configuración de proveedores, consulte Configuraciones de varios proveedores en la documentación de Terraform.

DevOps ingeniero

Actualice el archivo terraform.tfvars.

  1. Abra el archivo terraform.tfvars.

  2. En el parámetro account_email_mapping, configure las alertas para la cuenta de creador y la cuenta de consumidor de la manera siguiente:

    • En account, especifique el ID de la cuenta.

    • En email, especifique la dirección de email a la que desea enviar alertas. Solo puede especificar una dirección de correo electrónico para cada cuenta.

  3. Si va a configurar más de una cuenta de consumidor, especifique una cuenta y una dirección de correo electrónico para cada cuenta de consumidor adicional.

  4. Guarde y cierre el archivo terraform.tfvars.

DevOps ingeniero

Actualice el archivo main.tf.

Siga estos pasos solo si va a implementar esta solución en más de una cuenta de consumidor. Si va a implementar esta solución en una sola cuenta de consumidor, no es necesario modificar este archivo.

  1. Abra el archivo main.tf.

  2. Para cada cuenta de consumidor adicional, cree un módulo nuevo que se base en el módulo consumer_account_A de la plantilla. Para cada cuenta de consumidor, el valor de provider debe coincidir con el alias que especificó en el archivo provider.tf.

  3. Guarde y cierre el archivo main.tf.

DevOps ingeniero
TareaDescripciónHabilidades requeridas

Implemente la solución.

En la CLI de Terraform, ingrese los comandos siguientes para implementar los recursos de AWS en las cuentas de creador y de consumidor:

  1. Ingrese el comando siguiente para inicializar Terraform.

    terraform init
  2. Ingrese el comando siguiente para validar las configuraciones de Terraform.

    terraform validate
  3. Ingrese el comando siguiente para crear un plan de ejecución de Terraform.

    terraform plan
  4. Revise los cambios de configuración en el plan de Terraform y confirme que desea implementarlos.

  5. Ingrese el comando siguiente para implementar los recursos.

    terraform apply
DevOps ingeniero

Verificar la identidad de la dirección de correo electrónico.

Al implementar el plan Terraform, Terraform crea una identidad de dirección de correo electrónico para cada cuenta de consumidor en Amazon SES. Para poder enviar notificaciones a esa dirección de correo electrónico, es necesario verificarla. Para las instrucciones, consulte Verificación de la identidad de una dirección de correo electrónico en la documentación de Amazon SES.

AWS general
TareaDescripciónHabilidades requeridas

Valide la implementación en la cuenta de creador.

  1. Inicie sesión en la cuenta de creador.

  2. En la barra de navegación, confirme que ve la región de destino. Si se encuentra en una región diferente, seleccione el nombre de región que se muestra y la región de destino.

  3. Abra la consola de DynamoDB en https://console.aws.amazon.com/dynamodb/.

  4. En el panel de navegación, elija Tablas.

  5. En la lista de tablas, compruebe que la tabla AmiShare esté presente.

  6. Abra la consola de Lambda en https://console.aws.amazon.com/lambda.

  7. Seleccione Funciones en el panel de navegación.

  8. En la lista de funciones, compruebe que la función ami-share esté presente.

  9. Abra la consola de IAM en https://console.aws.amazon.com/iamv2/.

  10. Seleccione Roles en el panel de navegación.

  11. En la lista de roles, compruebe que el rol external-ddb-role esté presente.

  12. Abra la EventBridge consola en https://console.aws.amazon.com/events/.

  13. En el panel de navegación, seleccione Reglas.

  14. En la lista de reglas, compruebe que la regla modify_image_attribute_event esté presente.

  15. Abra la consola de Amazon SES en https:/console.aws.amazon.com/ses/.

  16. En el panel de navegación, seleccione Verified identities (Identidades verificadas).

  17. En la lista de identidades, compruebe que se haya registrado y verificado la identidad de una dirección de correo electrónico para cada cuenta de consumidor.

DevOps ingeniero

Valide la implementación en la cuenta de consumidor.

  1. Inicie sesión en la cuenta de consumidor.

  2. En la barra de navegación, confirme que ve la región de destino. Si se encuentra en una región diferente, seleccione el nombre de región que se muestra y la región de destino.

  3. Abra la consola de DynamoDB en https://console.aws.amazon.com/dynamodb/.

  4. En el panel de navegación, elija Tablas.

  5. En la lista de tablas, compruebe que la tabla Mapping esté presente.

  6. Abra la consola de Lambda en https://console.aws.amazon.com/lambda.

  7. Seleccione Funciones en el panel de navegación.

  8. En la lista de funciones, compruebe que las funciones ami-usage-function y ami-deregister-function estén presentes.

  9. Abra la EventBridge consola en https://console.aws.amazon.com/events/.

  10. En el panel de navegación, seleccione Reglas.

  11. En la lista de reglas, compruebe que las reglas ami_usage_events y ami_deregister_events estén presentes.

DevOps ingeniero
TareaDescripciónHabilidades requeridas

Cree una AMI en la cuenta de creador.

  1. Cree una AMI privada en la cuenta de creador. Para obtener instrucciones, consulte Crear una AMI a partir de una instancia de Amazon EC2.

  2. Comparta la nueva AMI con una de las cuentas de consumidor. Para obtener instrucciones, consulte Compartir una AMI con cuentas de AWS específicas.

DevOps ingeniero

Use la AMI en la cuenta de consumidor.

En la cuenta de consumidor, utilice la AMI compartida para crear una instancia de EC2 o una plantilla de lanzamiento. Para obtener instrucciones, consulte Cómo puedo lanzar una instancia de EC2 desde una AMI personalizada (AWS Re:post Knowledge Center) o Cómo crear una plantilla de lanzamiento (documentación de Amazon EC2 Auto Scaling).

DevOps ingeniero

Valide la supervisión y las alertas.

  1. Inicie sesión en la cuenta de creador.

  2. Abra la consola de Amazon EC2 en https://console.aws.amazon.com/ec2/.

  3. En el panel de navegación, seleccione AMIs.

  4. Seleccione la AMI en la lista y, a continuación, Actions (Acciones), Edit AMI permissions (Editar permisos de la AMI).

  5. En la sección Shared accounts (Cuentas compartidas), seleccione la cuenta de consumidor y, a continuación, Remove selected (Eliminar lo seleccionado).

  6. Seleccione Save changes (Guardar cambios).

  7. Valide que la dirección de correo electrónico de destino que definió para la cuenta de consumidor reciba una notificación de cancelación del uso compartido de la AMI.

DevOps ingeniero
TareaDescripciónHabilidades requeridas

Elimine los recursos.

  1. Ingrese el comando siguiente para eliminar los recursos implementados por este patrón y dejar de supervisar las AMI compartidas.

    terraform destroy
  2. Confirme el comando destroy; para hacerlo, especifique yes.

DevOps ingeniero

Resolución de problemas

ProblemaSolución

No he recibido ninguna alerta por correo electrónico.

Puede haber varios motivos por los que no se envió el correo electrónico de Amazon SES. Compruebe lo siguiente:

  1. En la sección Epics, utilice el resumen Validar la implementación de recursos para confirmar que la infraestructura se aprovisionó correctamente en todas las cuentas de AWS.

  2. Valide los eventos de la función Lambda en Amazon CloudWatch Logs. Para obtener instrucciones, consulte Uso de la CloudWatch consola en la documentación de Lambda. Confirme que los permisos no tengan ningún problema, como una denegación explícita en una política basada en la identidad o en los recursos. Para obtener más información, consulte Lógica de evaluación de políticas en la documentación de IAM.

  3. En Amazon SES, compruebe que el estado de la identidad de la dirección de correo electrónico sea Verified (Verificado). Para obtener más información, consulte Verificación de identidades de correo electrónico.

Recursos relacionados

Documentación de AWS

Documentación de Terraform