AWS ECSタスクの停止・起動の検知ノウハウ
目次
こんにちは、L小川です。
5月頃からシフォンケーキづくりを始めたのですが、10回目にしてようやく人様に出せそうなものが作れました。
前回の「ECS最適化AMIの更新を検知する運用ノウハウ」に続いて、今回もECS運用についてのトピックを紹介します。
今回は「AWS ECSタスクの停止・起動を検知する方法」についてです。
ECSはタスクが停止しても自動復旧されるため回復力の高いシステムですが、設定ミスやリソース不足が原因で、デプロイ時にタスクの停止と作成が繰り返される事態になることもあります。
システムの異変をいち早く検知できれば、調査・原因分析の初動を早めることができ、影響を最小限に抑えることができます。
アトラスでは、ECSタスクの停止・起動を検知し、Slackに通知しています。
通知フロー
EventBridgeでECSのタスク状態変更を検知し、Slack通知用のLambdaを起動します。
EventBridge
以下のEventBridgeルールでECSタスクの状態変化を検知できるようにし、ターゲットに通知用Lambdaを設定します。
1 2 3 4 5 6 7 |
{ "source": ["aws.ecs"], "detail-type": ["ECS Task State Change"], "detail": { "clusterArn": ["ECSクラスターARN", "ECSクラスターARN", "ECSクラスターARN"] } } |
Lambda
EventBridgeからのイベントから必要な情報を取得し、Slackに通知します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
STATUS_STOPPED = 'STOPPED' STATUS_DEACTIVATING = 'DEACTIVATING' STATUS_RUNNING = 'RUNNING' STATUS_PROVISIONING = 'PROVISIONING' def lambda_handler(event, context): try: detail = event['detail'] desired_status = detail['desiredStatus'] last_status = detail['lastStatus'] task_id = detail['taskArn'].split('/')[-1] task_name, task_rev = detail['taskDefinitionArn'].split('/')[-1].split(':') task_def_text = f'*{task_name}*\nタスクリビジョン : {task_rev}\n' task_status = '' if desired_status == STATUS_STOPPED: if last_status == STATUS_DEACTIVATING: task_status = '停止します。' elif last_status == STATUS_STOPPED: task_status = '停止しました。' elif desired_status == STATUS_RUNNING: if last_status == STATUS_PROVISIONING: task_status = '起動します。' elif last_status == STATUS_RUNNING: task_status = '起動しました。' else: return status = task_def_text + f'タスク {task_id}が' + task_status # Slack通知処理(省略) except Exception as e: raise(e) |
Slack通知(例)
ECSクラスターの数が多いようであれば、下図のようにサービスなどのグループごとにEventBridgeやSlackの通知先チャンネルを分けてもいいかもしれません。
終わりに
小さな工夫ですが、この通知があることで監視の対応スピードが上がり、システムの状態を把握できているという実感が得られています。
ECSを導入した次の一手として、ご参考にしていただけたら幸いです。
それではまた。