ENGINEER BLOG ENGINEER BLOG
  • 公開日
  • 最終更新日

EKS の障害対応を Step Functions + Bedrock で自動化してみた

この記事を共有する

目次

こんにちは、パーソル&サーバーワークスの高橋です。

今回は EKS で障害が発生した際に、検知→情報収集→AI 分析→通知→承認→対処までを自動で行うワークフローを構築してみました。構成と検証結果を共有します。


前提

本記事では構成と検証結果にフォーカスしており、CloudFormation テンプレートや Lambda のコードなど、構築手順の詳細については割愛しています。

「こういう仕組みが作れる」「実際に動かすとこうなる」というイメージを掴んでいただければ幸いです。


はじめに

EKS を運用していると、Pod 異常やノード障害が発生した際に以下の作業を人手で行う必要があります。

#作業内容
1調べるkubectl get pods, kubectl describe 等で状態確認
2推測するログ確認、過去事例の参照から原因を推測
3対処するPod restart, rollout restart 等を実行

この「1. 調べる」「2. 推測する」の部分を自動化できないかと考え、Step Functions + Bedrock (Claude) を使ったワークフローを構築しました。

対処(3)についても、人間の承認を挟んだ上で自動実行できる仕組みにしています。


今回作ったもの

CloudWatch Alarm をトリガーに、Step Functions が起動し、Lambda で EKS の情報を収集 → Bedrock (Claude) で原因分析 → SNS でメール通知 → 承認後に自動対処、という一連のフローです。

サービス役割
Amazon EKSコンテナ実行基盤(ノード 2台、Pod 複数)
Amazon CloudWatchメトリクス監視・アラーム
Amazon EventBridgeアラーム発火をトリガーに Step Functions を起動
AWS Step Functionsワークフロー全体のオーケストレーション
AWS Lambda情報収集・分析・通知・承認コールバック・対処の実行(5つ)
Amazon Bedrock (Claude Sonnet 4.6)AI による障害原因分析
Amazon SNSメール通知
Amazon API Gateway承認/却下のコールバック受け口

構成図

今回ハンズオンした全体構成図になります。

ekshandson.drawio.png


ワークフローの流れ

ステップ実行者内容
1EKSPod 異常が発生する
2CloudWatchAlarm が ALARM 状態に変化
3EventBridgeルールが発火し、Step Functions を起動
4Lambda①EKS に接続し、Pod/Node の状態を取得
5Lambda②収集した情報を Bedrock (Claude) に渡して原因を分析
6Lambda③分析結果 + 承認/却下リンク付きのメールを送信
7人間メールの承認リンクをクリック
8Lambda④承認コールバック受信 → Step Functions を再開
9Lambda⑤承認を受けて自動対処を実行(Pod restart 等)
10Lambda③対処結果をメールで通知

Step Functions のフロー設計

Step Functions で全体のフローを定義しています。Bedrock の分析結果に含まれる「重要度(severity)」に応じて分岐します。

重要度動作
critical通知のみ(自動対処は行わず、人間が手動で対応)
high / medium / low通知 → 承認待ち → 承認されたら自動対処を実行

承認待ちには waitForTaskToken を使っています。メール内のリンクをクリックするまで Step Functions が一時停止し、1時間以内に承認がなければタイムアウトで終了します。

エラーハンドリングも組み込んでおり、Lambda の実行失敗時はリトライ後に通知、承認が却下された場合は「却下されました」のメールを送信して終了します。

参考:Step Functions の概要

WF.png


検証

テスト環境

項目内容
リージョンap-northeast-1
EKS クラスターノード 2台 (t3.medium, マルチ AZ)
正常 Podnginx x3, httpd x2, worker x2(計 7 個)
エラー Pod5 パターンを投入

投入したエラー Pod

意図的に異常を起こす Pod を5種類用意しました。

Pod 名エラー種別内容
crash-loop-testCrashLoopBackOff起動直後にクラッシュし再起動を繰り返す
image-pull-error-testImagePullBackOff存在しないイメージを指定
oom-kill-testOOMKilledメモリ制限 32Mi に対し 200MB 確保しようとする
pending-testPending存在しないノードセレクタを指定
resource-hungry-deploymentPendingCPU 4コア要求でノード容量を超過

結果①: アラーム発火 → ワークフロー自動起動

CloudWatch Alarm が ALARM 状態になると、EventBridge 経由で Step Functions が自動起動しました。人間が何もしなくても、障害検知からワークフロー起動までが自動で行われます。

結果②: Bedrock (Claude) による障害分析

Lambda が EKS から Pod/Node の状態を収集し、Bedrock (Claude Sonnet 4.6) がリアルタイムで原因を分析しました。

項目分析結果
障害概要test-workloads 名前空間で複数の障害が同時発生。CrashLoopBackOff・ImagePullBackOff・リソース不足によるスケジューリング失敗が確認されている
推定原因4つの独立した原因が同時発生(コンテナ異常終了、OOM Kill、存在しないレジストリ参照、リソース要求過大)
重要度HIGH
推奨アクション10件の具体的な対処案(ログ確認、メモリ制限修正、イメージ名修正、リソース削減、スケールダウン等)

メールには分析結果に加えて「✅ 承認する」「❌ 却下する」のリンクが含まれています。

参考:メールは以下の文面になります。

メール①.png メール②.png メール③.png メール④.png

メールの要約:

セクション内容
AI 分析結果CrashLoopBackOff、ImagePullBackOff、OOMKilled、Pending が同時発生。4つの独立した原因を特定
推定原因①コンテナが起動直後に異常終了 ②OOM Kill によるメモリ超過 ③存在しないレジストリを参照 ④リソース要求がノード容量を超過
推奨アクション(10件)ログ確認、メモリ制限修正、イメージ名修正、リソース削減、スケールダウン、ResourceQuota 設定など
承認リンク✅ 対処を承認する(自動実行される) / ❌ 対処を却下する(手動対応)

参考:Step Functions の状態は「WaitForApproval」で承認・却下が押下されるのを待っている状態です。

通知が来ている途中.png

結果③: 承認フロー

メールの「✅ 承認する」リンクをクリックすると、ブラウザに承認完了画面が表示されました。

API Gateway → Lambda④ → Step Functions (SendTaskSuccess) の流れで、Step Functions が再開します。

承認.png

参考:承認を押下すると、Step Functions の状態が完了します。

StepFunctions実行後.png

結果④: 自動対処の実行

承認後、Lambda⑤ が実行され、対処結果がメールで通知されました。

今回は Bedrock が auto_executable: false(自動実行不可)と判断したため、実際の対処はスキップされました。これは安全設計として意図した動作です。

Lambda⑤ には以下の安全ガードを実装しています。

安全ガード内容
auto_executable チェックAI が「自動実行可能」と判断したものだけ実行
risk チェックrisk が high のアクションはスキップ
namespace チェックkube-system 等のシステム namespace は対象外
承認必須人間の承認なしでは絶対に実行されない

参考:以下のように完了通知が届きます。

完了通知①.png 完了通知②.png 完了通知③.png

完了通知メールの要約:

項目内容
対処アクション数10件
実行された0件
スキップされた10件
スキップ理由Bedrock が auto_executable: false と判断(設定ミスの根本修正は人間が行うべきと判断)

今回のエラーは「yaml の設定ミス」が原因のため、Pod restart では根本解決にならないと AI が正しく判断し、自動実行をスキップしています。人間がマニフェストを修正する必要があるケースです。

結果⑤: Step Functions の実行状態

Step Functions コンソールで各ステップの成功/失敗がビジュアルに確認できます。各ステップをクリックすると入出力の JSON も見られるので、デバッグがしやすいです。

入力詳細.png


自動化の範囲について

商用環境で「AI にどこまで任せるか」は慎重に判断する必要があります。今回の設計では以下の方針としました。

対象自動化レベル
情報収集 (kubectl 相当)完全自動
原因分析 (Bedrock)完全自動
通知完全自動
対処 (Pod restart 等)承認必須
critical な障害通知のみ(対処は人間が行う)

「情報収集と分析は自動、対処は人間が判断」という線引きにすることで、人間がやる作業の大部分(何が起きてるか調べる、原因を推測する)を自動化しつつ、安全性を担保しています。


まとめ

確認できたこと詳細
一連のフローの自動化検知→情報収集→AI 分析→通知→承認→対処まで自動で実行できた
AI による原因分析Bedrock (Claude) が原因の推定と対処案の提示を自動で行った
安全な承認フローwaitForTaskToken で人間の承認を挟むことで商用でも安全に運用できる
可視化Step Functions でフロー全体がビジュアル化され、状況が一目瞭然

「何が起きているか調べる」作業を AI に肩代わりさせる。これだけでも運用負荷はかなり下がると感じました。


この記事がどなたかの参考になれば幸いです。

この記事は私が書きました

高橋 憲太

記事一覧

パーソル&サーバーワークスの高橋です。 猫も犬も好きです。

高橋 憲太

この記事を共有する

クラウドのご相談

CONTACT

クラウド導入や運用でお悩みの方は、お気軽にご相談ください。
専門家がサポートします。

サービス資料ダウンロード

DOWNLOAD

ビジネスをクラウドで加速させる準備はできていますか?
今すぐサービス資料をダウンロードして、詳細をご確認ください。