

# 使用 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 Events](ecs_cwe_events.md)
+ [处理 Amazon ECS 事件](ecs_cwet_handling.md)

# Amazon ECS Events
<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 service event metadata](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-events-structure.html)。
+ 事件的 `detail` 对象中的 `version` 字段描述了关联资源的版本。当资源状态发生更改时，此版本会递增。由于可多次发送事件，因此您可以使用该字段来确定重复事件。重复事件在 `detail` 对象中具有相同版本。如果您用 EventBridge 复制 Amazon ECS 容器实例和任务状态，则可比较 Amazon ECS API 所报告的资源版本与资源的 EventBridge 事件中报告的版本（在 `detail` 对象中），以便验证事件流中的版本是否为最新版本。

服务操作事件仅包含主体中的 `version` 字段。

服务操作事件会在 2 个不同的字段中指定服务：
+ 对于 `create-service` 由生成的事件，将在 `serviceName` 字段中指定该服务。
+ 对于 `update-service` 由生成的事件，将在 `service` 字段中指定该服务。

如果使用自动化工具处理服务事件，则需要为这两个字段编写代码。

有关如何为服务操作事件创建规则的信息，请参阅 [Amazon ECS 服务操作事件](ecs_service_events.md)。

有关如何集成 Amazon ECS 和 EventBridge 的更多信息，请参阅 [Integrating Amazon EventBridge and Amazon ECS](https://aws.amazon.com/blogs/compute/integrating-amazon-eventbridge-and-amazon-ecs/)（集成 Amazon EventBridge 和 Amazon ECS）。

# Amazon ECS 容器实例状态更改事件
<a name="ecs_container_instance_events"></a>

以下方案将引起容器实例状态更改事件：

您调用 `StartTask`、`RunTask` 或 `StopTask` API 操作（直接调用，或者通过 AWS 管理控制台或开发工具包调用）。  
在容器实例上放置或停止任务将修改容器实例上的可用资源（例如 CPU、内存和可用端口）。

Amazon ECS 服务调度器启动或停止任务。  
在容器实例上放置或停止任务将修改容器实例上的可用资源（例如 CPU、内存和可用端口）。

针对状态为 `RUNNING` 的任务，Amazon ECS 容器代理调用状态为 `STOPPED` 的 `SubmitTaskStateChange` API 操作。  
Amazon ECS 容器代理监控容器实例上的任务状态，并报告任何状态更改。如果应为 `STOPPED` 的任务转换为 `RUNNING`，则代理将释放分配给已停止任务的资源（例如 CPU、内存和可用端口）。

您可以使用 `DeregisterContainerInstance` API 操作（直接调用，或者通过 AWS 管理控制台或开发工具包调用）注销容器实例。  
注销容器实例将更改容器实例的状态以及 Amazon ECS 容器代理的连接状态。

EC2 实例停止后，任务也停止。  
在停止容器实例时，该实例上运行的任务会转换为 `STOPPED` 状态。

Amazon ECS 容器代理首次注册容器实例。  
当 Amazon ECS 容器代理首次注册容器实例（在启动时注册，或者在首次运行时手动注册）时，将为实例创建状态更改事件。

Amazon ECS Container 代理与 Amazon ECS 连接或断开连接。  
当 Amazon ECS 容器代理与 Amazon ECS 后端连接或断开连接时，将更改容器实例的 `agentConnected` 状态。  
Amazon ECS 容器代理每小时断开连接并重新连接多次，这是其正常操作的一部分，因此代理连接事件应该是可以预期的。这些事件并不表示容器代理或容器实例存在问题。

升级实例上的 Amazon ECS 容器代理。  
容器实例详细信息包含容器代理版本的对象。如果您升级代理，此版本信息将发生更改并且将生成事件。

**Example 容器实例状态更改事件**  
容器实例状态更改事件以下面的形式传送。下面的 `detail` 部分类似于从 *Amazon Elastic Container Service 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 service event metadata](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>

以下方案将引起任务状态更改事件：

您调用 `StartTask`、`RunTask` 或 `StopTask` API 操作（直接调用，或者通过 AWS 管理控制台、AWS CLI 或开发工具包调用）。  
启动或停止任务将创建新的任务资源或修改现有任务资源的状态。

Amazon ECS 服务调度器启动或停止任务。  
启动或停止任务将创建新的任务资源或修改现有任务资源的状态。

Amazon ECS 容器代理调用 `SubmitTaskStateChange` API 操作。  
对于 EC2，Amazon ECS 容器代理将监控容器实例上的任务的状态。Amazon ECS 容器代理将报告任何状态更改。状态更改可能包括从 `PENDING` 到 `RUNNING` 或从 `RUNNING` 到 `STOPPED` 的更改。

您可以使用 `DeregisterContainerInstance` API 操作和 `force` 标志（直接调用，或者通过 AWS 管理控制台或开发工具包调用）强制取消注册基础容器实例。  
注销容器实例将更改容器实例的状态以及 Amazon ECS 容器代理的连接状态。如果任务正在容器实例上运行，则必须设置 `force` 标志以允许取消注册。这将停止实例上的所有任务。

停止或终止基础容器实例。  
在停止或终止容器实例时，该实例上运行的任务会转换为 `STOPPED` 状态。

任务中的容器状态发生更改。  
Amazon ECS 容器代理监控任务中的容器状态。例如，如果在任务中运行的容器停止，则此容器状态更改将生成事件。

使用 Fargate Spot 容量提供程序的任务会收到终止通知。  
当任务正在使用 `FARGATE_SPOT` 容量提供程序并且由于 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 service event metadata](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 Service Action** 的服务操作事件。与容器实例和任务状态更改事件不同，服务操作事件在 `details` 响应字段中不包含版本号。以下是用于为 Amazon ECS 服务操作事件创建 EventBridge 规则的事件模式。有关更多信息，请参阅《Amazon EventBridge 用户指南》**中的 [Getting started with 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`, and `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)。另一个常见原因是 Amazon ECS 无法承担 IAM 角色所提供的任务。

`SERVICE_HEALTH_UNKNOWN`  
该服务无法描述任务的运行状况数据。

`SERVICE_DEPLOYMENT_FAILED`  
服务部署未达到稳定状态。当 CloudWatch 被触发或断路器检测到服务部署失败时，就会发生这种情况。

**Example 服务稳定状态事件**  
服务稳定状态事件以下面的形式传送。有关 EventBridge 参数更多信息，请参阅《Amazon EventBridge 用户指南》**中的 [Events in 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 用户指南》**中的 [Events in EventBridge](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-events.html)。  
在以下示例中，任务试图使用 `FARGATE_SPOT` 容量提供程序，但服务计划程序无法获取任何 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"
    }
}
```
在以下 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 service event metadata](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 报告的 `version` 资源版本与资源在 EventBridge 中报告的版本进行比较，以验证事件流中的版本是否为当前版本。版本属性数值更大的事件应视为在版本号更小的事件之后发生。

## 示例：在 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
        )
```