

# EventBridge를 사용하여 Amazon ECS 오류에 대한 응답 자동화
<a name="cloudwatch_event_stream"></a>

Amazon EventBridge를 사용하면 AWS 서비스를 자동화하고 애플리케이션 가용성 문제나 리소스 변경 같은 시스템 이벤트에 자동으로 대응할 수 있습니다. AWS 서비스의 이벤트는 거의 실시간으로 EventBridge로 전송됩니다. 원하는 이벤트만 표시하도록 간단한 규칙을 작성한 후 규칙과 일치하는 이벤트 발생 시 실행할 자동화 태스크를 지정할 수 있습니다. 자동으로 구성할 수 있는 태스크는 다음과 같습니다.
+ CloudWatch Logs의 로그 그룹에 이벤트 추가
+ AWS Lambda 함수 호출
+ Amazon EC2 Run Command 호출
+ Amazon Kinesis Data Streams로 이벤트 릴레이
+ AWS Step Functions 상태 머신 활성화
+ Amazon SNS 주제 또는 Amazon Simple Queue Service(Amazon SQS) 대기열에 알림

자세한 내용은 *Amazon EventBridge 사용 설명서*의 [Amazon EventBridge 시작하기](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-get-started.html)를 참조하세요.

EventBridge용 Amazon ECS 이벤트를 사용하여 Amazon ECS 클러스터의 현재 상태에 관해 실시간에 가까운 알림을 받을 수 있습니다. 태스크에서 EC2를 사용 중인 경우, 컨테이너 인스턴스의 상태와 해당 컨테이너 인스턴스에서 실행되는 모든 태스크의 현재 상태를 모두 확인할 수 있습니다. 태스크에서 Fargate를 사용하는 경우 컨테이너 인스턴스 상태를 볼 수 있습니다.

EventBridge를 사용하여 클러스터 간 작업 조정을 수행하고 클러스터의 상태를 거의 실시간으로 모니터링하는 Amazon ECS에서 사용자 지정 스케줄러를 빌드할 수 있습니다. Amazon ECS 서비스에서 상태 변경을 지속적으로 폴링하는 예약 및 모니터링 코드를 생략하고, 대신 EventBridge 대상을 사용하여 Amazon ECS 상태 변경을 비동기적으로 처리할 수 있습니다. 대상은 AWS Lambda, Amazon Simple Queue Service, Amazon Simple Notification Service 또는 Amazon Kinesis Data Streams를 포함할 수 있습니다.

Amazon ECS 이벤트 스트림은 모든 이벤트를 한 번 이상 전달합니다. 중복 이벤트가 전송되는 경우, 해당 이벤트는 중복을 식별하기에 충분한 정보를 제공합니다. 자세한 정보는 [Amazon ECS 이벤트 처리](ecs_cwet_handling.md) 섹션을 참조하세요.

이벤트는 상대적으로 순서가 지정되므로 한 이벤트가 다른 이벤트보다 빨리 또는 늦게 발생했는지 쉽게 알 수 있습니다.

**Topics**
+ [Amazon ECS 이벤트](ecs_cwe_events.md)
+ [Amazon ECS 이벤트 처리](ecs_cwet_handling.md)

# Amazon ECS 이벤트
<a name="ecs_cwe_events"></a>

Amazon ECS는 각 작업 및 서비스의 상태를 추적합니다. 작업 또는 서비스 상태가 변경되면 이벤트가 생성되고 Amazon EventBridge로 전달됩니다. 이러한 이벤트는 작업 상태 변경 이벤트 및 서비스 작업 이벤트로 분류됩니다. 다음 섹션에서 이러한 이벤트 및 가능한 원인을 보다 자세하게 설명합니다.

Amazon ECS는 다음과 같은 유형의 이벤트를 생성하여 EventBridge로 전송합니다.
+ 컨테이너 인스턴스 상태 변경
+ 작업 상태 변경
+ 배포 상태 변경
+ 서비스 작업

**참고**  
향후 Amazon ECS가 다른 이벤트 유형, 소스 및 세부 정보를 추가할 수 있습니다. 코드의 이벤트 JSON 데이터를 역직렬화하는 경우 추가 속성이 추가되었을 때 문제를 방지하기 위해 애플리케이션이 알 수 없는 속성을 처리할 수 있도록 준비해야 합니다.

경우에 따라 동일한 활동에 대해 복수의 이벤트가 생성됩니다. 예를 들어 작업이 컨테이너 인스턴스에서 시작되면 새 작업에 대해 작업 상태 변경 이벤트가 생성됩니다. 컨테이너 인스턴스의 가용 리소스(예: CPU, 메모리 및 가용 포트)의 변동을 설명하기 위해 컨테이너 인스턴스 상태 변경 이벤트가 생성됩니다. 또한 컨테이너 인스턴스가 종료될 때도 컨테이너 인스턴스, 컨테이너 에이전트 연결 상태 및 해당 컨테이너 인스턴스에서 실행되는 모든 작업에 대해 이벤트가 생성됩니다.

컨테이너 상태 변경 및 작업 상태 변경 이벤트에는 두 개의 `version` 필드가 있습니다. 하나는 이벤트의 기본 본문에 있고 다른 하나는 이벤트의 `detail` 객체에 있습니다. 다음은 이러한 두 필드 간의 차이점에 대해 설명합니다.
+ 이벤트의 본문 내 `version` 필드는 모든 이벤트에서 `0`으로 설정됩니다. Eventbridge 파라미터에 대한 자세한 내용은 *Amazon EventBridge 사용 설명서*의 [AWS 서비스 이벤트 메타데이터](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-events-structure.html)를 참조하세요.
+ 이벤트의 `detail` 객체 내 `version` 필드는 연결된 리소스의 버전을 설명합니다. 리소스 상태가 바뀔 때마다 이 버전이 증가합니다. 이벤트를 여러 번 보낼 수 있으므로 이 필드를 사용하여 중복 이벤트를 식별할 수 있습니다. 중복 이벤트는 `detail` 객체에서 동일한 버전을 갖습니다. EventBridge를 사용하여 Amazon ECS 컨테이너 인스턴스 및 작업 상태를 복제하는 경우, Amazon ECS API에서 보고된 리소스 버전과 리소스(`detail` 객체 내부)에 대해 EventBridge에서 보고된 버전을 비교하여 이벤트 스트림 버전이 최신임을 확인할 수 있습니다.

서비스 작업 이벤트는 본문의 `version` 필드만 포함합니다.

서비스 작업 이벤트는 2개의 필드에서 서비스를 지정합니다.
+ `create-service`에서 생성된 이벤트의 경우 서비스는 `serviceName` 필드에 있습니다.
+ `update-service`에서 생성된 이벤트의 경우 서비스는 `service` 필드에 있습니다.

서비스 이벤트에 자동 도구를 사용하는 경우 두 필드 모두에 대해 코드를 지정해야 합니다.

서비스 작업 이벤트에 대한 규칙을 생성하는 방법에 대한 자세한 내용은 [Amazon ECS 서비스 작업 이벤트](ecs_service_events.md) 섹션을 참조하세요.

Amazon ECS 및 EventBridge를 통합하는 방법에 대한 자세한 내용은 [Amazon EventBridge 및 Amazon ECS 통합](https://aws.amazon.com/blogs/compute/integrating-amazon-eventbridge-and-amazon-ecs/)을 참조하세요.

# Amazon ECS 컨테이너 인스턴스 상태 변경 이벤트
<a name="ecs_container_instance_events"></a>

다음과 같은 상황에서 컨테이너 인스턴스 상태 변경 이벤트가 발생합니다.

직접 또는 `StartTask`이나 SDK를 사용하여 `RunTask`, `StopTask` 또는 AWS Management Console API 태스크를 호출합니다.  
컨테이너 인스턴스에서 태스크를 배치 또는 중지하면 컨테이너 인스턴스의 가용 리소스(예: CPU, 메모리, 가용 포트)가 수정됩니다.

Amazon ECS 서비스 스케줄러가 태스크를 시작 또는 중지하는 경우  
컨테이너 인스턴스에서 태스크를 배치 또는 중지하면 컨테이너 인스턴스의 가용 리소스(예: CPU, 메모리, 가용 포트)가 수정됩니다.

Amazon ECS 컨테이너 에이전트가 원하는 작업 상태 `RUNNING`의 작업에 대해 `STOPPED` 상태의 `SubmitTaskStateChange` API 태스크를 호출하는 경우  
Amazon ECS 컨테이너 에이전트는 컨테이너 인스턴스에서 작업 상태를 모니터링하며 모든 상태 변경을 보고합니다. `RUNNING` 상태여야 할 작업이 `STOPPED` 상태로 전환될 경우 에이전트가 중지한 작업에 할당된 리소스(예: CPU, 메모리, 가용 포트)를 해제합니다.

직접 또는 `DeregisterContainerInstance`이나 SDK를 사용하여 AWS Management Console API 태스크를 사용하여 컨테이너 인스턴스를 등록 해제합니다.  
컨테이너 인스턴스를 등록 해제하면 해당 컨테이너 인스턴스의 상태와 Amazon ECS 컨테이너 에이전트의 연결 상태가 변경됩니다.

EC2 인스턴스를 중지했을 때 작업이 중지된 경우   
컨테이너 인스턴스를 중지하면 해당 컨테이너 인스턴스에서 실행 중이던 작업이 `STOPPED` 상태로 전환됩니다.

Amazon ECS 컨테이너 에이전트가 컨테이너 인스턴스를 처음 등록하는 경우   
Amazon ECS 컨테이너가 처음 컨테이너 인스턴스를 등록하면(시작 시 또는 수동으로 처음 실행할 때) 해당 인스턴스에 대해 상태 변경 이벤트가 생성됩니다.

Amazon ECS 컨테이너 에이전트가 Amazon ECS를 연결하거나 연결을 해제하는 경우  
Amazon ECS 컨테이너 에이전트가 Amazon ECS 백엔드에 연결되거나 연결이 해제되면 컨테이너 인스턴스의 `agentConnected` 상태가 변경됩니다.  
Amazon ECS 컨테이너 에이전트는 정상 작업의 일부로 시간당 여러 번 연결 해제와 재연결을 반복하므로 에이전트 연결 이벤트가 예상됩니다. 이러한 이벤트가 컨테이너 에이전트 또는 컨테이너 인스턴스에 문제가 있음을 나타내는 것은 아닙니다.

사용자가 인스턴스에서 Amazon ECS 컨테이너 에이전트를 업그레이드하는 경우  
컨테이너 인스턴스 세부 정보에는 컨테이너 에이전트 버전 개체가 포함됩니다. 에이전트를 업그레이드하면 이 버전 정보가 변경되고 이벤트가 발생합니다.

**Example 컨테이너 인스턴스 상태 변경 이벤트**  
컨테이너 인스턴스 상태 변경 이벤트는 다음 형식으로 전달됩니다. 다음 `detail` 섹션은 *Amazon Elastic 컨테이너 서비스 API 참조*의 [DescribeContainerInstances](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_DescribeContainerInstances.html) API 작업에서 반환되는 [ContainerInstance](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_ContainerInstance.html) 객체와 유사합니다. Eventbridge 파라미터에 대한 자세한 내용은 *Amazon EventBridge 사용 설명서*의 [AWS 서비스 이벤트 메타데이터](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-events-structure.html)를 참조하세요.  

```
{
  "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"
  }
}
```

# Amazon ECS 작업 상태 변경 이벤트
<a name="ecs_task_events"></a>

다음과 같은 상황에서 작업 상태 변경 이벤트가 발생합니다.

직접 또는 AWS Management Console, AWS CLI나 SDK를 사용하여 `StartTask`, `RunTask` 또는 `StopTask` API 태스크를 호출합니다.  
태스크를 시작 또는 중지하면 새로운 작업 리소스가 생기거나 기존 작업 리소스의 상태가 수정됩니다.

Amazon ECS 서비스 스케줄러가 태스크를 시작 또는 중지하는 경우  
태스크를 시작 또는 중지하면 새로운 작업 리소스가 생기거나 기존 작업 리소스의 상태가 수정됩니다.

Amazon ECS 컨테이너 에이전트가 `SubmitTaskStateChange` API 태스크를 호출하는 경우  
EC2의 경우 Amazon ECS 컨테이너 에이전트는 컨테이너 인스턴스에서 작업 상태를 모니터링합니다. Amazon ECS 컨테이너 에이전트는 모든 상태 변경을 보고합니다. 상태 변경에는 `PENDING`에서 `RUNNING`으로 또는 `RUNNING`에서 `STOPPED`로의 변경이 포함될 수 있습니다.

직접 또는 AWS Management Console이나 SDK를 통해 `DeregisterContainerInstance` API 태스크와 `force` 플래그를 사용하여 기본 컨테이너 인스턴스를 강제로 등록 해제합니다.  
컨테이너 인스턴스를 등록 해제하면 해당 컨테이너 인스턴스의 상태와 Amazon ECS 컨테이너 에이전트의 연결 상태가 변경됩니다. 컨테이너 인스턴스에서 작업이 실행 중인 경우 등록을 해제하려면 `force` 플래그가 설정되어야 합니다. 그러면 인스턴스에서 모든 작업이 중지합니다.

기본 컨테이너 인스턴스가 중지 또는 종료되는 경우  
컨테이너 인스턴스를 중지 또는 종료하면 해당 컨테이너 인스턴스에서 실행 중이던 작업이 `STOPPED` 상태로 전환됩니다.

작업 내 컨테이너의 상태가 변경되는 경우  
Amazon ECS 컨테이너 에이전트는 작업 내 컨테이너의 상태를 모니터링합니다. 예를 들어 작업에서 실행 중인 컨테이너가 중지하는 경우 이 컨테이너 상태 변경은 이벤트를 발생시킵니다.

Fargate 스팟 용량 공급자를 사용하는 태스크는 종료 공지를 받습니다.  
작업이 `FARGATE_SPOT` 용량 공급자를 사용 중이고 스팟 중단으로 인해 중지되면 작업 상태 변경 이벤트가 발생시킵니다.

**Example 작업 상태 변경 이벤트**  
작업 상태 변경 이벤트는 다음 형식으로 제공됩니다. 다음은 이러한 필드에 대한 유의 사항입니다.  
+ 태스크 상태 변경 이벤트에서 이벤트의 상태를 사용할 수 없습니다. 태스크 상태가 필요한 경우 [describe-tasks](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_DescribeTasks.html)를 실행할 수 있습니다.
+ 컨테이너에서 Amazon ECR로 호스팅되는 이미지를 사용하는 경우 `imageDigest` 필드가 반환됩니다.
+ `createdAt`, `connectivityAt`, `pullStartedAt`, `startedAt`, `pullStoppedAt` 및 `updatedAt` 필드의 값은 ISO 문자열 타임스탬프입니다.
+ `detail-type` 값은 ‘ECS 태스크 상태 변경’입니다.
+ 중지된 태스크에 대해 이벤트가 생성되면 `stoppedReason` 및 `stopCode` 필드는 태스크가 중지된 이유에 대한 추가 정보를 제공합니다(예: ‘사용자 시작’).
Eventbridge 파라미터에 대한 자세한 내용은 *Amazon EventBridge 이벤트 참조*의 [AWS 서비스 이벤트 메타데이터](https://docs.aws.amazon.com/eventbridge/latest/ref/events-structure.html)를 참조하세요.  
필수 컨테이너 중 하나가 종료되어 태스크 실행이 중지된 태스크 이벤트만 캡처하는 Amazon EventBridge 이벤트 규칙을 구성하는 방법에 대한 자세한 내용은 [Amazon ECS 작업 중지 이벤트에 대한 Amazon Simple Notification Service 알림 보내기](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**  
다음은 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
    }
}
```

# Amazon ECS 서비스 작업 이벤트
<a name="ecs_service_events"></a>

Amazon ECS는 세부 정보 유형 **ECS 서비스 태스크와** 함께 서비스 작업 이벤트를 보냅니다. 컨테이너 인스턴스 및 작업 상태 변경 이벤트와 달리 서비스 작업 이벤트는 `details` 응답 필드에 버전 번호를 포함하지 않습니다. 다음은 Amazon ECS 서비스 작업 이벤트에 대한 EventBridge 규칙을 만드는 데 사용되는 이벤트 패턴입니다. 자세한 내용은 *Amazon EventBridge 사용 설명서*의 [Amazon EventBridge 시작하기](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-get-started.html)를 참조하세요.

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

Amazon ECS는 `INFO`, `WARN` 및 `ERROR`이벤트 유형과 함께 이벤트를 보냅니다. 다음은 서비스 작업 이벤트입니다.

## `INFO` 이벤트 유형이 있는 서비스 작업 이벤트
<a name="ecs_service_events_info_type"></a>

`SERVICE_STEADY_STATE`  
이 서비스는 건강하고 원하는 수의 작업으로 안정적인 상태에 도달합니다. 서비스 스케줄러는 주기적으로 상태를 보고하므로 이 메시지를 여러 번 받을 수 있습니다.

`TASKSET_STEADY_STATE`  
작업 세트는 건강하고 원하는 수의 작업으로 안정적인 상태에 도달합니다.

`CAPACITY_PROVIDER_STEADY_STATE`  
서비스와 관련된 용량 공급자가 안정적인 상태에 도달합니다.

`SERVICE_DESIRED_COUNT_UPDATED`  
서비스 스케줄러가 서비스 또는 작업 세트에 대해 계산된 원하는 수를 업데이트하는 경우. 사용자가 원하는 수를 수동으로 업데이트하면 이 이벤트가 전송되지 않습니다.

`TASKS_STOPPED`  
실행 중인 태스크가 서비스에서 중지되었습니다.

`SERVICE_DEPLOYMENT_IN_PROGRESS`  
서비스 배포가 진행 중입니다. 서비스 배포가 롤백 또는 새 서비스 개정일 수 있습니다.

`SERVICE_DEPLOYMENT_COMPLETED`  
서비스 배포가 안정 상태이고 완료되었습니다. 서비스 배포가 롤백이거나 업데이트된 서비스 개정을 배포하는 것일 수 있습니다.

## `WARN` 이벤트 유형이 있는 서비스 작업 이벤트
<a name="ecs_service_events_warn_type"></a>

`SERVICE_TASK_START_IMPAIRED`  
서비스가 일부 태스크를 시작할 수 없습니다.

`SERVICE_DISCOVERY_INSTANCE_UNHEALTHY`  
서비스 검색을 사용하는 서비스에 비정상 작업이 포함되어 있습니다. 서비스 스케줄러는 서비스 레지스트리 내의 작업이 비정상임을 감지합니다.

`VPC_LATTICE_TARGET_UNHEALTHY`  
VPC Lattice가 사용되는 서비스에서 VPC Lattice의 대상 중 하나가 비정상이라는 것이 탐지되었습니다.

## `ERROR` 이벤트 유형이 있는 서비스 작업 이벤트
<a name="ecs_service_events_error_type"></a>

`SERVICE_DAEMON_PLACEMENT_CONSTRAINT_VIOLATED`  
`DAEMON` 서비스 스케줄러 전략을 사용하는 서비스의 작업이 더 이상 서비스에 대한 배치 제약 전략을 충족하지 않습니다.

`ECS_OPERATION_THROTTLED`  
Amazon ECS API 스로틀 한도로 인해 서비스 스케줄러가 제한되었습니다.

`SERVICE_DISCOVERY_OPERATION_THROTTLED`  
AWS Cloud Map API 스로틀 한도로 인해 서비스 스케줄러가 제한되었습니다. 이 문제는 서비스 검색을 사용하도록 구성된 서비스에서 발생할 수 있습니다.

`SERVICE_TASK_PLACEMENT_FAILURE`  
서비스 스케줄러가 태스크를 배치할 수 없습니다. 원인은 `reason` 필드에 설명됩니다.  
이 서비스 이벤트가 발생하는 일반적인 원인은 태스크를 배치할 클러스터의 리소스가 부족하기 때문입니다. 예를 들어 사용 가능한 컨테이너 인스턴스의 CPU 또는 메모리 용량이 충분하지 않거나 사용 가능한 컨테이너 인스턴스가 없는 경우입니다. 또 다른 일반적인 원인은 Amazon ECS 컨테이너 에이전트가 컨테이너 인스턴스에서 연결 해제되어 스케줄러가 태스크를 배치 할 수 없는 경우입니다.

`SERVICE_TASK_CONFIGURATION_FAILURE`  
서비스 스케줄러가 구성 오류로 인해 태스크를 배치할 수 없습니다. 원인은 `reason` 필드에 설명됩니다.  
이 서비스 이벤트가 발생하는 일반적인 원인은 태그가 서비스에 적용되었지만 사용자 또는 역할이 해당 리전의 새로운 Amazon 리소스 이름(ARN) 형식을 선택하지 않았기 때문입니다. 자세한 정보는 [Amazon 리소스 이름(ARN) 및 ID](ecs-account-settings.md#ecs-resource-ids)을 참조하세요. 또 다른 일반적인 원인은 제공된 작업 IAM 역할을 Amazon ECS가 맡을 수 없기 때문입니다.

`SERVICE_HEALTH_UNKNOWN`  
서비스에서 태스크의 상태 데이터가 설명되지 못했습니다.

`SERVICE_DEPLOYMENT_FAILED`  
서비스 배포가 안정에 도달하지 않았습니다. 이는 CloudWatch가 트리거되거나 회로 차단기에서 서비스 배포 실패가 탐지되면 발생합니다.

**Example 서비스 안정 상태 이벤트**  
서비스 안정 상태 이벤트는 다음과 같은 형식으로 제공됩니다. EventBridge 파라미터에 대한 자세한 내용은 *Amazon EventBridge 사용 설명서*의 [EventBridge의 이벤트](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-events.html)를 참조하세요.  

```
{
    "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 용량 공급자 안정 상태 이벤트**  
용량 공급자 안정 상태 이벤트는 다음 형식으로 제공됩니다.  

```
{
    "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 서비스 작업 시작 장애 이벤트**  
서비스 작업 시작 장애 이벤트는 다음 형식으로 제공됩니다.  

```
{
    "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 서비스 작업 배치 실패 이벤트**  
서비스 작업 배치 실패 이벤트는 다음 형식으로 제공됩니다. 자세한 내용은 *Amazon EventBridge 사용 설명서*의 [Amazon EventBridge 이벤트](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-events.html)를 참조하세요.  
다음 예제에서는 작업이 `FARGATE_SPOT` 용량 공급자를 사용하려고 시도했지만 서비스 스케줄러가 Fargate 스팟 용량을 획득할 수 없습니다.  

```
{
    "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"
    }
}
```
EC2 시작 유형에 대한 다음 예제에서는 컨테이너 인스턴스 `2dd1b186f39845a584488d2ef155c131`에서 태스크를 시작하려고 했지만 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"
  }
}
```

# Amazon ECS 서비스 배포 상태 변경 이벤트
<a name="ecs_service_deployment_events"></a>

Amazon ECS는 세부 정보 유형 **ECS 배포 상태 변경**과 함께 서비스 배포 변경 상태 이벤트를 보냅니다. 다음은 Amazon ECS 서비스 배포 상태 변경 이벤트에 대한 EventBridge 규칙을 만드는 데 사용되는 이벤트 패턴입니다. EventBridge 규칙 생성에 대한 자세한 내용은 *Amazon EventBridge 사용 설명서*의 [Amazon EventBridge 시작하기](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-get-started.html)를 참조하세요.

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

Amazon ECS는 `INFO` 및 `ERROR` 이벤트 유형과 함께 이벤트를 보냅니다. 자세한 내용은 [Amazon ECS 서비스 작업 이벤트](ecs_service_events.md) 섹션을 참조하세요.

서비스 배포 상태 변경 이벤트는 다음과 같습니다.

`SERVICE_DEPLOYMENT_IN_PROGRESS`  
서비스 배포가 진행 중입니다. 이 이벤트는 초기 배포 및 롤백 배포 모두에 대해 전송됩니다.

`SERVICE_DEPLOYMENT_COMPLETED`  
서비스 배포가 완료되었습니다. 배포 후 서비스가 안정적인 상태에 도달하면 이 이벤트가 전송됩니다.

`SERVICE_DEPLOYMENT_FAILED`  
서비스 배포가 실패했습니다. 이 이벤트는 배포 회로 차단기 논리가 켜진 서비스에 대해 전송됩니다.

**Example 서비스 배포 진행 중 이벤트**  
서비스 배포 진행 중 이벤트는 초기 배포와 롤백 배포가 모두 시작될 때 전달됩니다. 두 항목의 차이점은 `reason` 필드에 있습니다. Eventbridge 파라미터에 대한 자세한 내용은 *Amazon EventBridge 사용 설명서*의 [AWS 서비스 이벤트 메타데이터](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-events-structure.html)를 참조하세요.  
다음은 초기 배포가 시작되는 경우의 출력 예입니다.  

```
{
   "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."
   }
}
```
다음은 롤백 배포가 시작되는 경우의 출력 예입니다. `reason` 필드는 서비스가 롤백되는 배포의 ID를 제공합니다.  

```
{
   "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 서비스 배포 완료 이벤트**  
서비스 배포 완료 상태 이벤트는 다음과 같은 형식으로 제공됩니다. 자세한 정보는 [태스크를 대체하여 Amazon ECS 서비스 배포](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 서비스 배포 실패 이벤트**  
서비스 배포 실패 상태 이벤트는 다음과 같은 형식으로 제공됩니다. 서비스 배포 실패 상태 이벤트는 배포 회로 차단기 논리가 켜진 서비스에 대해서만 전송됩니다. 자세한 내용은 [태스크를 대체하여 Amazon ECS 서비스 배포](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."
   }
}
```

# Amazon ECS 이벤트 처리
<a name="ecs_cwet_handling"></a>

Amazon ECS는 이벤트를 *한 번 이상* 전송합니다. 즉, 지정된 이벤트의 복사본을 여러 개 받을 수 있습니다. 또한 이벤트가 이벤트 발생 순서대로 이벤트 리스너에게 전달되지 않을 수 있습니다.

이벤트 순서가 적절히 지정될 수 있도록 각 이벤트의 `detail` 섹션에 `version` 속성이 포함됩니다. 리소스 상태가 변경될 때마다 이 `version`이 증가합니다. 중복 이벤트는 `detail` 객체에서 동일한 `version`을 갖습니다. EventBridge를 사용하여 Amazon ECS 컨테이너 인스턴스 및 작업 상태를 복제하는 경우, Amazon ECS API에서 보고된 리소스 버전과 리소스에 대해 EventBridge에서 보고된 `version`을 비교하여 이벤트 스트림 버전이 최신임을 확인할 수 있습니다. 버전 속성 번호가 높은 이벤트는 낮은 버전 번호의 이벤트보다 나중에 발생한 것으로 처리해야 합니다.

## 예제: AWS Lambda 함수에서 이벤트 처리
<a name="ecs_cwet_handling_example"></a>

다음 예제는 Python 3.9로 작성된 Lambda 함수로서, 작업과 컨테이너 인스턴스 상태 변경 이벤트를 모두 캡처하여 두 개의 Amazon DynamoDB 테이블 중 하나에 저장합니다.
+ *ECSCtrInstanceState* – 컨테이너 인스턴스의 최신 상태를 저장합니다. 테이블 ID는 컨테이너 인스턴스의 `containerInstanceArn` 값입니다.
+ *ECSTaskState* – 작업의 최신 상태를 저장합니다. 테이블 ID는 작업의 `taskArn` 값입니다.

```
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
        )
```

다음 Fargate 예제는 Python 3.9로 작성된 Lambda 함수로, 작업 상태 변경 이벤트를 캡처하여 다음 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
        )
```