【ECS管理者必見】ECSサービスがCloudWatch Eventsに対応しサービスの状態変化検知が非常に簡単になりました!

2019.11.28

「ECSサービスのイベントをもっと手軽に取得したい」

そんなあなたにピッタリの新機能が発表されました!

Amazon ECS Service Events Now Available as CloudWatch Events

ECSサービスの各種イベントをCloudWatch Eventsで取得可能となったことで、従来より遥かにECSクラスタの状態変化へのアプリケーション実装が簡単になっております。ECSを本番ワークロードで運用している方必見の機能なので、ぜひご一読ください。

ECS運用管理簡単機能きたか…!!

  ( ゚д゚) ガタッ
  /   ヾ
__L| / ̄ ̄ ̄/_
  \/   /

ECSサービスがCloudWatch Eventsに対応してなにが良いのか?

AWSにはCloudWatch Eventsという非常に便利なサービスがあり、それを使うことでAWSの各サービスの状態変化をトリガーに次のアクションを柔軟に設定可能です。

今までも、ECSのタスクやそのインスタンスはCloudWatch Eventsに対応しており、タスクに紐づくインスタンスの状態変化をCloudWatch Eventsで拾うことが可能でした。対して、ECSのサービスがCloudWatch Events未対応であったため、ECSサービスの状態を定期的にAPI経由で確認する処理を自分で実装〜運用する必要がありました。

今回のアップデートでCloudWatch Eventsに対応したため、例えばECSサービスのサービスディスカバリーのスロットル状態をSNS通知する、といったことも簡単になっています。

CloudWatch Eventsで取得可能なECSサービスのイベント一覧

マニュアルはこちら。

従来なかった「Service Action Events」が増えており、その中にECSサービス関連のイベントが定義されています。個人的に注目しているのは、やはり「ERROR」関連で、CloudWatchメトリクスなどでも拾えなかった、ECSサービス自体のタスク置換エラーやサービスディスカバリーのスロットルなどもイベントとして拾うことが可能です。

イベントタイプは、INFOWARNERRORにわかれており、それぞれ状態変化で取得できる項目が設定されています。イベントトリガーを設定するとき、各種個別のイベントでも、任意のイベントタイプによる設定(例えば、ERRORのイベントを全てトリガーとする)も、可能となっています。

Service Action Events with INFO Event Type

  • SERVICE_STEADY_STATE
    • The service reaches a steady state. The service is healthy and at the desired number of tasks, thus reaching a steady state.
  • TASKSET_STEADY_STATE
    • The task set reaches a steady state. The task set is healthy and at the desired number of tasks, thus reaching a steady state.
  • SERVICE_DESIRED_COUNT_UPDATED
    • When the service scheduler updates the computed desired count for a service or task set. This event is not sent when the desired count is manually updated by a user.

Service Action Events with WARN Event Type

  • SERVICE_TASK_START_IMPAIRED
    • The service is unable to consistently start tasks successfully.
  • SERVICE_DISCOVERY_INSTANCE_UNHEALTHY
    • A service using service discovery contains an unhealthy task. The service scheduler detects that a task within a service registry is unhealthy.

Service Action Events with ERROR Event Type

  • SERVICE_DAEMON_PLACEMENT_CONSTRAINT_VIOLATED
    • A task in a service using the DAEMON service scheduler strategy no longer meets the placement constraint strategy for the service.
  • ECS_OPERATION_THROTTLED
    • The service scheduler has been throttled due to the Amazon ECS API throttle limits.
  • SERVICE_DISCOVERY_OPERATION_THROTTLED
    • The service scheduler has been throttled due to the AWS Cloud Map API throttle limits. This can occur on services configured to use service discovery.
  • SERVICE_TASK_PLACEMENT_FAILURE
    • The service scheduler is unable to place a task. The cause will be described in the reason field.
  • SERVICE_TASK_CONFIGURATION_FAILURE
    • The service scheduler is unable to place a task due to a configuration error. The cause will be described in the reason field.

実際に設定してみた

というわけで、実際にCloudWatch Eventsにイベントを設定してみます。Webコンソールで設定しようとしたところ、2019年11月28日時点では、詳細タイプに「ECS Service Action」が表示されていませんでした。しばらくすれば、このドロップダウンにも追加されると思います。

ので、実際の設定はJSONポリシーを直接編集します。以下の例では、ECSサービスの全てのイベントを対象にしています。

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

ターゲットにメール通知するSNSを設定し、CloudWatch Eventsを作成します。とりあえず、一つECSサービスを作成してみると、以下のイベントが通知されてきました。detailで、イベントタイプとイベント名を確認できています。よござんすね!

{
	"version": "0",
	"id": "02eaaa83-cda2-722a-7165-e4e50399b90d",
	"detail-type": "ECS Service Action",
	"source": "aws.ecs",
	"account": "629895769338",
	"time": "2019-11-27T21:28:48Z",
	"region": "ap-northeast-1",
	"resources": [
		"arn:aws:ecs:ap-northeast-1:629895769338:service/test-cluster/test-ecs-service-cwevents"
	],
	"detail": {
		"eventType": "INFO",
		"eventName": "SERVICE_STEADY_STATE",
		"clusterArn": "arn:aws:ecs:ap-northeast-1:629895769338:cluster/test-cluster",
		"createdAt": "2019-11-27T21:28:48.875Z"
	}
}

ECSでサービス運用されている方は必見のアップデート

今までは、ECSのサービス状態を把握するためには、状態を取得するAPIを定期的に実行するポーリング処理の実装や、Container Insightsなどで取得できるメトリクスに対してアラームを設定するなどの実装が必要でした。

今回のアップデートで、非常に簡単にECSサービスの状態変化に伴うイベントを取得できるようになっています。単純にERRORWARNが発生したときにそれを通知するだけでも異常に気づきやすくなると思いますし、オートスケーリング設定の状態でSERVICE_DESIRED_COUNT_UPDATEDイベントから各種連携サービスのスケールアップをLambdaで実装するなど、様々な利用方法が思いつくと思います。

また、タスクが起動した直後何らかのエラーでタスクが終了し、常にタスクが起動したり停止したりというのもECSではよくあるのですが、そういったシチュエーションもSERVICE_TASK_START_IMPAIREDで拾うことができます。

上で紹介した取得可能なイベントを眺めながら、今の運用をより簡単にする設定をぜひ見つけてみてください。

それでは、今日はこのへんで。濱田(@hamako9999)でした。