

# 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 ユーザーガイド*」の「[Getting started with Amazon EventBridge](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-get-started.html)」を参照してください。

Amazon ECS の Eventbridge イベントを使用して、Amazon ECS クラスターの現在の状態に関するほぼリアルタイムの通知を受け取ることができます。タスクで EC2 を使用している場合は、コンテナインスタンスと、それらのコンテナインスタンスで実行中のすべてのタスクの現在の状態の両方の状態を確認できます。タスクで Fargate を使用している場合、コンテナインスタンスの状態を確認できます。

Eventbridge を使用して Amazon ECS 上にカスタムスケジューラを構築し、クラスター間のタスクを調整するとともに、クラスターの状態をほぼリアルタイムにモニタリングできます。Amazon ECS サービス に対して Amazon ECS 状態の変更を絶え間なくポーリングするスケジューリングおよびモニタリングのコードをなくし、代わりに、Eventbridge ターゲットを使用して非同期的に状態の変更に対応できます。ターゲットには、AWS Lambda、Amazon Simple Queue Service、Amazon Simple Notification Service、Amazon Kinesis Data Streams

Amazon ECS イベントストリームは、イベントごとに少なくとも 1 回必ず送信されます。重複したイベントが送信された場合、イベントには重複を識別できるだけの十分な情報が備わっています。詳細については、「[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、メモリ、使用可能なポートなど) の変更に対応するため、コンテナインスタンス状態変更イベントがアカウントに生成されます。同様に、コンテナインスタンスが終了すると、コンテナインスタンス、コンテナエージェント接続ステータス、およびコンテナインスタンスで実行されている各タスクに対してイベントが生成されます。

コンテナ状態変更イベントとタスク状態変更イベントには 2 つの `version` フィールドがあります。1 つはイベントの本体で、もう 1 つはイベントの `detail` オブジェクトです。次に、これら 2 つのフィールドの違いについて説明します。
+ イベントの本文の `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 によって報告されるリソースのバージョンとそのリソースについて EventBridge で報告されるバージョン (`detail` オブジェクト内) を比較して、イベントストリームでのバージョンが最新であることを確認できます。

サービスアクションイベントには、本体の `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`、`RunTask`、`StopTask` API オペレーションを直接または AWS マネジメントコンソール や SDKs 経由で呼び出します。  
コンテナインスタンスでタスクを配置または停止すると、コンテナインスタンスの使用可能なリソース (CPU、メモリ、使用可能なポートなど) が変更されます。

Amazon ECS サービススケジューラがタスクを開始または停止する。  
コンテナインスタンスでタスクを配置または停止すると、コンテナインスタンスの使用可能なリソース (CPU、メモリ、使用可能なポートなど) が変更されます。

`SubmitTaskStateChange`Amazon ECSコンテナエージェントは、目的の`RUNNING`ステータスがタスクの`STOPPED`ステータスでAPIオペレーションを呼び出します。  
Amazon ECS コンテナエージェントは、コンテナインスタンスでタスクの状態をモニタリングし、状態に変更があるとレポートします。`RUNNING` であるべきタスクが `STOPPED` に変わると、エージェントは停止したタスクに割り当てられているリソース (CPU、メモリ、使用可能なポートなど) を解放します。

ユーザーが `DeregisterContainerInstance` API オペレーションを使用してコンテナインスタンスを直接または AWS マネジメントコンソール や SDKs 経由で登録解除します。  
コンテナインスタンスを登録解除すると、コンテナインスタンスのステータスと Amazon ECS コンテナエージェントの接続ステータスが変更されます。

EC2 インスタンスの停止に伴ってタスクが停止されました。  
コンテナインスタンスを停止すると、このコンテナインスタンスで実行されているタスクのステータスは `STOPPED` に変わります。

Amazon ECS コンテナエージェントがコンテナインスタンスを初めて登録します。  
Amazon ECS コンテナエージェントで初めてコンテナインスタンスを (起動時または手動による初回起動時に) 登録するときに、インスタンスの状態変更イベントが作成されます。

Amazon ECS コンテナエージェントが、Amazon ECS と接続または接続解除する。  
Amazon ECS コンテナエージェントが Amazon ECS バックエンドと接続または接続解除すると、コンテナインスタンスの `agentConnected` ステータスが変わります。  
Amazon ECS コンテナエージェントは、通常の操作の一環として、1 時間に数回切断して再接続するため、エージェントの接続イベントが予期されます。これらのイベントは、コンテナエージェントまたはコンテナインスタンスに問題があることを示すものではありません。

インスタンスの 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 サービスイベントメタデータ](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、SDKs 経由で呼び出します。  
タスクを開始または停止すると、新しいタスクリソースが作成されるか、既存のタスクリソースの状態が変更されます。

Amazon ECS サービススケジューラがタスクを開始または停止する。  
タスクを開始または停止すると、新しいタスクリソースが作成されるか、既存のタスクリソースの状態が変更されます。

Amazon ECS コンテナエージェントが `SubmitTaskStateChange` API オペレーションを呼び出す。  
EC2 では、Amazon ECS コンテナエージェントは、コンテナインスタンス上のタスクの状態をモニタリングします。Amazon ECS コンテナエージェントは、状態に変更があるとレポートします。状態の変更には、`PENDING` から `RUNNING` または `RUNNING` から `STOPPED` への変更が含まれます。

ユーザーが、`DeregisterContainerInstance` API オペレーションと `force` フラグを直接または AWS マネジメントコンソール や SDKs. 経由で使用して、基盤となるコンテナインスタンスの登録解除を強制します。  
コンテナインスタンスを登録解除すると、コンテナインスタンスのステータスと Amazon ECS コンテナエージェントの接続ステータスが変更されます。コンテナインスタンスでタスクが実行されている場合、登録解除を許可するには `force` フラグを設定する必要があります。これにより、インスタンスのすべてのタスクが停止します。

基盤となるコンテナインスタンスが停止または終了する。  
コンテナインスタンスを停止または終了すると、このコンテナインスタンスで実行されているタスクのステータスは `STOPPED` に変わります。

タスクのコンテナの状態が変わる。  
Amazon ECS コンテナエージェントは、タスク内のコンテナの状態をモニタリングします。例えば、タスク内で実行されているコンテナが停止すると、このコンテナの状態変更に伴ってイベントが生成されます。

Fargate Spot キャパシティープロバイダーを使用するタスクは、終了通知を受け取ります。  
タスクが `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 ユーザーガイド*」の「[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`、`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 のターゲットの 1 つに異常を検出しました。

## `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 またはメモリ容量が不足しているか、使用可能なコンテナインスタンスがない場合などです。もう 1 つの一般的な原因は、Amazon ECS コンテナエージェントがコンテナインスタンスで切断され、スケジューラがタスクを配置できない場合です。

`SERVICE_TASK_CONFIGURATION_FAILURE`  
設定エラーのため、サービススケジューラがタスクを配置できません。原因は、`reason` フィールドに説明されます。  
このサービスイベントが生成される一般的な原因は、タグがサービスに適用されてはいるが、ユーザーまたはロールがリージョンで新しい Amazon リソースネーム (ARN) 形式にオプトインしていないためです。詳細については、「[Amazon リソースネーム (ARN) と ID](ecs-account-settings.md#ecs-resource-ids)」を参照してください。もう 1 つの一般的な原因は、Amazon ECS が提供されたタスク IAM ロールを継承できなかったことです。

`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 ユーザーガイド*」の「[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 Deployment State Change** ] を使用してサービスデプロイ状態変更イベントを送信します。以下は、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 は、*少なくとも 1 回* の割合でイベントを送信します。つまり、あるイベントの複数のコピーを受け取る場合があるということです。さらに、イベントは発生順にイベントリスナーに送信されない場合があります。

イベントを適切に順序付けられるように、各イベントの `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 関数の例では、タスク状態変更イベントとコンテナインスタンス状態変更イベントの両方をキャプチャし、2 つの 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
        )
```