AWS ha trasladado la funcionalidad de administración de etiquetas de Tag Editor de la AWS Resource Groups consola a la Explorador de recursos de AWS consola. Con Resource Explorer, puede buscar y filtrar los recursos y, a continuación, administrar las etiquetas de los recursos desde una única consola. Para obtener más información sobre la administración de etiquetas de recursos en el Explorador de recursos, consulte Administrar recursos en la guía del usuario del Explorador de recursos.
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.
Tutorial: Detener automáticamente EC2 las instancias de Amazon a las que les faltan las etiquetas obligatorias
A medida que crezca el conjunto de AWS recursos Cuentas de AWS que administra, puede utilizar etiquetas para facilitar la categorización de los recursos. Las etiquetas se suelen utilizar para casos de uso críticos, como la asignación de costos y la seguridad. Para gestionar AWS los recursos de forma eficaz, es necesario etiquetarlos de forma coherente. A menudo, cuando se aprovisiona un recurso, recibe todas las etiquetas apropiadas. Sin embargo, un proceso posterior puede provocar un cambio de etiqueta que provoque una desviación de la política de etiquetas corporativa. Al monitorear los cambios en las etiquetas, puede detectar la desviación de etiquetas y responder de inmediato. Esto le da más confianza en que los procesos que dependen de que sus recursos estén debidamente categorizados producirán los resultados deseados.
En el siguiente ejemplo, se muestra cómo supervisar los cambios de etiquetas en EC2 las instancias de Amazon para comprobar que una instancia específica sigue teniendo las etiquetas necesarias. Si las etiquetas de la instancia cambian y la instancia ya no tiene las etiquetas necesarias, se invoca una función de Lambda para cerrar la instancia automáticamente. ¿Para qué hacerlo? Garantiza que todos los recursos estén etiquetados de acuerdo con la política de etiquetas de su empresa, a fin de poder asignar los costos de forma eficaz o para poder confiar en la seguridad basada en el control de acceso basado en atributos (ABAC).
importante
Le recomendamos encarecidamente que realice este tutorial en una cuenta que no sea de producción, de forma que no pueda cerrar instancias importantes sin darse cuenta.
El código de ejemplo de este tutorial limita intencionadamente el impacto de este escenario solo a las instancias de una lista de instancias IDs. Debe actualizar la lista con la instancia IDs que desee cerrar para la prueba. Esto ayuda a garantizar que no puedas cerrar accidentalmente todas las instancias de una región de tu región Cuenta de AWS.
Tras realizar las pruebas, asegúrese de que todas las instancias estén etiquetadas de acuerdo con la estrategia de etiquetado de su empresa. A continuación, puedes eliminar el código que limita la función solo a la instancia IDs de la lista.
En este ejemplo se utiliza JavaScript y la versión 16.x de Node.js. En el ejemplo se utiliza el Cuenta de AWS ID de ejemplo 123456789012 y el Región de AWS US East (N. Virginia) (). us-east-1
Sustitúyalos por el ID y la región de su cuenta de prueba.
nota
Si la consola usa una región diferente como predeterminada, asegúrese de cambiar la región que está usando en este tutorial cada vez que cambie de consola. Una causa frecuente de que este tutorial no funcione es tener la instancia y la función en dos regiones diferentes.
Si utiliza una región diferente de us-east-1
, asegúrese de cambiar todas las referencias de los siguientes ejemplos de código a la región que elija.
Temas
Paso 1. Crear la función de Lambda
Para crear la función de Lambda
-
Elija Crear función, y, a continuación, Autor desde cero.
-
En Function name (Nombre de función), escriba
AutoEC2Termination
. -
En Tiempo de ejecución, elija Node.js 16.x.
-
Mantenga el resto de campos con sus valores predeterminados y seleccione Crear función.
-
En la pestaña Código de la página de detalles de
AutoEC2Termination
, abra el archivo index.js para ver su código.-
Si hay abierta una pestaña con index.js, puede seleccionar el cuadro de edición de esa pestaña para editar su código.
-
Si una pestaña con el archivo index.js no está abierta, haga clic con el botón secundario en el archivo index.js situado en la carpeta Auto EC2 Terminator del panel de navegación. A continuación, elija Abrir.
-
-
En la pestaña index.js, pegue el siguiente código en el cuadro del editor y sustituya todo lo que ya esté presente.
Reemplace el valor
RegionToMonitor
por la región en la que desea ejecutar esta función.// Set the following line to specify which Region's instances you want to monitor // Only instances in this Region are succesfully stopped on a match const RegionToMonitor = "us-east-1" // Specify the instance ARNs to check. // This limits the function for safety to avoid the tutorial shutting down all instances in account // The first ARN is a "dummy" that matches the test event you create in Step 3. // Replace the second ARN with one that matches a real instance that you want to monitor and that you can // safely stop const InstanceList = [ "i-0000000aaaaaaaaaa", "i-05db4466d02744f07" ]; // The tag key name and value that marks a "valid" instance. Instances in the previous list that // do NOT have the following tag key and value are stopped by this function const ValidKeyName = "valid-key"; const ValidKeyValue = "valid-value"; // Load and configure the AWS SDK const AWS = require('aws-sdk'); // Set the AWS Region AWS.config.update({region: RegionToMonitor}); // Create EC2 service object. const ec2 = new AWS.EC2({apiVersion: '2016-11-15'}); exports.handler = (event, context, callback) => { // Retrieve the details of the reported event. var detail = event.detail; var tags = detail["tags"]; var service = detail["service"]; var resourceType = detail["resource-type"]; var resource = event.resources[0]; var resourceSplit = resource.split("/"); var instanceId = resourceSplit[resourceSplit.length - 1]; // If this event is not for an EC2 resource, then do nothing. if (!(service === "ec2")) { console.log("Event not for correct service -- no action (", service, ")" ); return; } // If this event is not about an instance, then do nothing. if (!(resourceType === "instance")) { console.log("Event not for correct resource type -- no action (", resourceType, ")" ); return; } // CAUTION - Removing the following 'if' statement causes the function to run against // every EC2 instance in the specified Region in the calling Cuenta de AWS. // If you do this and an instance is not tagged with the approved tag key // and value, this function stops that instance. // If this event is not for the ARN of an instance in our include list, then do nothing. if (InstanceList.indexOf(instanceId)<0) { console.log("Event not for one of the monitored instances -- no action (", resource, ")"); return; } console.log("Tags changed on monitored EC2 instance (",instanceId,")"); // Check attached tags for expected tag key and value pair if ( tags.hasOwnProperty(ValidKeyName) && tags[ValidKeyName] == "valid-value"){ // Required tags ARE present console.log("The instance has the required tag key and value -- no action"); callback(null, "no action"); return; } // Required tags NOT present console.log("This instance is missing the required tag key or value -- attempting to stop the instance"); var params = { InstanceIds: [instanceId], DryRun: true }; // call EC2 to stop the selected instances ec2.stopInstances(params, function(err, data) { if (err && err.code === 'DryRunOperation') { // dryrun succeeded, so proceed with "real" stop operation params.DryRun = false; ec2.stopInstances(params, function(err, data) { if (err) { console.log("Failed to stop instance"); callback(err, "fail"); } else if (data) { console.log("Successfully stopped instance", data.StoppingInstances); callback(null, "Success"); } }); } else { console.log("Dryrun attempt failed"); callback(err); } }); };
-
Seleccione Implementar para guardar los cambios y activar la nueva versión de la función.
Esta función Lambda comprueba las etiquetas de una EC2 instancia de Amazon, según lo informado por el evento de cambio de etiqueta en. EventBridge En este ejemplo, si a la instancia del evento le falta la clave de etiqueta requerida valid-key
o si esa etiqueta no tiene el valor valid-value
, la función intenta detener la instancia. Puede cambiar esta comprobación lógica o los requisitos de etiqueta para sus casos de uso específicos.
Mantenga abierta la ventana de la consola Lambda en su navegador.
Paso 2. Configuración de los permisos necesarios de IAM
Antes de que la función pueda ejecutarse correctamente, debes concederle el permiso para detener una EC2 instancia. El rol AWS proporcionado lambda_basic_executionAutoEC2Termination-role-
. El permiso adicional mínimo requerido para este tutorial es uniqueid
ec2:StopInstances
.
Para obtener más información sobre la creación de políticas de IAM EC2 específicas de Amazon, consulte Amazon EC2: permite iniciar o detener una EC2 instancia y modificar un grupo de seguridad, mediante programación y en la consola, en la Guía del usuario de IAM.
Para crear una política de permisos de IAM y adjuntarla al rol de ejecución de la función de Lambda
-
En otra pestaña o ventana del navegador, abra la página de Funciones
de la consola de IAM. -
Comience a escribir el nombre del rol
AutoEC2Termination
y, cuando aparezca en la lista, selecciónelo. -
En la página de Resumen del rol, seleccione la pestaña Permisos y elija el nombre de la política que ya está adjunta.
-
En la página de Resumen de la política, elija Editar política.
-
En la pestaña Editor visual, elija Agregar permisos adicionales.
-
En Service (Servicio de ), seleccione EC2.
-
En Acciones, elija. StopInstances Puede escribir
Stop
en la barra de búsqueda y, a continuación, elegirStopInstances
cuándo aparezca. -
En Recursos, seleccione Todos los recursos, seleccione Revisar política y, a continuación, seleccione Guardar cambios.
De esta forma se crea automáticamente una nueva versión de la directiva y se establece esa versión como predeterminada.
La política final debe ser similar al ejemplo siguiente.
{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": "ec2:StopInstances", "Resource": "*" }, { "Sid": "VisualEditor1", "Effect": "Allow", "Action": "logs:CreateLogGroup", "Resource": "arn:aws:logs:us-east-1:123456789012:*" }, { "Sid": "VisualEditor2", "Effect": "Allow", "Action": [ "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": "arn:aws:logs:us-east-1:123456789012:log-group:/aws/lambda/AutoEC2Termination:*" } ] }
Paso 3. Realice una prueba preliminar de la función de Lambda
En este paso, envía un evento de prueba a su función. La funcionalidad de la prueba de Lambda funciona mediante el envío de un evento de prueba proporcionado manualmente. La función procesa el evento de prueba como si el evento procediera de EventBridge. Puede definir varios eventos de prueba con valores diferentes para ejercitar todas las distintas partes del código. En este paso, envías un evento de prueba que indica que las etiquetas de una EC2 instancia de Amazon han cambiado y que las nuevas etiquetas no incluyen la clave ni el valor de etiqueta necesarios.
Para probar su función de Lambda
-
Vuelva a la ventana o pestaña de la consola Lambda y abra la pestaña Prueba para la función de EC2terminación automática.
-
Elija Crear evento nuevo.
-
En Nombre del evento, escriba
SampleBadTagChangeEvent
. -
En el JSON del evento, sustituya el texto por el evento de ejemplo que se muestra en el siguiente texto de ejemplo. No es necesario modificar las cuentas, la región o el ID de instancia para que este evento de prueba funcione correctamente.
{ "version": "0", "id": "bddcf1d6-0251-35a1-aab0-adc1fb47c11c", "detail-type": "Tag Change on Resource", "source": "aws.tag", "account": "123456789012", "time": "2018-09-18T20:41:38Z", "region": "us-east-1", "resources": [ "arn:aws:ec2:us-east-1:123456789012:instance/i-0000000aaaaaaaaaa" ], "detail": { "changed-tag-keys": [ "valid-key" ], "tags": { "valid-key": "NOT-valid-value" }, "service": "ec2", "resource-type": "instance", "version": 3 } }
-
Elija Save (Guardar) y, a continuación, elija Test (Probar).
La prueba parece fallar, pero no pasa nada.
Debería aparecer el siguiente error en la pestaña Resultados de la ejecución, en Respuesta.
{ "errorType": "InvalidInstanceID.NotFound", "errorMessage": "The instance ID 'i-0000000aaaaaaaaaa' does not exist", ... }
El error se produce porque la instancia especificada en el evento de prueba no existe.
La información de la pestaña Resultados de ejecución, en la sección Registros de funciones, demuestra que la función Lambda intentó detener una EC2 instancia correctamente. Sin embargo, falló porque el código inicialmente intentó una
DryRun
operación para detener la instancia, lo que indicaba que el ID de la instancia no era válido.START RequestId: 390c1f8d-0d9b-4b44-b087-8de64479ab44 Version: $LATEST 2022-11-30T20:17:30.427Z 390c1f8d-0d9b-4b44-b087-8de64479ab44 INFO Tags changed on monitored EC2 instance ( i-0000000aaaaaaaaaa ) 2022-11-30T20:17:30.427Z 390c1f8d-0d9b-4b44-b087-8de64479ab44 INFO This instance is missing the required tag key or value -- attempting to stop the instance 2022-11-30T20:17:31.206Z 390c1f8d-0d9b-4b44-b087-8de64479ab44 INFO Dryrun attempt failed 2022-11-30T20:17:31.207Z 390c1f8d-0d9b-4b44-b087-8de64479ab44 ERROR Invoke Error {"errorType":"InvalidInstanceID.NotFound","errorMessage":"The instance ID 'i-0000000aaaaaaaaaa' does not exist","code":"InvalidInstanceID.NotFound","message":"The instance ID 'i-0000000aaaaaaaaaa' does not exist","time":"2022-11-30T20:17:31.205Z","requestId":"a5192c3b-142d-4cec-bdbc-685a9b7c7abf","statusCode":400,"retryable":false,"retryDelay":36.87870631147607,"stack":["InvalidInstanceID.NotFound: The instance ID 'i-0000000aaaaaaaaaa' does not exist"," at Request.extractError (/var/runtime/node_modules/aws-sdk/lib/services/ec2.js:50:35)"," at Request.callListeners (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:106:20)"," at Request.emit (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:78:10)"," at Request.emit (/var/runtime/node_modules/aws-sdk/lib/request.js:686:14)"," at Request.transition (/var/runtime/node_modules/aws-sdk/lib/request.js:22:10)"," at AcceptorStateMachine.runTo (/var/runtime/node_modules/aws-sdk/lib/state_machine.js:14:12)"," at /var/runtime/node_modules/aws-sdk/lib/state_machine.js:26:10"," at Request.<anonymous> (/var/runtime/node_modules/aws-sdk/lib/request.js:38:9)"," at Request.<anonymous> (/var/runtime/node_modules/aws-sdk/lib/request.js:688:12)"," at Request.callListeners (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:116:18)"]} END RequestId: 390c1f8d-0d9b-4b44-b087-8de64479ab44
-
Para demostrar que el código no intenta detener la instancia cuando se usa la etiqueta correcta, puede crear y enviar otro evento de prueba.
Seleccione la pestaña Prueba situada encima del Código fuente. La consola muestra el evento de SampleBadTagChangeEventprueba existente.
-
Elija Crear evento nuevo.
-
En Event Name (Nombre del evento), escriba
SampleGoodTagChangeEvent
. -
En la línea 17, elimine
NOT-
para cambiar el valor avalid-value
. -
En la parte superior de la ventana de Evento de prueba, seleccione Guardar y, a continuación, seleccione Prueba.
El resultado muestra lo siguiente, lo cual demuestra que la función reconoce la etiqueta como válida y no intenta cerrar la instancia.
START RequestId: 53631a49-2b54-42fe-bf61-85b9e91e86c4 Version: $LATEST 2022-12-01T23:24:12.244Z 53631a49-2b54-42fe-bf61-85b9e91e86c4 INFO Tags changed on monitored EC2 instance ( i-0000000aaaaaaaaaa ) 2022-12-01T23:24:12.244Z 53631a49-2b54-42fe-bf61-85b9e91e86c4 INFO The instance has the required tag key and value -- no action END RequestId: 53631a49-2b54-42fe-bf61-85b9e91e86c4
Mantenga la consola Lambda abierta en su navegador.
Paso 4. Cree la EventBridge regla que inicia la función
Ahora puede crear una EventBridge regla que coincida con el evento y apunte a la función Lambda.
Para crear la regla EventBridge
-
En otra pestaña o ventana del navegador, abra la EventBridge consola
en la página Crear regla. -
En Nombre, escriba
ec2-instance-rule
y, a continuación, seleccione Siguiente. -
Desplácese hacia abajo hasta Método de creación y seleccione Patrón personalizado (editor JSON).
-
En el cuadro de edición, pegue el siguiente texto del patrón y, a continuación, seleccione Siguiente.
{ "source": [ "aws.tag" ], "detail-type": [ "Tag Change on Resource" ], "detail": { "service": [ "ec2" ], "resource-type": [ "instance" ] } }
Esta regla coincide con
Tag Change on Resource
los eventos de EC2 las instancias de Amazon e invoca lo que especifiques como Target en el siguiente paso. -
A continuación, añada la función de Lambda como destino. En el cuadro Destino 1, en Seleccione un destino, elija Función de Lambda.
-
En Función, elija la función de EC2terminación automática que creó anteriormente y, a continuación, elija Siguiente.
-
En la página Configurar etiquetas, elija Siguiente. A continuación, en la página Revisar y crear, elija Crear regla. Esto también otorga automáticamente permiso para EventBridge invocar la función Lambda especificada.
Paso 5. Comprobación de la solución completa
Para probar el resultado final, crea una EC2 instancia y observa lo que ocurre cuando cambias sus etiquetas.
Para probar la solución de supervisión con una instancia real
-
Abre la EC2consola de Amazon
en la página de instancias. -
Crea una EC2 instancia de Amazon. Antes de lanzarla, adjunte una etiqueta con la clave
valid-key
y el valorvalid-value
. Para obtener información sobre cómo crear y lanzar una instancia, consulta el paso 1: lanzar una instancia en la Guía del EC2 usuario de Amazon. En el procedimiento Para lanzar una instancia, en el paso 3, donde introduce la etiqueta de Nombre, también seleccione Añadir etiquetas adicionales, seleccione Añadir etiqueta y, a continuación, ingrese la Clavevalid-key
y el valor devalid-value
. Puede continuar sin un par de claves si esta instancia es únicamente para los fines de este tutorial y planea eliminar esta instancia después de completarla. Vuelva a este tutorial cuando llegue al final del Paso 1; no es necesario que haga el Paso 2: conectarse a su instancia. -
Copia el InstanceIdarchivo de la consola.
-
Cambie de la EC2 consola Amazon a la consola Lambda. Elija la función de EC2terminación automática, elija la pestaña Código y, a continuación, elija la pestaña index.js para editar el código.
-
Cambia la segunda entrada
InstanceList
pegando el valor que copiaste de la EC2 consola de Amazon. Asegúrese de que el valor deRegionToMonitor
coincida con la región que contiene la instancia que pegó. -
Elija Implementar para activar los cambios. La función ya está lista para activarse mediante cambios de etiqueta en esa instancia en la región especificada.
-
Cambie de la consola Lambda a la consola de Amazon EC2 .
-
Cambie las Etiquetas adjuntas a la instancia eliminando la etiqueta de clave válida o cambiando el valor de esa clave.
nota
Para obtener información sobre cómo cambiar las etiquetas en una EC2 instancia de Amazon en ejecución, consulta Añadir y eliminar etiquetas en un recurso individual en la Guía del EC2 usuario de Amazon.
-
Espere unos segundos y, a continuación, actualice la consola. La instancia debería cambiar su Estado de instancia a Deteniendo y, a continuación, a Detenida.
-
Cambie de la EC2 consola Amazon a la consola Lambda con su función y elija la pestaña Monitor.
-
Seleccione la pestaña Registros y, en la tabla de invocaciones recientes, elija la entrada más reciente de la LogStreamcolumna.
La CloudWatch consola de Amazon se abre en la página de registro de eventos para la última invocación de la función Lambda. La última entrada debería tener un aspecto similar al ejemplo siguiente.
2022-11-30T12:03:57.544-08:00 START RequestId: b5befd18-2c41-43c8-a320-3a4b2317cdac Version: $LATEST 2022-11-30T12:03:57.548-08:00 2022-11-30T20:03:57.548Z b5befd18-2c41-43c8-a320-3a4b2317cdac INFO Tags changed on monitored EC2 instance ( arn:aws:ec2:us-west-2:123456789012:instance/i-1234567890abcdef0 ) 2022-11-30T12:03:57.548-08:00 2022-11-30T20:03:57.548Z b5befd18-2c41-43c8-a320-3a4b2317cdac INFO This instance is missing the required tag key or value -- attempting to stop the instance 2022-11-30T12:03:58.488-08:00 2022-11-30T20:03:58.488Z b5befd18-2c41-43c8-a320-3a4b2317cdac INFO Successfully stopped instance [ { CurrentState: { Code: 64, Name: 'stopping' }, InstanceId: 'i-1234567890abcdef0', PreviousState: { Code: 16, Name: 'running' } } ] 2022-11-30T12:03:58.546-08:00 END RequestId: b5befd18-2c41-43c8-a320-3a4b2317cdac
Resumen del tutorial
En este tutorial, se muestra cómo crear una EventBridge regla que coincida con un cambio de etiqueta en un evento de recurso para EC2 instancias de Amazon. La regla apuntaba a una función de Lambda que cierra automáticamente la instancia si no tiene la etiqueta requerida.
La EventBridge compatibilidad de Amazon con los cambios de etiquetas en AWS los recursos abre la posibilidad de desarrollar una automatización basada en eventos en muchos de ellos. Servicios de AWS La combinación de esta capacidad le AWS Lambda proporciona herramientas para crear soluciones sin servidor que accedan a AWS los recursos de forma segura, se escalan según la demanda y son rentables.
Otros posibles casos de uso del tag-change-on-resource EventBridge evento incluyen:
-
Lanzar una advertencia si alguien accede al recurso desde una dirección IP inusual: use una etiqueta para almacenar la dirección IP de origen de cada visitante que acceda a su recurso. Los cambios en la etiqueta generan un CloudWatch evento. Puede usar ese evento para comparar la dirección IP de origen con una lista de direcciones IP válidas y activar un correo electrónico de advertencia si la dirección IP de origen no es válida.
-
Supervise si hay cambios en el control de acceso basado en etiquetas de un recurso: si ha configurado el acceso a un recurso mediante el control de acceso basado en atributos (etiquetas) (ABAC), puede utilizar los EventBridge eventos generados por cualquier cambio en la etiqueta para solicitar una auditoría por parte de su equipo de seguridad.