概要

ECSのタスクが終了した際に、Slack通知したりイベントをログ保存したりしておきたいことがあります。

EventBridgeでイベントパターンを定義できるのですが、定期メンテナンスによるタスク置き換えとデプロイ時のスケールインも通知されてしまうのでそれらは除外したいです。

そういった場合のために特定の終了理由の場合は除外するルールを作成しました。

パターン

detail-typeをECS Task State Change とすることでECSタスクの終了を検知し、detailでmy-clusterのクラスタの変更のみ検知しています。 lastStatusSTOPPEDにしていますが、STOPPEDになるまでには数分かかるので、さらに早い段階でイベント発生したければDEACTIVATINGSTOPPEDまでいれると多少検知時間を早くできます。

Amazon ECS task lifecycle - Amazon Elastic Container Service

{
  "detail-type": [
    "ECS Task State Change"
  ],
  "detail": {
    "clusterArn": [
      "arn:aws:ecs:ap-northeast-1:000000000000:cluster/my-cluster"
    ],
    "lastStatus": [
      "STOPPED"
    ],
    "stoppedReason": [
      {
        "anything-but": {
          "wildcard": [
            "Scaling activity initiated by*",
            "*ECS is performing maintenance on the underlying infrastructure hosting the task*"
          ]
        }
      }
    ]
  }
}

stoppedReasonanything-butを複数定義してしまうと条件がORで繋がれるため思ったような挙動になりません。 「(Aでない)または(Bでない)」という条件は、それがAであれば(Bでない)、Bであれば(Aでない)が真になってしまうので結局全ての条件が真になってしまいます。

2023年10月以前はwildcardの条件がなかったので、prefixとsuffixの両方で除外したいようなときうまくパターンを作れなかったのですが、 wildcardで条件指定できるようになったことで「(AまたはB)でない」というように条件をまとめることができました。

参考