やること
ECSのタスクのスケジューリングを使用する場合、タスク起動の失敗を検知して通知されるようにしておく。
理由
タスクのスケジューリング機能を使用すると、設定した時間にタスクが新規に立ち上がり、プログラムを実行した後、タスクは終了する。
しかし、何らかの理由でタスクの起動に失敗し、プログラムを実行しないままタスクが終了することがある。このとき、タスクの起動に失敗したからといって自動でもう一度タスクの起動を試みるということはない。
プログラムの実行中にエラーが発生したら通知する仕組みを入れていても、そもそもプログラムが実行される前にタスクが終了するので検知することができない。
つまり、タスクのスケジューリングでバッチを実行していた場合、バッチがコケたことに気づくことができない状況が発生する。
実際、本番運用中のシステムにおいてタスクのスケジューリングでバッチを実行していたが、検証時にバッチで更新されるはずのデータが更新されていないことに気付き、調査してはじめてタスクの起動に失敗している(バッチがコケている)ことが分かった。
具体的な方法
CloudWatch Eventでタスク起動の失敗を検知して通知する。
WebコンソールでCloudWatch Eventsのルールの作成からルールを新規に作成していく。
イベントパターンを選択し、サービス名は「Elastic Container Service (ECS)」、イベントタイプは「すべてのイベント」にし、あとはイベントパターンのJSONを編集して下記の内容にする。
{
"source": [
"aws.ecs"
],
"detail-type": [
"ECS Service Action"
],
"detail": {
"eventType": [
"WARN",
"ERROR"
]
}
}
ターゲットに、システム運用のエンジニアメンバーに通知するSNSトピック等を設定してルールを作成する。
設定は以上。これで検知できるイベントやイベント発生時に配信される内容の形式は公式ページを参照。
Amazon ECS イベント サービスアクションイベント
以下は detail-type
が ECS Service Action
で、 detail-type
の eventType
が WARN
または ERROR
のイベントについての引用。
WARN イベントタイプのサービスアクションイベント
SERVICE_TASK_START_IMPAIRED
サービスは一貫してタスクを正常に起動することができません。SERVICE_DISCOVERY_INSTANCE_UNHEALTHY
サービス検出を使用するサービスに、異常なタスクが含まれています。サービススケジューラは、サービスレジストリ内のタスクが正常でないことを検出します。
ERROR イベントタイプのサービスアクションイベント
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」を参照してください。もう 1 つの一般的な原因は、Amazon ECS が IAM ロールが提供するタスクを継承できなかったことです。
記事投稿日:2020/4/7