

# Automaticzación de las respuestas a los errores de Amazon ECS mediante EventBridge
<a name="cloudwatch_event_stream"></a>

Con Amazon EventBridge, puede automatizar sus servicios de AWS y responder automáticamente a eventos del sistema, como problemas de disponibilidad de aplicaciones o cambios de recursos. Los eventos de los servicios de AWS se envían a EventBridge casi en tiempo real. Puede crear reglas sencillas para indicar qué eventos le resultan de interés, así como qué acciones automatizadas se van a realizar cuando un evento cumple una de las reglas. Entre las acciones que se pueden activar automáticamente, se incluyen las siguientes:
+ Adición de eventos a grupos de registros en CloudWatch Logs
+ Invocar una función de AWS Lambda
+ Invocar Ejecutar comando de Amazon EC2
+ Desviar el evento a Amazon Kinesis Data Streams
+ Activar una máquina de estado de AWS Step Functions
+ Notificación de un tema de Amazon SNS o una cola de Amazon Simple Queue Service (Amazon SQS)

Para obtener más información, consulte [Introducción a Amazon EventBridge](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-get-started.html) en la *Guía del usuario de Amazon EventBridge*.

Puede utilizar eventos de Amazon ECS para EventBridge con el fin de recibir notificaciones casi en tiempo real sobre el estado actual de los clústeres de Amazon ECS. Si las tareas utilizan EC2, puede ver el estado actual de las instancias de contenedor y de todas las tareas que se ponen en marcha en estas. Si las tareas utilizan Fargate, puede ver el estado de las instancias de contenedor.

Mediante EventBridge, puede crear programadores personalizados encima de Amazon ECS que son responsables de organizar tareas entre clústeres y de monitorear el estado de los clústeres casi en tiempo real. Puede eliminar el código de programación y monitoreo que sondea continuamente el servicio de Amazon ECS para detectar cambios de estado y controlar en su lugar los cambios de estado de Amazon ECS de forma asíncrona utilizando cualquier destino de EventBridge. Entre los destinos, podemos mencionar AWS Lambda, Amazon Simple Queue Service, Amazon Simple Notification Service o Amazon Kinesis Data Streams.

Una secuencia de eventos de Amazon ECS garantiza que todos los eventos se entreguen al menos una vez. Si se envían eventos duplicados, el evento ofrece información suficiente para identificar duplicados. Para obtener más información, consulte [Control de eventos de Amazon ECS](ecs_cwet_handling.md).

Los eventos están ordenados relativamente, para que pueda decir con facilidad cuándo se produjo un evento en relación a los demás.

**Topics**
+ [Eventos de Amazon ECS](ecs_cwe_events.md)
+ [Control de eventos de Amazon ECS](ecs_cwet_handling.md)

# Eventos de Amazon ECS
<a name="ecs_cwe_events"></a>

Amazon ECS realiza el seguimiento del estado de cada una de las tareas y los servicios. Si el estado de una tarea o servicio cambia, se genera un evento que se envía a Amazon EventBridge. Estos eventos se clasifican como eventos de cambio de estado de tarea y eventos de acciones de servicio. Estos eventos y sus posibles causas se describen con mayor detalle en las secciones siguientes.

Amazon ECS genera y envía los siguientes tipos de eventos a EventBridge: 
+ Cambio de estado de instancia de contenedor
+ Cambio de estado de tarea
+ Deployment state change (Cambio de estado de implementación)
+ Acción de servicio

**nota**  
Amazon ECS podría agregar otros tipos de eventos, orígenes y detalles en el futuro. Si está deserializando mediante programación datos JSON de eventos, asegúrese de que la aplicación esté preparada para tratar propiedades desconocidas para evitar problemas si se agregan estas propiedades adicionales.

En algunos casos, se generan múltiples eventos para la misma actividad. Por ejemplo, cuando se inicia una tarea en una instancia de contenedor, se genera un evento de cambio de estado de la tarea para la nueva tarea. Se genera un evento de cambio de estado de la instancia de contenedor para dar cuenta del cambio en los recursos disponibles, como la CPU, la memoria y los puertos disponibles, en la instancia de contenedor. Del mismo modo, si una instancia de contenedor se termina, se generan eventos para la instancia de contenedor, el estado de la conexión del agente del contenedor y todas las tareas que se ejecutaban en la instancia de contenedor.

Los eventos de cambio de estado del contenedor y de cambio de estado de tarea contienen dos campos `version`: uno en el cuerpo principal del evento y otro en el objeto `detail` del evento. A continuación, se describen las diferencias entre estos dos campos:
+ El campo `version` en el cuerpo principal del evento se establece en `0` en todos los eventos. Para obtener más información acerca de los parámetros de EventBridge, consulte [Metadatos de eventos de servicio de AWS](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-events-structure.html) en la *Guía del usuario de Amazon EventBridge*.
+ El campo `version` en el objeto `detail` describe la versión del recurso asociado. Cada vez que un recurso cambia de estado, se incrementa esta versión. Dado que los eventos se pueden enviar varias veces, este campo permite identificar eventos duplicados. Los eventos duplicados tienen la misma versión en el objeto `detail`. Si está replicando el estado de las tareas y las instancias de contenedor de Amazon ECS con EventBridge, puede comparar la versión de un recurso notificada por las API de Amazon ECS con la versión notificada en EventBridge para el recurso (dentro del objeto `detail`) para verificar que la versión de la secuencia de eventos sea actual.

Los eventos de acciones de servicio solo contienen el campo `version` en el cuerpo principal.

Los eventos de acciones de servicio especifican el servicio en dos campos diferentes:
+ En el caso de los eventos generados por `create-service`, el servicio está en el campo `serviceName`.
+ En el caso de los eventos generados por `update-service`, el servicio está en el campo `service`.

Si utiliza herramientas automatizadas para los eventos de servicio, debe codificar ambos campos.

Para obtener más información sobre cómo crear una regla para varios servicios y categorías de eventos, consulte [Eventos de acciones de servicio de Amazon ECS](ecs_service_events.md).

Para obtener información adicional sobre cómo integrar Amazon ECS y EventBridge, consulte [Integrating Amazon EventBridge and Amazon ECS](https://aws.amazon.com/blogs/compute/integrating-amazon-eventbridge-and-amazon-ecs/) (Integración de Amazon EventBridge y Amazon ECS).

# Eventos de cambio de estado de instancia de contenedor de Amazon ECS
<a name="ecs_container_instance_events"></a>

Los siguientes escenarios provocan eventos de cambio de estado de la instancia de contenedor:

Puede llamar a las operaciones `StartTask`, `RunTask` o `StopTask` de la API, bien directamente o bien con la Consola de administración de AWS o los SDK.  
Colocar o parar tareas en una instancia de contenedor modifica los recursos disponibles en ella (tales como CPU, memoria y puertos disponibles).

El programador de servicio de Amazon ECS comienza o detiene una tarea.  
Colocar o parar tareas en una instancia de contenedor modifica los recursos disponibles en ella (tales como CPU, memoria y puertos disponibles).

El agente de contenedor de Amazon ECS llama a la operación del API `SubmitTaskStateChange` con un estado `STOPPED` para una tarea con un estado deseado `RUNNING`.  
El agente de contenedor de Amazon ECS monitorea el estado de las tareas de las instancias de contenedor y notifica los cambios de estado. Si una tarea que se supone en estado `RUNNING` pasa a `STOPPED`, el agente libera los recursos que se asignaron a la tarea parada (tales como CPU, memoria y puertos disponibles).

El registro de la instancia de contenedor se cancela con la operación `DeregisterContainerInstance` de la API, ya sea directamente o con la Consola de administración de AWS o los SDK.  
La anulación del registro de una instancia de contenedor cambia el estado de la instancia de contenedor y el estado de conexión del agente de contenedor de Amazon ECS.

Una tarea se paró al parar la instancia EC2.   
Cuando se para una instancia de contenedor, las tareas que se estaban ejecutando en la misma pasan al estado `STOPPED`.

El agente de contenedor de Amazon ECS registra una instancia de contenedor por primera vez.   
La primera vez que el agente de contenedor de Amazon ECS registra una instancia de contenedor (durante el lanzamiento o cuando se ejecuta manualmente por primera vez), se crea un evento de cambio de estado para la instancia.

El agente de contenedor de Amazon ECS se conecta o desconecta de Amazon ECS.  
Cuando el agente de contenedor de Amazon ECS se conecta o desconecta del backend de , cambia el estado `agentConnected` de la instancia de contenedor.  
El agente de contenedor de Amazon ECS se desconecta y se vuelve a conectar varias veces por hora como parte de su operación normal, por lo que cabe esperar que se produzcan eventos de conexión del agente. Estos eventos no indican que haya un problema con el agente de contenedores ni con o su instancia de contenedor.

El agente de contenedor de Amazon ECS se actualiza en una instancia.  
El detalle de instancia de contenedor contiene un objeto para la versión del agente de contenedor. Si actualiza el agente, esta información de la versión cambia y genera un evento.

**Example Evento de cambio de estado de instancia de contenedor**  
Los eventos de cambio de estado de instancia de contenedor se entregan en el siguiente formato. La sección `detail` siguiente se asemeja al objeto [ContainerInstance](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_ContainerInstance.html) que se devuelve de una operación de la API [DescribeContainerInstances](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_DescribeContainerInstances.html) en la *Referencia de la API de Amazon Elastic Container Service*. Para obtener más información acerca de los parámetros de EventBridge, consulte [Metadatos de eventos de servicio deAWS](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-events-structure.html) en la *Guía del usuario de Amazon EventBridge*.  

```
{
  "version": "0",
  "id": "8952ba83-7be2-4ab5-9c32-6687532d15a2",
  "detail-type": "ECS Container Instance State Change",
  "source": "aws.ecs",
  "account": "111122223333",
  "time": "2016-12-06T16:41:06Z",
  "region": "us-east-1",
  "resources": [
    "arn:aws:ecs:us-east-1:111122223333:container-instance/b54a2a04-046f-4331-9d74-3f6d7f6ca315"
  ],
  "detail": {
    "agentConnected": true,
    "attributes": [
      {
        "name": "com.amazonaws.ecs.capability.logging-driver.syslog"
      },
      {
        "name": "com.amazonaws.ecs.capability.task-iam-role-network-host"
      },
      {
        "name": "com.amazonaws.ecs.capability.logging-driver.awslogs"
      },
      {
        "name": "com.amazonaws.ecs.capability.logging-driver.json-file"
      },
      {
        "name": "com.amazonaws.ecs.capability.docker-remote-api.1.17"
      },
      {
        "name": "com.amazonaws.ecs.capability.privileged-container"
      },
      {
        "name": "com.amazonaws.ecs.capability.docker-remote-api.1.18"
      },
      {
        "name": "com.amazonaws.ecs.capability.docker-remote-api.1.19"
      },
      {
        "name": "com.amazonaws.ecs.capability.ecr-auth"
      },
      {
        "name": "com.amazonaws.ecs.capability.docker-remote-api.1.20"
      },
      {
        "name": "com.amazonaws.ecs.capability.docker-remote-api.1.21"
      },
      {
        "name": "com.amazonaws.ecs.capability.docker-remote-api.1.22"
      },
      {
        "name": "com.amazonaws.ecs.capability.docker-remote-api.1.23"
      },
      {
        "name": "com.amazonaws.ecs.capability.task-iam-role"
      }
    ],
    "clusterArn": "arn:aws:ecs:us-east-1:111122223333:cluster/default",
    "containerInstanceArn": "arn:aws:ecs:us-east-1:111122223333:container-instance/b54a2a04-046f-4331-9d74-3f6d7f6ca315",
    "ec2InstanceId": "i-f3a8506b",
    "registeredResources": [
      {
        "name": "CPU",
        "type": "INTEGER",
        "integerValue": 2048
      },
      {
        "name": "MEMORY",
        "type": "INTEGER",
        "integerValue": 3767
      },
      {
        "name": "PORTS",
        "type": "STRINGSET",
        "stringSetValue": [
          "22",
          "2376",
          "2375",
          "51678",
          "51679"
        ]
      },
      {
        "name": "PORTS_UDP",
        "type": "STRINGSET",
        "stringSetValue": []
      }
    ],
    "remainingResources": [
      {
        "name": "CPU",
        "type": "INTEGER",
        "integerValue": 1988
      },
      {
        "name": "MEMORY",
        "type": "INTEGER",
        "integerValue": 767
      },
      {
        "name": "PORTS",
        "type": "STRINGSET",
        "stringSetValue": [
          "22",
          "2376",
          "2375",
          "51678",
          "51679"
        ]
      },
      {
        "name": "PORTS_UDP",
        "type": "STRINGSET",
        "stringSetValue": []
      }
    ],
    "status": "ACTIVE",
    "version": 14801,
    "versionInfo": {
      "agentHash": "aebcbca",
      "agentVersion": "1.13.0",
      "dockerVersion": "DockerVersion: 1.11.2"
    },
    "updatedAt": "2016-12-06T16:41:06.991Z"
  }
}
```

# Eventos de cambio de estado de tarea de Amazon ECS
<a name="ecs_task_events"></a>

Los siguientes escenarios provocan eventos de cambio de estado de la tarea:

Puede llamar a las operaciones `StartTask`, `RunTask` o `StopTask` de la API, ya sea directamente o con la Consola de administración de AWS, la AWS CLI o los SDK.  
Comenzar o parar tareas crea nuevos recursos de tareas o modifica el estado de los recursos de tarea existentes.

El programador de servicio de Amazon ECS comienza o detiene una tarea.  
Comenzar o parar tareas crea nuevos recursos de tareas o modifica el estado de los recursos de tarea existentes.

El agente de contenedor de Amazon ECS llama a la operación `SubmitTaskStateChange` de la API.  
En el caso de Amazon EC2, el agente de contenedor de Amazon ECS supervisa el estado de las tareas en las instancias de contenedor. El agente de contenedor de Amazon ECS informa de los cambios de estado. Los cambios de estado pueden incluir cambios de `PENDING` a `RUNNING` o de `RUNNING` a `STOPPED`.

La cancelación del registro de la instancia de contenedor subyacente se fuerza con la operación `DeregisterContainerInstance` de la API y la marca `force`, ya sea directamente o con la Consola de administración de AWS o los SDK.  
La anulación del registro de una instancia de contenedor cambia el estado de la instancia de contenedor y el estado de conexión del agente de contenedor de Amazon ECS. Si las tareas se ejecutan en la instancia de contenedor, se debe establecer la marca `force` para permitir la cancelación del registro. Esto para todas las tareas en la instancia.

La instancia de contenedor subyacente se para o se termina.  
Cuando se para o se termina una instancia de contenedor, las tareas que se estaban ejecutando en la misma pasan al estado `STOPPED`.

Un contenedor en la tarea cambia de estado.  
El agente de contenedor de Amazon ECS monitorea el estado de los contenedores dentro de las tareas. Por ejemplo, si un contenedor que se ejecuta dentro de una tarea se detiene, este cambio de estado del contenedor genera un evento.

Una tarea que utiliza el proveedor de capacidad de Fargate Spot recibe un aviso de terminación.  
Cuando una tarea utiliza el proveedor de capacidad de `FARGATE_SPOT` y se detiene debido a una interrupción del punto de acceso, se genera un evento de cambio de estado de la tarea.

**Example Evento de cambio de estado de tarea**  
Los eventos de cambio de estado de tarea se entregan en el siguiente formato. Tenga en cuenta lo siguiente sobre los campos:  
+ El estado de salud del evento no está disponible en el evento de cambio de estado de la tarea. Si necesita conocer el estado de salud de la tarea, puede ejecutar [describe-tasks](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_DescribeTasks.html).
+ Si sus contenedores utilizan una imagen alojada con Amazon ECR, se devuelve el campo `imageDigest`.
+ Los valores de los campos `createdAt`, `connectivityAt`, `pullStartedAt`, `startedAt`, `pullStoppedAt` y `updatedAt` son marcas de tiempo de cadenas ISO.
+ El valor de `detail-type` es “ECS Task State Change”.
+ Cuando se genera el evento para una tarea detenida, los campos `stoppedReason` y `stopCode` proporcionan información adicional sobre el motivo por el que se detuvo la tarea (por ejemplo, “Iniciada por el usuario”).
Para obtener más información acerca de los parámetros de EventBridge, consulte [Metadatos de eventos de servicio deAWS](https://docs.aws.amazon.com/eventbridge/latest/ref/events-structure.html) en la *Refencia de eventos de Amazon EventBridge*.  
Para obtener información sobre cómo configurar una regla de eventos de Amazon EventBridge que solo captura eventos de tarea en los que se ha parado la ejecución de la tarea porque se ha terminado uno de sus contenedores esenciales, consulte [Envío de alertas de Amazon Simple Notification Service para eventos de tareas detenidas de Amazon ECS](ecs_cwet2.md)  

```
{
    "version": "0",
    "id": "105f6bb1-4da6-c630-4965-35383018cbca",
    "detail-type": "ECS Task State Change",
    "source": "aws.ecs",
    "account": "123456789012",
    "time": "2025-05-06T11:02:34Z",
    "region": "us-east-1",
    "resources": [
        "arn:aws:ecs:us-east-1:123456789012:task/example-cluster/a1173316d40a45dea9"
    ],
    "detail": {
        "attachments": [
            {
                "id": "fe3a9a46-6a47-40ee-afd9-7952ae90a75a",
                "type": "eni",
                "status": "ATTACHED",
                "details": [
                    {
                        "name": "subnetId",
                        "value": "subnet-0d0eab1bb38d5ca64"
                    },
                    {
                        "name": "networkInterfaceId",
                        "value": "eni-0103a2f01bad57d71"
                    },
                    {
                        "name": "macAddress",
                        "value": "0e:50:d1:c1:77:81"
                    },
                    {
                        "name": "privateDnsName",
                        "value": "ip-10-0-1-163.ec2.internal"
                    },
                    {
                        "name": "privateIPv4Address",
                        "value": "10.0.1.163"
                    }
                ]
            }
        ],
        "attributes": [
            {
                "name": "ecs.cpu-architecture",
                "value": "x86_64"
            }
        ],
        "availabilityZone": "us-east-1b",
        "capacityProviderName": "FARGATE",
        "clusterArn": "arn:aws:ecs:us-east-1:123456789012:cluster/example-cluster",
        "connectivity": "CONNECTED",
        "connectivityAt": "2025-05-06T11:02:17.19Z",
        "containers": [
            {
                "containerArn": "arn:aws:ecs:us-east-1:123456789012:container/example-cluster/a1173316d40a45dea9/a0a99b87-baa8-4bf6-b9f1-a9a95917a635",
                "lastStatus": "RUNNING",
                "name": "web",
                "image": "nginx",
                "imageDigest": "sha256:c15da6c91de8d2f436196f3a768483ad32c258ed4e1beb3d367a27ed67253e66",
                "runtimeId": "a1173316d40a45dea9-0265927825",
                "taskArn": "arn:aws:ecs:us-east-1:123456789012:task/example-cluster/a1173316d40a45dea9",
                "networkInterfaces": [
                    {
                        "attachmentId": "fe3a9a46-6a47-40ee-afd9-7952ae90a75a",
                        "privateIpv4Address": "10.0.1.163"
                    }
                ],
                "cpu": "99",
                "memory": "100"
            },
            {
                "containerArn": "arn:aws:ecs:us-east-1:123456789012:container/example-cluster/a1173316d40a45dea9/a2010e2d-ba7c-4135-8b79-e0290ff3cd8c",
                "lastStatus": "RUNNING",
                "name": "aws-guardduty-agent-nm40lC",
                "imageDigest": "sha256:bf9197abdf853607e5fa392b4f97ccdd6ca56dd179be3ce8849e552d96582ac8",
                "runtimeId": "a1173316d40a45dea9-2098416933",
                "taskArn": "arn:aws:ecs:us-east-1:123456789012:task/example-cluster/a1173316d40a45dea9",
                "networkInterfaces": [
                    {
                        "attachmentId": "fe3a9a46-6a47-40ee-afd9-7952ae90a75a",
                        "privateIpv4Address": "10.0.1.163"
                    }
                ],
                "cpu": "null"
            },
            {
                "containerArn": "arn:aws:ecs:us-east-1:123456789012:container/example-cluster/a1173316d40a45dea9/dccf0ca2-d929-471f-a5c3-98006fd4379e",
                "lastStatus": "RUNNING",
                "name": "aws-otel-collector",
                "image": "public.ecr.aws/aws-observability/aws-otel-collector:v0.32.0",
                "imageDigest": "sha256:7a1b3560655071bcacd66902c20ebe9a69470d5691fe3bd36baace7c2f3c4640",
                "runtimeId": "a1173316d40a45dea9-4027662657",
                "taskArn": "arn:aws:ecs:us-east-1:123456789012:task/example-cluster/a1173316d40a45dea9",
                "networkInterfaces": [
                    {
                        "attachmentId": "fe3a9a46-6a47-40ee-afd9-7952ae90a75a",
                        "privateIpv4Address": "10.0.1.163"
                    }
                ],
                "cpu": "0"
            }
        ],
        "cpu": "256",
        "createdAt": "2025-05-06T11:02:13.877Z",
        "desiredStatus": "RUNNING",
        "enableExecuteCommand": false,
        "ephemeralStorage": {
            "sizeInGiB": 20
        },
        "group": "family:webserver",
        "launchType": "FARGATE",
        "lastStatus": "RUNNING",
        "memory": "512",
        "overrides": {
            "containerOverrides": [
                {
                    "name": "web"
                },
                {
                    "environment": [
                        {
                            "name": "CLUSTER_NAME",
                            "value": "example-cluster"
                        },
                        {
                            "name": "REGION",
                            "value": "us-east-1"
                        },
                        {
                            "name": "HOST_PROC",
                            "value": "/host_proc"
                        },
                        {
                            "name": "AGENT_RUNTIME_ENVIRONMENT",
                            "value": "ecsfargate"
                        },
                        {
                            "name": "STAGE",
                            "value": "prod"
                        }
                    ],
                    "memory": 128,
                    "name": "aws-guardduty-agent-nm40lC"
                },
                {
                    "name": "aws-otel-collector"
                }
            ]
        },
        "platformVersion": "1.4.0",
        "pullStartedAt": "2025-05-06T11:02:24.162Z",
        "pullStoppedAt": "2025-05-06T11:02:33.493Z",
        "startedAt": "2025-05-06T11:02:34.325Z",
        "taskArn": "arn:aws:ecs:us-east-1:123456789012:task/example-cluster/a1173316d40a45dea9",
        "taskDefinitionArn": "arn:aws:ecs:us-east-1:123456789012:task-definition/webserver:5",
        "updatedAt": "2025-05-06T11:02:34.325Z",
        "version": 3
    }
}
```

**Example**  
A continuación se muestra un ejemplo de un evento de cambio de estado de tarea para EC2.  

```
{
    "version": "0",
    "id": "a65cf262-f104-0dd5-ceda-4b09ba71a441",
    "detail-type": "ECS Task State Change",
    "source": "aws.ecs",
    "account": "123456789012",
    "time": "2025-05-12T13:12:06Z",
    "region": "us-east-1",
    "resources": [
        "arn:aws:ecs:us-east-1:123456789012:task/example/c1ffa94f19a540ed8d9f7e1d2a5d"
    ],
    "detail": {
        "attachments": [
            {
                "id": "52333e3b-b812-41a8-b057-9ed184bbe5e1",
                "type": "eni",
                "status": "ATTACHED",
                "details": [
                    {
                        "name": "subnetId",
                        "value": "subnet-0d0eab1bb38d5ca64"
                    },
                    {
                        "name": "networkInterfaceId",
                        "value": "eni-0ea90f746500773a4"
                    },
                    {
                        "name": "macAddress",
                        "value": "0e:d5:9b:ce:49:fb"
                    },
                    {
                        "name": "privateDnsName",
                        "value": "ip-10-0-1-37.ec2.internal"
                    },
                    {
                        "name": "privateIPv4Address",
                        "value": "10.0.1.37"
                    }
                ]
            }
        ],
        "attributes": [
            {
                "name": "ecs.cpu-architecture",
                "value": "x86_64"
            }
        ],
        "availabilityZone": "us-east-1b",
        "capacityProviderName": "Infra-ECS-Cluster-example-fa84e0cc-AsgCapacityProvider-OseQJU9pizmp",
        "clusterArn": "arn:aws:ecs:us-east-1:123456789012:cluster/example",
        "connectivity": "CONNECTED",
        "connectivityAt": "2025-05-12T13:11:44.98Z",
        "containerInstanceArn": "arn:aws:ecs:us-east-1:123456789012:container-instance/example/d1d84798400f49f3b21cb61610c1e",
        "containers": [
            {
                "containerArn": "arn:aws:ecs:us-east-1:123456789012:container/example/c1ffa94f19a540ed8d9f7e1d2a5d3626/197d0994-5367-4a6d-9f9a-f075e4a6",
                "lastStatus": "RUNNING",
                "name": "aws-otel-collector",
                "image": "public.ecr.aws/aws-observability/aws-otel-collector:v0.32.0",
                "imageDigest": "sha256:7a1b3560655071bcacd66902c20ebe9a69470d5691fe3bd36baace7c2f3c4640",
                "runtimeId": "8e926f0ccd8fe2b459926f49584ba6d33a3d9f61398dbabe944ee6a13a8ff3a1",
                "taskArn": "arn:aws:ecs:us-east-1:123456789012:task/example/c1ffa94f19a540ed8d9f7e1d2a5d",
                "networkInterfaces": [
                    {
                        "attachmentId": "52333e3b-b812-41a8-b057-9ed184bbe5e1",
                        "privateIpv4Address": "10.0.1.37"
                    }
                ],
                "cpu": "0"
            },
            {
                "containerArn": "arn:aws:ecs:us-east-1:123456789012:container/example/c1ffa94f19a540ed8d9f7e1d2a5d3626/cab39ef0-9c50-459d-844b-b9d51d73d",
                "lastStatus": "RUNNING",
                "name": "web",
                "image": "nginx",
                "imageDigest": "sha256:c15da6c91de8d2f436196f3a768483ad32c258ed4e1beb3d367a27ed67253e66",
                "runtimeId": "9f1c73f0094f051541d9e5c2ab1e172d83c4eb5171bcc857c4504b02770ff3b8",
                "taskArn": "arn:aws:ecs:us-east-1:123456789012:task/example/c1ffa94f19a540ed8d9f7e1d2a5d",
                "networkInterfaces": [
                    {
                        "attachmentId": "52333e3b-b812-41a8-b057-9ed184bbe5e1",
                        "privateIpv4Address": "10.0.1.37"
                    }
                ],
                "cpu": "99",
                "memory": "100"
            }
        ],
        "cpu": "256",
        "createdAt": "2025-05-12T13:11:44.98Z",
        "desiredStatus": "RUNNING",
        "enableExecuteCommand": false,
        "group": "family:webserver",
        "launchType": "EC2",
        "lastStatus": "RUNNING",
        "memory": "512",
        "overrides": {
            "containerOverrides": [
                {
                    "name": "aws-otel-collector"
                },
                {
                    "name": "web"
                }
            ]
        },
        "pullStartedAt": "2025-05-12T13:11:59.491Z",
        "pullStoppedAt": "2025-05-12T13:12:05.896Z",
        "startedAt": "2025-05-12T13:12:06.053Z",
        "taskArn": "arn:aws:ecs:us-east-1:123456789012:task/example/c1ffa94f19a540ed8d9f7e1d2a5d",
        "taskDefinitionArn": "arn:aws:ecs:us-east-1:123456789012:task-definition/webserver",
        "updatedAt": "2025-05-12T13:12:06.053Z",
        "version": 4
    }
}
```

# Eventos de acciones de servicio de Amazon ECS
<a name="ecs_service_events"></a>

Amazon ECS envía eventos de acciones de servicio con el tipo de detalle **ECS Service Action** (Acción de servicio de ECS). A diferencia de los eventos de cambio de instancia de contenedor y de estado de tarea, los eventos de acciones de servicio no incluyen un número de versión en el campo de respuesta `details`. El siguiente es un patrón de eventos que se utiliza con el fin de crear una regla de EventBridge para los eventos de acciones de servicio de Amazon ECS. Para obtener más información, consulte [Introducción a Amazon EventBridge](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-get-started.html) en la *Guía del usuario de Amazon EventBridge*.

```
{
    "source": [
        "aws.ecs"
    ],
    "detail-type": [
        "ECS Service Action"
    ]
}
```

Amazon ECS envía eventos con los tipos de eventos `INFO`, `WARN` y `ERROR`. Los siguientes son los eventos de acciones de servicio.

## Eventos de acciones de servicio con el tipo de evento `INFO`
<a name="ecs_service_events_info_type"></a>

`SERVICE_STEADY_STATE`  
El estado del servicio es correcto y el número de tareas realizadas es el deseado, por lo que se ha alcanzado un estado es estable. El programador de servicios informa periódicamente del estado, por lo que podría recibir este mensaje varias veces.

`TASKSET_STEADY_STATE`  
El estado del conjunto de tareas es correcto y el número de tareas realizadas es el deseado, por lo que se ha alcanzado un estado es estable.

`CAPACITY_PROVIDER_STEADY_STATE`  
Un proveedor de capacidad asociado a un servicio ha alcanzado un estado estable.

`SERVICE_DESIRED_COUNT_UPDATED`  
Se envía cuando el programador de servicios actualiza el recuento calculado deseado para un servicio o conjunto de tareas. Este evento no se envía cuando un usuario actualiza manualmente el recuento deseado.

`TASKS_STOPPED`  
El servicio ha detenido la tarea en ejecución.

`SERVICE_DEPLOYMENT_IN_PROGRESS`  
Una implementación de servicios se encuentra en curso. La implementación del servicio puede consistir en una reversión o en una nueva revisión del servicio.

`SERVICE_DEPLOYMENT_COMPLETED`  
Una implementación de servicio se encuentra en estado estable y se ha completado. La implementación del servicio puede consistir en una reversión o en la implementación de una revisión del servicio actualizada.

## Eventos de acciones de servicio con el tipo de evento `WARN`
<a name="ecs_service_events_warn_type"></a>

`SERVICE_TASK_START_IMPAIRED`  
El servicio no puede iniciar sistemáticamente las tareas de forma correcta.

`SERVICE_DISCOVERY_INSTANCE_UNHEALTHY`  
Un servicio que utiliza la detección de servicios contiene una tarea cuyo estado no es correcto. El programador de servicios detecta que el estado de una tarea contenida en el registro no es correcto.

`VPC_LATTICE_TARGET_UNHEALTHY`  
El servicio que utiliza VPC Lattice ha detectado que uno de los destinos de VPC Lattice se encuentra en mal estado.

## Eventos de acciones de servicio con el tipo de evento `ERROR`
<a name="ecs_service_events_error_type"></a>

`SERVICE_DAEMON_PLACEMENT_CONSTRAINT_VIOLATED`  
Una tarea de un servicio que utiliza la estrategia del programador de servicios `DAEMON` ya no cumple la estrategia de delimitación de ubicación para el servicio.

`ECS_OPERATION_THROTTLED`  
El programador de servicios se ha sometido a una limitación controlada debido a los límites de solicitud de la API de Amazon ECS.

`SERVICE_DISCOVERY_OPERATION_THROTTLED`  
El programador de servicios se ha sometido a una limitación controlada debido a los límites de limitación controlada de la API de AWS Cloud Map. Esto puede ocurrir en los servicios configurados para usar la detección de servicios.

`SERVICE_TASK_PLACEMENT_FAILURE`  
El programador de servicios no puede ubicar una tarea. La causa se describe en el campo `reason`.  
Una causa común de que se genere este evento de servicio es la falta de recursos en el clúster para ubicar la tarea. Por ejemplo, no hay suficiente capacidad de CPU o memoria en las instancias de contenedor disponibles o no hay ninguna instancia de contenedor disponible. Otra causa frecuente es cuando el agente de contenedor de Amazon ECS se desconecta en la instancia de contenedor, lo que provoca que el programador no pueda ubicar la tarea.

`SERVICE_TASK_CONFIGURATION_FAILURE`  
El programador de servicios no puede realizar una tarea debido a un error de configuración. La causa se describe en el campo `reason`.  
Una causa común de que se genere este evento de servicio es porque se aplicaban etiquetas al servicio, pero el usuario o rol no había optado por el nuevo formato de nombre de Recurso de Amazon (ARN) en la región. Para obtener más información, consulte [Nombres de recursos de Amazon (ARN) e ID](ecs-account-settings.md#ecs-resource-ids). Otra causa frecuente es que Amazon ECS no podía asumir el rol de IAM de la tarea proporcionado.

`SERVICE_HEALTH_UNKNOWN`  
El servicio no pudo describir los datos de estado de las tareas.

`SERVICE_DEPLOYMENT_FAILED`  
Una implementación de servicio no alcanzó el nivel estable. Esto ocurre cuando se activa una instancia de CloudWatch o el interruptor detecta un error en la implementación del servicio.

**Example Evento de estado estable de servicio**  
Los eventos de estado estable de servicio se entregan en el siguiente formato. Para obtener más información acerca de los parámetros de EventBridge, consulte [Eventos de EventBridge](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-events.html) en la *Guía del usuario de Amazon EventBridge*.  

```
{
    "version": "0",
    "id": "af3c496d-f4a8-65d1-70f4-a69d52e9b584",
    "detail-type": "ECS Service Action",
    "source": "aws.ecs",
    "account": "111122223333",
    "time": "2019-11-19T19:27:22Z",
    "region": "us-west-2",
    "resources": [
        "arn:aws:ecs:us-west-2:111122223333:service/default/servicetest"
    ],
    "detail": {
        "eventType": "INFO",
        "eventName": "SERVICE_STEADY_STATE",
        "clusterArn": "arn:aws:ecs:us-west-2:111122223333:cluster/default",
        "createdAt": "2019-11-19T19:27:22.695Z"
    }
}
```

**Example Evento de estado estable del proveedor de capacidad**  
Los eventos de estado estable del proveedor de capacidad se entregan en el siguiente formato.  

```
{
    "version": "0",
    "id": "b9baa007-2f33-0eb1-5760-0d02a572d81f",
    "detail-type": "ECS Service Action",
    "source": "aws.ecs",
    "account": "111122223333",
    "time": "2019-11-19T19:37:00Z",
    "region": "us-west-2",
    "resources": [
        "arn:aws:ecs:us-west-2:111122223333:service/default/servicetest"
    ],
    "detail": {
        "eventType": "INFO",
        "eventName": "CAPACITY_PROVIDER_STEADY_STATE",
        "clusterArn": "arn:aws:ecs:us-west-2:111122223333:cluster/default",
        "capacityProviderArns": [
            "arn:aws:ecs:us-west-2:111122223333:capacity-provider/ASG-tutorial-capacity-provider"
        ],
        "createdAt": "2019-11-19T19:37:00.807Z"
    }
}
```

**Example Evento deteriorado de inicio de tarea de servicio**  
Los eventos deteriorados de inicio de tarea de servicio se entregan en el siguiente formato.  

```
{
    "version": "0",
    "id": "57c9506e-9d21-294c-d2fe-e8738da7e67d",
    "detail-type": "ECS Service Action",
    "source": "aws.ecs",
    "account": "111122223333",
    "time": "2019-11-19T19:55:38Z",
    "region": "us-west-2",
    "resources": [
        "arn:aws:ecs:us-west-2:111122223333:service/default/servicetest"
    ],
    "detail": {
        "eventType": "WARN",
        "eventName": "SERVICE_TASK_START_IMPAIRED",
        "clusterArn": "arn:aws:ecs:us-west-2:111122223333:cluster/default",
        "createdAt": "2019-11-19T19:55:38.725Z"
    }
}
```

**Example Evento de error de ubicación de tarea de servicio**  
Los eventos de error de ubicación de tarea de servicio se entregan en el siguiente formato. Para obtener más información, consulte [Eventos de EventBridge](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-events.html) en la *Guía del usuario de Amazon EventBridge*.  
En el ejemplo siguiente, la tarea ha intentado utilizar el proveedor de capacidad `FARGATE_SPOT`, pero el programador de servicios no ha podido adquirir ninguna capacidad de Fargate Spot.  

```
{
    "version": "0",
    "id": "ddca6449-b258-46c0-8653-e0e3a6d0468b",
    "detail-type": "ECS Service Action",
    "source": "aws.ecs",
    "account": "111122223333",
    "time": "2019-11-19T19:55:38Z",
    "region": "us-west-2",
    "resources": [
        "arn:aws:ecs:us-west-2:111122223333:service/default/servicetest"
    ],
    "detail": {
        "eventType": "ERROR",
        "eventName": "SERVICE_TASK_PLACEMENT_FAILURE",
        "clusterArn": "arn:aws:ecs:us-west-2:111122223333:cluster/default",
        "capacityProviderArns": [
            "arn:aws:ecs:us-west-2:111122223333:capacity-provider/FARGATE_SPOT"
        ],
        "reason": "RESOURCE:FARGATE",
        "createdAt": "2019-11-06T19:09:33.087Z"
    }
}
```
En el siguiente ejemplo para EC2, se ha intentado lanzar la tarea en la instancia de contenedor `2dd1b186f39845a584488d2ef155c131` pero el programador de servicios no pudo realizar la tarea debido a la insuficiencia de la CPU.  

```
{
  "version": "0",
  "id": "ddca6449-b258-46c0-8653-e0e3a6d0468b",
  "detail-type": "ECS Service Action",
  "source": "aws.ecs",
  "account": "111122223333",
  "time": "2019-11-19T19:55:38Z",
  "region": "us-west-2",
  "resources": [
    "arn:aws:ecs:us-west-2:111122223333:service/default/servicetest"
  ],
  "detail": {
    "eventType": "ERROR",
    "eventName": "SERVICE_TASK_PLACEMENT_FAILURE",
    "clusterArn": "arn:aws:ecs:us-west-2:111122223333:cluster/default",
    "containerInstanceArns": [
    "arn:aws:ecs:us-west-2:111122223333:container-instance/default/2dd1b186f39845a584488d2ef155c131"
    ],
    "reason": "RESOURCE:CPU",
    "createdAt": "2019-11-06T19:09:33.087Z"
  }
}
```

# Eventos de cambio de estado de implementación de servicios de Amazon ECS
<a name="ecs_service_deployment_events"></a>

Amazon ECS envía eventos de cambio de estado de implementación de servicios con el tipo de detalle **ECS Deployment State Change** (Cambio de estado de implementación de ECS). El patrón de eventos siguiente se utiliza para crear una regla de EventBridge para los eventos de cambio de estado de implementación de servicios de Amazon ECS. Para obtener más información acerca de la creación de una regla de EventBridge, consulte [Introducción a Amazon EventBridge](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-get-started.html) en la *Guía del usuario de Amazon EventBridge*.

```
{
    "source": [
        "aws.ecs"
    ],
    "detail-type": [
        "ECS Deployment State Change"
    ]
}
```

Amazon ECS envía eventos con los tipos de eventos `INFO` y `ERROR`. Para obtener más información, consulte [Eventos de acciones de servicio de Amazon ECS](ecs_service_events.md)

A continuación, se incluyen los eventos de cambio de estado de implementación de servicios.

`SERVICE_DEPLOYMENT_IN_PROGRESS`  
La implementación de servicios está en curso. Este evento se envía tanto para implementaciones iniciales como para implementaciones de restauración.

`SERVICE_DEPLOYMENT_COMPLETED`  
Se ha terminado la implementación de servicios. Este evento se envía una vez que un servicio ha alcanzado un estado estable después de una implementación.

`SERVICE_DEPLOYMENT_FAILED`  
Error en la implementación de servicios. Este evento se envía para servicios que tengan habilitada la lógica de interruptor de implementación.

**Example evento de implementación de servicios en curso**  
Los eventos de implementación de servicios en curso se entregan cuando se comienza una implementación inicial y una implementación de restauración. La diferencia entre las dos radica en el campo `reason`. Para obtener más información acerca de los parámetros de EventBridge, consulte [Metadatos de eventos de servicio de AWS](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-events-structure.html) en la *Guía del usuario de Amazon EventBridge*.  
A continuación, se muestra un resultado de ejemplo del comienzo de una implementación inicial.  

```
{
   "version": "0",
   "id": "ddca6449-b258-46c0-8653-e0e3a6EXAMPLE",
   "detail-type": "ECS Deployment State Change",
   "source": "aws.ecs",
   "account": "111122223333",
   "time": "2020-05-23T12:31:14Z",
   "region": "us-west-2",
   "resources": [ 
        "arn:aws:ecs:us-west-2:111122223333:service/default/servicetest"
   ],
   "detail": {
        "eventType": "INFO", 
        "eventName": "SERVICE_DEPLOYMENT_IN_PROGRESS",
        "deploymentId": "ecs-svc/123",
        "updatedAt": "2020-05-23T11:11:11Z",
        "reason": "ECS deployment deploymentId in progress."
   }
}
```
A continuación, se muestra un resultado de ejemplo del comienzo de una implementación de restauración. El campo `reason` proporciona el ID de la implementación a la que se está restaurando el servicio.  

```
{
   "version": "0",
   "id": "ddca6449-b258-46c0-8653-e0e3aEXAMPLE",
   "detail-type": "ECS Deployment State Change",
   "source": "aws.ecs",
   "account": "111122223333",
   "time": "2020-05-23T12:31:14Z",
   "region": "us-west-2",
   "resources": [ 
        "arn:aws:ecs:us-west-2:111122223333:service/default/servicetest"
   ],
   "detail": {
        "eventType": "INFO", 
        "eventName": "SERVICE_DEPLOYMENT_IN_PROGRESS",
        "deploymentId": "ecs-svc/123",
        "updatedAt": "2020-05-23T11:11:11Z",
        "reason": "ECS deployment circuit breaker: rolling back to deploymentId deploymentID."
   }
}
```

**Example evento completado de implementación de servicios**  
Los eventos de estado de implementación de servicio completada se entregan en el siguiente formato. Para obtener más información, consulte [Implementación de los servicios de Amazon ECS mediante el reemplazo de tareas](deployment-type-ecs.md).  

```
{
   "version": "0",
   "id": "ddca6449-b258-46c0-8653-e0e3aEXAMPLE",
   "detail-type": "ECS Deployment State Change",
   "source": "aws.ecs",
   "account": "111122223333",
   "time": "2020-05-23T12:31:14Z",
   "region": "us-west-2",
   "resources": [ 
        "arn:aws:ecs:us-west-2:111122223333:service/default/servicetest"
   ],
   "detail": {
        "eventType": "INFO", 
        "eventName": "SERVICE_DEPLOYMENT_COMPLETED",
        "deploymentId": "ecs-svc/123",
        "updatedAt": "2020-05-23T11:11:11Z",
        "reason": "ECS deployment deploymentID completed."
   }
}
```

**Example Evento de error de implementación de servicios**  
Los eventos de estado de error de implementación de servicio se entregan en el siguiente formato. Solo se enviará un evento de estado de error de implementación de servicio para los servicios que tengan habilitada la lógica del interruptor de implementación. Para obtener más información, consulte [Implementación de los servicios de Amazon ECS mediante el reemplazo de tareas](deployment-type-ecs.md).  

```
{
   "version": "0",
   "id": "ddca6449-b258-46c0-8653-e0e3aEXAMPLE",
   "detail-type": "ECS Deployment State Change",
   "source": "aws.ecs",
   "account": "111122223333",
   "time": "2020-05-23T12:31:14Z",
   "region": "us-west-2",
   "resources": [ 
        "arn:aws:ecs:us-west-2:111122223333:service/default/servicetest"
   ],
   "detail": {
        "eventType": "ERROR", 
        "eventName": "SERVICE_DEPLOYMENT_FAILED",
        "deploymentId": "ecs-svc/123",
        "updatedAt": "2020-05-23T11:11:11Z",
        "reason": "ECS deployment circuit breaker: task failed to start."
   }
}
```

# Control de eventos de Amazon ECS
<a name="ecs_cwet_handling"></a>

Amazon ECS envía los eventos siguiendo el criterio *al menos una vez*. Esto significa que podría recibir varias copias de un evento determinado. Además, los eventos podrían no entregarse a los escuchas de evento en el orden en que ocurrieron los eventos.

Para permitir un orden correcto de eventos, la sección `detail` de cada evento contiene una propiedad `version`. Cada vez que un recurso cambia de estado, se incrementa esta `version`. Los eventos duplicados tienen la misma `version` en el objeto `detail`. Si está replicando la instancia de contenedor de Amazon ECS y el estado de tarea con EventBridge, puede comparar la versión de un recurso notificado por las API de Amazon ECS con la `version` notificada en EventBridge para que el recurso verifique que la versión en su secuencia de eventos sea actual. Los eventos con un número de propiedad de versión más alto se deberían tratar como que han ocurrido más tarde que los eventos con números de versión más bajos.

## Ejemplo: Control de eventos en una función de AWS Lambda
<a name="ecs_cwet_handling_example"></a>

El ejemplo siguiente muestra una función de Lambda escrita en Python 3.9 que captura los eventos de cambio de estado de instancia de contenedor y de tarea y los guarda en una de estas dos tablas de Amazon DynamoDB:
+ *ECSCtrInstanceState*: almacena el estado más reciente de una instancia de contenedor. El ID de tabla es el valor `containerInstanceArn` de la instancia de contenedor.
+ *ECSTaskState* almacena el estado más reciente de una tarea. El ID de tabla es el valor `taskArn` de la tarea.

```
import json
import boto3

def lambda_handler(event, context):
    id_name = ""
    new_record = {}

    # For debugging so you can see raw event format.
    print('Here is the event:')
    print((json.dumps(event)))

    if event["source"] != "aws.ecs":
       raise ValueError("Function only supports input from events with a source type of: aws.ecs")

    # Switch on task/container events.
    table_name = ""
    if event["detail-type"] == "ECS Task State Change":
        table_name = "ECSTaskState"
        id_name = "taskArn"
        event_id = event["detail"]["taskArn"]
    elif event["detail-type"] == "ECS Container Instance State Change":
        table_name = "ECSCtrInstanceState"
        id_name =  "containerInstanceArn"
        event_id = event["detail"]["containerInstanceArn"]
    else:
        raise ValueError("detail-type for event is not a supported type. Exiting without saving event.")

    new_record["cw_version"] = event["version"]
    new_record.update(event["detail"])

    # "status" is a reserved word in DDB, but it appears in containerPort
    # state change messages.
    if "status" in event:
        new_record["current_status"] = event["status"]
        new_record.pop("status")


    # Look first to see if you have received a newer version of an event ID.
    # If the version is OLDER than what you have on file, do not process it.
    # Otherwise, update the associated record with this latest information.
    print("Looking for recent event with same ID...")
    dynamodb = boto3.resource("dynamodb", region_name="us-east-1")
    table = dynamodb.Table(table_name)
    saved_event = table.get_item(
        Key={
            id_name : event_id
        }
    )
    if "Item" in saved_event:
        # Compare events and reconcile.
        print(("EXISTING EVENT DETECTED: Id " + event_id + " - reconciling"))
        if saved_event["Item"]["version"] < event["detail"]["version"]:
            print("Received event is a more recent version than the stored event - updating")
            table.put_item(
                Item=new_record
            )
        else:
            print("Received event is an older version than the stored event - ignoring")
    else:
        print(("Saving new event - ID " + event_id))

        table.put_item(
            Item=new_record
        )
```

El ejemplo siguiente de Fargate muestra una función de Lambda escrita en Python 3.9 que captura los eventos de cambio de estado de tarea y los guarda en la siguiente tabla de Amazon DynamoDB:

```
import json
import boto3

def lambda_handler(event, context):
    id_name = ""
    new_record = {}

    # For debugging so you can see raw event format.
    print('Here is the event:')
    print((json.dumps(event)))

    if event["source"] != "aws.ecs":
       raise ValueError("Function only supports input from events with a source type of: aws.ecs")

    # Switch on task/container events.
    table_name = ""
    if event["detail-type"] == "ECS Task State Change":
        table_name = "ECSTaskState"
        id_name = "taskArn"
        event_id = event["detail"]["taskArn"]
    else:
        raise ValueError("detail-type for event is not a supported type. Exiting without saving event.")

    new_record["cw_version"] = event["version"]
    new_record.update(event["detail"])

    # "status" is a reserved word in DDB, but it appears in containerPort
    # state change messages.
    if "status" in event:
        new_record["current_status"] = event["status"]
        new_record.pop("status")


    # Look first to see if you have received a newer version of an event ID.
    # If the version is OLDER than what you have on file, do not process it.
    # Otherwise, update the associated record with this latest information.
    print("Looking for recent event with same ID...")
    dynamodb = boto3.resource("dynamodb", region_name="us-east-1")
    table = dynamodb.Table(table_name)
    saved_event = table.get_item(
        Key={
            id_name : event_id
        }
    )
    if "Item" in saved_event:
        # Compare events and reconcile.
        print(("EXISTING EVENT DETECTED: Id " + event_id + " - reconciling"))
        if saved_event["Item"]["version"] < event["detail"]["version"]:
            print("Received event is a more recent version than the stored event - updating")
            table.put_item(
                Item=new_record
            )
        else:
            print("Received event is an older version than the stored event - ignoring")
    else:
        print(("Saving new event - ID " + event_id))

        table.put_item(
            Item=new_record
        )
```